微机原理汇编语言问题,哪位高手帮忙解决下?要求写出程序注释,并把源程序改为任意两个六位十进制相加。

CRLF MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT
DATA1 DB 33H,39H,31H,37H,34H
DATA2 DB 36H,35H,30H,38H,32H
DATA ENDS
STACK SEGMENT
STA DB 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV SI,OFFSET DATA2
MOV BX,05
CALL DISPL
CRLF
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL
CRLF
MOV DI,OFFSET DATA2
CALL ADDA
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL
CRLF
MOV AX,4C00H
INT 21H
DISPL PROC NEAR
DS1: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1: SUB BYTE PTR [SI+BX-1],30H
SUB BYTE PTR [DI+BX-1],30H
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL
AAA
MOV [SI],AL
INC SI
INC DI
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,05
AD3: ADD BYTE PTR [SI+BX-1],30H
ADD BYTE PTR [DI+BX-1],30H
DEC BX

JNZ AD3
RET
ADDA ENDP
CODE ENDS
END START
要求:
1. 读懂源程序,写出源程序注释。
2. 把源程序修改为任意两个六位十进制相加。并思考如果最高位有进位怎么办?

第1个回答  推荐于2018-04-20
;整个程序实现data1和data2的相加
CRLF MACRO;宏定义回车换行
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT;data1和data2为加数和被加数
DATA1 DB 33H,39H,31H,37H,34H
DATA2 DB 36H,35H,30H,38H,32H
DATA ENDS
STACK SEGMENT
STA DB 20 DUP(?)
TOP EQU LENGTH STA;把sta的长度给top
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
start: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV SI,OFFSET DATA2;把data2的偏移量给si
MOV BX,05;初始bx,输出五个字符
CALL DISPL;调用displ输出data2
CRLF;回车换行
MOV SI,OFFSET DATA1;把data1的偏移量给si
MOV BX,05;初始bx,输出五个字符
CALL DISPL;调用displ输出data1
CRLF;回车换行
MOV DI,OFFSET DATA2;把data2的偏移量给di
CALL ADDA;调用加法子程序,运算结果在data1中
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL;输出结果
CRLF
MOV AX,4C00H
INT 21H
DISPL PROC NEAR;显示【si+bx-1中的内容】
DS1: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1;循环5次
RET
DISPL ENDP
ADDA PROC NEAR;
MOV DX,SI;保存si
MOV BP,DI;保存di
MOV BX,05
AD1: SUB BYTE PTR [SI+BX-1],30H;把SI+BX-1字节中的asc||码还原成数字
SUB BYTE PTR [DI+BX-1],30H;把DI+BX-1字节中的asc||码还原成数字
DEC BX
JNZ AD1
MOV SI,DX;还原si
MOV DI,BP;还原si
MOV CX,05
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL;带进位加
AAA;调整al为非压缩的bcd码
MOV [SI],AL;保存结果
INC SI
INC DI
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,05
AD3: ADD BYTE PTR [SI+BX-1],30H;还原为asc||码
ADD BYTE PTR [DI+BX-1],30H;还原为asc||码
DEC BX

JNZ AD3
RET
ADDA ENDP
CODE ENDS
END START

修改后输六位的是下面的
;整个程序实现data1和data2的相加
CRLF MACRO;宏定义回车换行
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT;data1和data2为加数和被加数
DATA1 DB 6 dup(?)
DATA2 DB 6 dup(?)
data3 db ?
DATA ENDS
STACK SEGMENT
STA DB 20 DUP(?)
TOP EQU LENGTH STA;把sta的长度给top
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
start: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV SI,OFFSET DATA2;把data2的偏移量给si
CALL shuru
CRLF;回车换行
MOV SI,OFFSET DATA1;把data1的偏移量给si
call shuru
CRLF;回车换行
MOV DI,OFFSET DATA2;把data2的偏移量给di
CALL ADDA;调用加法子程序,运算结果在data1中
mov ah,data3
sahf
mov dl,30h
adc dl,0
cmp dl,30h
jz a
mov ah,02h
int 21h
a: MOV SI,OFFSET DATA1
MOV BX,06
CALL DISPL;输出结果
CRLF
MOV AX,4C00H
INT 21H
DISPL PROC NEAR;显示【si+bx-1中的内容】
DS1: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1;循环5次
RET
DISPL ENDP
ADDA PROC NEAR;
MOV DX,SI;保存si
MOV BP,DI;保存di
MOV BX,06
AD1: SUB BYTE PTR [SI+BX-1],30H;把SI+BX-1字节中的asc||码还原成数字
SUB BYTE PTR [DI+BX-1],30H;把DI+BX-1字节中的asc||码还原成数字
DEC BX
JNZ AD1
MOV SI,DX;还原si
MOV DI,BP;还原si
MOV CX,06
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL;带进位加
AAA;调整al为非压缩的bcd码
MOV [SI],AL;保存结果
INC SI
INC DI
LOOP AD2
lahf
mov data3,ah
MOV SI,DX
MOV DI,BP
MOV BX,06
AD3: ADD BYTE PTR [SI+BX-1],30H;还原为asc||码
ADD BYTE PTR [DI+BX-1],30H;还原为asc||码
DEC BX

JNZ AD3
RET
ADDA ENDP
shuru proc near
mov bx,6
sh1: mov ah,01h
int 21h
mov [si+bx-1],al
dec bx
cmp bx,0
jnz sh1
ret
shuru endp

CODE ENDS
END START本回答被提问者和网友采纳
相似回答