刚学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中也出现的非常多。
这种问题比较难调试,所以你感到疑惑了。