首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-02-17 
8086汇编,debug下结果正确,运行时结果出错刚学8086汇编,写了一个求阶乘的幼稚程序,求10!并十进制输出。写的

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中也出现的非常多。

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

热点排行