多字节减法问题:出现了死循环输出,调试中发现mov cx,0 没有将cx清零。

朔北冥 2016-05-29 09:54:18
大致思路:通过多字节比较两个数的大小,根据比较结果交换两个数(实现大数减小数的效果)并且判断是否要生成“-”号。
代码:
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;
...全文
428 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_23107797 2016-05-30
  • 打赏
  • 举报
回复
要这样问是因为大样的储存方式决定了编写的方法 比如两个字串以文字方式储存 A db ‘1234567890’ B db ‘987654321’ A-B是以字符减法做 又若两个大数以bcd方式储存,fpu的bcd运算就是这様做的 A数是1234567890,会存放成 A db 90h,78h,56h,34h,12h B数是 987654321,会存放成 A db 21h,43h,65h,87h,09h A-B是以BCD减法做 而看你的资料似乎是BCD方式储存 但一堆代码也看不出bcd运算的影子 连最基于的BCD减法DAS调整也没有
朔北冥 2016-05-30
  • 打赏
  • 举报
回复
引用 3 楼 baidu_23107797的回复:
大数相减,是哪两个大数相减,资料是题目定义还是你自己设定?
是我自己定义的两个数,不是题目给的。 能说下程序有什么问题么,我调试时显示有几次数据格式不匹配。
zara 2016-05-30
  • 打赏
  • 举报
回复
第一个应该通不过,后面的可以(后来版本的 masm 可能需要加上 byte ptr 的修饰。
baidu_23107797 2016-05-29
  • 打赏
  • 举报
回复
大数相减,是哪两个大数相减,资料是题目定义还是你自己设定?
朔北冥 2016-05-29
  • 打赏
  • 举报
回复
可以通过编译,逻辑上有什么问题?
baidu_23107797 2016-05-29
  • 打赏
  • 举报
回复
MOV BH,[DI+BL] MOV BL,[DI+Y] SBB [SI+X],BL SUB [SI+X],0 先不论逻辑对不对,你这几条代码可以通过编译器?

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧