回 帖 发 新 帖 刷新版面

主题:[讨论]Divide Error!!!!请大家帮一下我!

小弟刚学汇编,我想放一个数进ax里,然后将其输出用的方法是除以10取余,将余数逆着打印.编译,链接都没问题,运行出现"Divide Error"
DATAS SEGMENT
    pushcount dw ?  
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,29    ;初始化一个值
    call binidec ;调用过程将二进制数打印出来
    MOV AH,4CH
    INT 21H
binidec proc near
         mov pushcount,0
         mov bx,10
loop1:   idiv bx
         push dx
         inc pushcount
         cmp ax,0
         jne loop1
print:   pop dx
         mov ax,dx
         add ax,30h
         mov dx,ax
         mov ah,2
         int 21h
         dec pushcount
         jnz print
binidec endp
CODES ENDS
    END START

回复列表 (共2个回复)

沙发

DATAS SEGMENT
    pushcount dw 0
DATAS ENDS

STACKS SEGMENT stack
    dw 10 dup(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,29    ;初始化一个值
    call binidec ;调用过程将余数打印出来
    MOV AH,4CH
    INT 21H
binidec proc near
         mov bx,10
loop1:   cwd
         idiv bx
         push dx
         inc pushcount
         cmp ax,0
         jne loop1
print:   pop dx
         add dx,30h
         mov ah,2
         int 21h
         dec pushcount
         jnz print
binidec endp
CODES ENDS
    END START

问题1:堆栈段定义有问题,汇编时提示无堆栈段,现在该正了;
问题2:在LOOP1标号后面应该有CWD指令,保证除法运算时DX作为被除数的高16位有正确的值,否则DX中是上次除法的余数,导致本次除法商太大而溢出(OVERFLOW);
问题3:现在能正确运行,结果无误,但只限于对正数的处理。

板凳

太感谢了,由于初学好多不懂,又学到点东西.

我来回复

您尚未登录,请登录后再回复。点此登录或注册