当前位置: 代码迷 >> 汇编语言 >> 8086汇编,debug下结果正确,运行时结果出错解决思路
  详细解决方案

8086汇编,debug下结果正确,运行时结果出错解决思路

热度:2427   发布时间:2013-02-26 00:00:00.0
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中也出现的非常多。

这种问题比较难调试,所以你感到疑惑了。
  相关解决方案