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

2024-11-28 09:32:06
推荐回答(1个)
回答(1):

;整个程序实现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