读书人

8086汇编debug下结果正确运行时结

发布时间: 2012-02-17 17:50:42 作者: rapoo

8086汇编,debug下结果正确,运行时结果出错
刚学8086汇编,写了一个求阶乘的幼稚程序,求10!并十进制输出。写的时候想把DX和AX组合成32位使用,以便能求超过10的阶乘。写完后发现结果不对,改成1!也不对,输出一大串数字。但奇怪的是在DEBUG下是没有问题的,用-G运行到最后也能得到正确结果3628800

请问为什么普通运行方式下不能正确输出




DATAS SEGMENT
DATAS ENDS

STACKS SEGMENT
DB 200 DUP(0)
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX

MOV CX,10;计算阶乘
MOV AX,1
MOV BX,1
NEXT:
MOV SI,AX;保存结果的低16位
MOV AX,DX;将高16位移入AX
MUL BX;高16位进行乘法运算
XCHG SI,AX;结果保存到SI,并将低16位换回
MUL BX;低16位进行乘法运算
ADD DX,SI;加回高16位乘法结果

INC BX
DEC CX
JNZ NEXT

MOV CX,0;分离数字
MOV BX,10
LOOP1:
MOV SI,AX;低16位保存至SI
MOV AX,DX;高16位移入AX
MOV DX,0;DX置0以免溢出
DIV BX;高16位除以10
XCHG SI,AX;低16位移回,并将高16位的商交换到SI
DIV BX;低16位与高16位的余数一起除以10
XCHG SI,DX;最终余数移到SI,原高16位的商移回

PUSH SI
INC CX
CMP AX,0
JNE LOOP1
CMP DX,0
JNE LOOP1

MOV AH,2 ;最终输出
LOOP2:
POP DX
ADD DL,30H
INT 21H
DEC CX
JNZ LOOP2

MOV AH,4CH
INT 21H
CODES ENDS
END START

[解决办法]
MOV CX,10 ;计算阶乘
MOV AX,1
MOV BX,1
mov dx,0

你用debug的时候,debug帮你把dx清0了,但是执行的时候却没这么幸运了!!!

这是典型的没有初始化变量的问题,在C中也出现的非常多。

这种问题比较难调试,所以你感到疑惑了。

读书人网 >汇编语言

热点推荐