21,458
社区成员
发帖
与我相关
我的任务
分享
DATA SEGMENT
NUM1 db 22h,12h,32h,45h;
NUM1L DB 4H;
NUM2 DB 45H,65H,78H,98H,78H,12H;
NUM2L DB 6H;
LMAX DB ?;
FLAG DB 0H;
SIGN DB 0H;
CUNT DB 0H;
X DW 0H;
Y DW 0H;
RADIX DW 16
TABLE DB '0123456789ABCDEF'
DATA ENDS;
STACK SEGMENT
DB 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK;
START:
MOV DX,DATA;
MOV DS,DX;
MOV AX,STACK;
MOV SS,AX;
XOR CX,CX;
;减法;判断两书的大小,交换大小数,并且用flag记录是否交换(以输出-号)
;
MOV SI,OFFSET NUM1;
MOV DI,OFFSET NUM2;
MOV AH,NUM1L;
MOV AL,NUM2L;
MOV BL,NUM1L;
MOV LMAX,BL;improer operand type
CMP AH,AL;通过字长比价两个数的大小;
JA L1; NUM1L>NUM2L时
JE L2; NUM1L==NUM2L时
JB L3; NUM1L<NUM2L时
L2: ;NUM1L==NUM2L 从高位开始循环比较判断大小
MOV CL,NUM1L;
LOOP1:
MOV BL,CL
MOV BH,[DI+BL];
CMP [SI+BL],BH;当两个数字字长相同时比较数的每一位
JA L1; ;NUM1>NUM2 跳转到L1直接计算
JE L5; ;循环比较
JB L2;
L5:
LOOP LOOP1;
L3: ;NUM1L<NUM2L 转化为大数减小数,更改flag添加符号位
MOV BL,NUM2L;
MOV LMAX,BL;
XCHG SI,DI;
XCHG AH,AL;
SUB AH,AL;
MOV FLAG,1H;
L1: ;NUM1L>NUM2L 直接相减
MOV CL,AL
MOV X,0;
MOV Y,0;
LOP3:
MOV BL,[DI+Y]
SBB [SI+X],BL;
INC X;
INC Y;
LOOP LOP3;
MOV CL,AH;
CMP CL,0;
JE L7;L7:输出 长度相同不需要对不同长度的字节部分处理
LOP4:
SUB [SI+X],0;
INC X;
LOOP LOP4;
L7: ;判断是否输出-号
CMP FLAG,1;
JNE L8;
MOV DL,'-';
MOV AH,2;
INT 21H;
L8:
MOV X,0;
MOV CX,0;
MOV CL,NUM1L;
LOP5: ;调用输出,循环输出每个字节内容
MOV BX,CX;
MOV CUNT,CL;
MOV DL,[SI+BX];
CALL PRINT;
MOV CL,CUNT;
LOOP LOP5;
NEXT:
MOV AH,4CH;
INT 21H;
;dx中的数据已16进制输出;
PRINT PROC
XOR CX, CX ;CX统计位数
MOV AX, DX
TRANS:
MOV DX, 0
DIV RADIX ;RADIX除数
PUSH DX ;余数入栈
INC CX
TEST AX,AX
JNZ TRANS
MOV AH,02H
OUTPUT:
POP BX ;余数出栈
MOV DL,BYTE PTR TABLE[BX]
INT 21H
LOOP OUTPUT
CODE ENDS;
END START;