汇编程序例题及讲解(汇编程序)

本文目录
汇编程序
(1)BEGIN: IN AL,5FH ;从5F端口读取一个8位二进制数据放入AL中
TEST AL,80 ;比较AL最高位是否是1
JZ NEGATIVE ;如果不是1就跳转到NETATIVE,让AH最高位都置1
MOV AH,0 ;如果是AL最高位为1说明AL是负数,AH=0
JMP STOP ;跳转到STOP
NEGaTIVE:MOV Ah,0FFH ;AH都为1
STOP: HLT ;HLT使CPU静止,进入不读取指令,不写数据状态
(2)STRAT: IN AL,20H ;从20端口读取数据放入AL
MOV BL,AL ;将AL保存到BL
IN AL,30H ;从30端口读取数据
MOV CL,AL ;将AL数据保存到CL,作为循环的次数
MOV AX,0 ;AX清零
REPEAT:ADD AL,BL ;这里开始将BL和AL相加,实际在循环中就是累加
ADC AH,0 ;得到进位
DEC CL ;CL递减
JNZ REPEAT ;如果CL为0就退出循环,非零则循环,实现累加
HLT ;(同上个程序)
把下面 简单 汇编程序 加上详细注释
program segment
main proc far
assume cs:program
start:push ds ;这三条指令是为了能正确返回操作系统
sub ax,ax
push ax
input:mov ah,01 ;调用中断从键盘输入一个字符,字符的ASCII码在AL中
;mov ah,07
int 21h
cmp al,’q’ ;比较输入的字符是否为’q’,是则跳到标号quit
je quit
mov dl,al
mov ah,02 ;如果不是’q’则调用中断输出到屏幕
int 21h
jmp input ;跳到标号input继续输入字符
quit:ret ;退出程序
main endp
program ends
end start
2.输出十六进制1EC8
data_seg segment
DATAX dw 1CE8H
data_seg ends
code_seg segment
main proc far
assume cs:code_seg,ds:data_seg
start:
push ds ;这三条指令是为了能正确返回操作系统
sbb ax,ax
push ax
mov ax,data_seg ;将数据段的段地址放入DS中
mov ds,ax
mov bx,DATAX ;将变量DATAX中的数放入BX中
mov ch,4
rotate:
mov cl,4 ;CL中的数是为了使用移位指令,大小为移的位数
rol bx,cl;将BX中的数循环左移4位,即相当于把BX中高4位放在了低4位,移后
;的结果相当于CE81H(第一次)
mov al,bl;此时AL中为81H(第一次)
and al,0fh;将AL中的高4位清零即变成01H(第一次)
add al,30h;将AL加上30H得到数字的ASCII码
cmp al,3ah;比较AL中是否是数字,不是说明是字母A...F
jl print_it;是则跳到print_it直接输出
add al,7h;将AL再加7得到相应字母的ASCII码
print_it:
mov dl,al ;将数字输出到屏幕
mov ah,02h
int 21h
dec ch;循环次数减1
jnz rotate;若循环没结束则跳到totate继续执行
mov ah,07;等待输入,程序暂停
int 21h
ret ;程序结束
main endp
code_seg ends
end start
3.求1加2的和
data_seg segment
a db ?
b db ?
data_seg ends
code_seg segment
main proc far
assume cs:code_seg,ds:data_seg
start:push ds ;作用同以上程序
sub ax,ax
push ax
mov ax,data_seg
mov ds,ax
mov a,1 ;分别将变量a,b赋值1,2
mov b,2
mov al,a;将a的值放入AL中
add al,b;将AL中的值 与b相加,结果放在AL中
mov dl,al;相加结果放入DL中以便用中断输出
add dl,30h;得到数字的ASCII码
;or dl,30h
mov ah,2
int 21h;输出到屏幕
mov ah,07;程序暂停,等待按键,然后结束
int 21h
ret
main endp
code_seg ends
end start
简单的汇编语言程序解析
data segment ;定义数据段
string1 db ’Move the cursor backward’ ;比较字符串1
string2 db ’Move the cursor backward’ ;比较字符串2
mess1 db ’Match.’,13,10,’$’ ;比较结果1
mess2 db ’No Match!’,13,10,’$’ ;比较结果2
data ends ;数据段结束
code segment ;定义代码段
main proc far ;定义一个过程(类似C的函数)
assume cs:code,ds:data,es:data ;设定各段与段寄存器关联
start: ;程序入口处(类似C的main函数)
push ds ;压入ds
sub ax,ax ;ax = 0
push ax ;压入ax
mov ax,data ;ax = 数据段基址
mov ds,ax ; ds = ax
mov es,ax ;ds = ax
lea si,string1 ;si = string1的偏移地址
lea di,string2 ;di = string2的偏移地址
cld ;DF=0
mov cx,25 ;比较次数
repz cmpsb ;比较指令
jz match ;如果相同ZF=1
lea dx,mess2 ;dx = mess2 的偏移地址
jmp short disp ;跳到disp
match:
lea dx,mess1 ; dx = mess1 的偏移地址
disp:
mov ah,9 ;9号中断,显示一个一’$’结尾的字符串
int 21h
ret ;返回
main endp
code ends ;代码段结束
end start ;程序结束
另注:
MASM汇编程序设计的基本框架是:
data segment
;数据
data ends
stack segment
;堆栈
stack ends
code segment
assume cs:code,ds:data
start:
;代码
end start
汇编程序题目,求详解
嘿嘿 没人给你解答 俺来帮你做吧
解题分析如下:
1 START:MOV AX,01H
MOV BX,02H
MOV CX,02H
MOV DX,02H
为循环开始即初始化阶段 是4条传送指令 传送到结果是:
AX=01H BX=02H CX=02H DX=02H
其中CX为下一步循环的循环计数器 CX=02H 即表示要循环2次
2 第一次循环 执行一次下面的程序段
NXET: INC AX ;加1指令 AX=01H+1=02H
ADD BX,AX ;加法指令 BX=BX+AX=02H+02H=04H
SHR DX,1 ;算术右移指令 最高位补0 结果为DX=01H
LOOP NEXT ;循环次数减1 CX=02H-1=01H
第二次循环 再执行一次下面的程序段
NXET: INC AX ;加1指令 AX=02H+1=03H
ADD BX,AX ;加法指令 BX=BX+AX=04H+03H=07H
SHR DX,1 ;算术右移指令 最高位补0 结果为DX=00H
LOOP NEXT ;循环次数减1 CX=01H-1=00H
可知结果:
AX=03H BX=07H DX=00H CX=00H
呵呵 做完也没加分呀 满意后 就选择满意回答吧
汇编语言题目,求详解
MOV DI,OFFSET BUFF 取数组BUFF的首地址到DI寄存器中
MOV CX,000AH 设定循环次数
MOV BL,0 做计数器用,用来记录数组BUFF中为0的字节的个数,赋初值为0
GOON:MOV AL,byte ptr 将数组的BUFF的一个字节的数据放进AL寄存器中
AND AL,AL AL中的数据与AL中的数据做与运算,用来作为下一条跳转指令的跳转条件
JNZ NEXT 上一条指令运算不为0就跳转到标号NEXT处
INC BL 若 and al,al 这条指令的运算结果为0,bl寄存器就加1
NEXT:INC DI dl加1,dl最开始是数组BUFF的首地址,加1相当于指向下一个字节
LOOP GOON CX先减1,判断CX是否为0,若为0就跳出循环,不为0就循环,循环从标号GOON处开始
HLT 停机
BUFF DB 23H,54H,00H,83H,98H,36H,00H,49H,00H,73H
这段汇编代码的作用是判断单元大小为一字节的数组BUFF中有多少个字节为0,并将结果保存在BL寄存器中
汇编程序题,请高手解答一下
LEA SI, NUM1 ;算出NUM1的有效地址(SI指向NUM1第一个元素)
LEA DI, NUM2 ;算出NUM2的有效地址(DI指向NUM2第一个元素)
LEA BX, SUM ;算出SUM的有效地址(BX指向SUM第一个单元)
MOV CX, 4 ;将CX置4,即循环次数
AG: MOV AL, ;AG标记。取SI地址的内容(NUM1中的数)送到AL
ADD AL, ;将DI地址的内容(NUM2中的数)加到AL
MOV , AL ;将AL(两个数的和)放到以BX为地址的单元(即SUM,完成相加的操作)
INC SI ;SI指向NUM1下一个元素
INC DI ;DI指向NUM2下一个元素
INC BX ;BX指向SUM下一个单元
DEC CX ;CX--
JNZ AG ;CX如果不为0(没有循环到4次),跳到AG,否则继续执行,即结束程序

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30



