📄 7e21.asm
字号:
;设计多字节减法运算程序,要求程序能显示运算数据和结果数据(16进制).
;数据按逆序存放:先低位后高位
;多字节减法:9900664488H-885522H=?
;PUBLIC D1,D2,N1,N2
;EXTRN EX21:FAR
;EXTRN EX22:FAR
DATA SEGMENT PARA PUBLIC 'DATA'
D1 DB 88H,44H,66H,00H,99H
N1=$-D1
D2 DB 22H,55H,88H
N2=$-D2
D3 DB 20 DUP(?)
DATA ENDS
STACK SEGMENT
STA DW 100 DUP(?)
STACK ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,100
MOV SP,AX
MOV SI,OFFSET D1
ADD SI,N1-1 ;SI指向被减数的高位
MOV CX,N1 ;
CALL EX21 ;显示被减数
CALL PP2 ;换行
MOV SI,OFFSET D2
ADD SI,N2-1 ;SI指向减数的高位字节
MOV CX,N2
CALL EX21 ;显示被减数
CALL PP2
CALL EX22
LEA SI,D1
ADD SI,N1-1 ;SI指向被减数的高位
MOV CX,N1
CALL EX21
MOV AH,4CH
INT 21H
RET
;--------回车与换行------
PP2 PROC NEAR
PUSH DX
PUSH AX
MOV DL,0DH
MOV AH,2
MOV DL,0AH
INT 21H
pop DX
POP AX
RET
PP2 ENDP
;-------多字节减法----
EX22 PROC NEAR
LEA SI,D1 ;指向被减数
LEA DI,D2 ;指向减数
MOV BX,N1 ;送被减数长度
MOV CX,N2 ;减数字节数
MM: MOV AL,[DI]
SBB [SI],AL ;带借位减
INC DI ;指向下一个字节
INC SI
DEC BX
LOOP MM
M1: JZ M2 ;为零转M2
JNC M2 ;无进位转M2
SBB BYTE PTR [SI],0 ;否则,被减数减0
INC SI ;指向被减数下一个字节
DEC BX ;被减数总字节数减一
JMP M1
M2: RET
EX22 ENDP
;-----多字节数对16进指数的显示
;入口:SI指向要显示的数据,CX=显示的字节数
;出口:DI指向已转换好的ASCII数
EX21 PROC NEAR
PUSH AX
DO: MOV AL,[SI] ;取一个字节到AL
CALL EX2_16 ;调转换子程序
DEC SI ;指向下个数
LOOP DO
POP AX
RET
EX21 ENDP
;--------2 exchange 16-----
;将一个8位2进制数转换为2个16进指数ASCII码并显示
;入口:AL=数据
EX2_16 PROC NEAR
PUSH CX ;保护现场
PUSH BX
PUSH DX
G1: MOV BL,2 ;需转换2次
MOV BH, AL ;AL中的数暂存BH
MOV CL, 4 ;置移位位数
ROL AL, CL ;循环左移4位
G2: AND AL, 0FH ;得到低4位
CMP AL,10 ; BL <10?
JB S ; BL<10,转
ADD AL,07H ;大于10,加7
S: ADD AL,30H
;--------显示一个ASCII码 --------
MOV DL,AL ;送ASCII码
MOV AH,2
INT 21H ;显示一个ASCII码
MOV AL,BH
DEC BL
JNZ G2 ;2个数没转换完,继续
;恢复现场
POP DX
POP BX
POP CX
RET ;子程序返回
EX2_16 ENDP
MAIN ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -