1

我的 div 有点问题,我需要一些帮助来解决这个问题,我在 TASM 中有一个应用程序,我必须在一系列数字中找到 3 的倍数,问题是当我做一个 div 时程序冻结并且我不知道为什么。

我的代码是:

.model small
.stack 1000h
.data

msj1 db 13,10,'Tirame un numero: ','$'
msj2 db 13,10,'ES MULTIPLO DE 3 : ','$'
msj3 db 13,10,'NO ES MULTIPLO DE 3 : ','$'
var1 db ?
cont db 0

.code
.startup

call limpia
mov ah,09h
lea dx, msj1 ;desplegar numero 1:
int 21h

call leer ;lee primer numero
sub al,30h ;restar 30h para obtener el numero
mov var1,al ;lo guardo en var1
mov ah,09h

mov cl,al
mov cont,1

 ciclo:  
            ;push cont
            mov al ,cont
            mov bl,3
            div bl ;this is where the prog freezes , if you comment this line the prog runs

            cmp ah,'0'          
            je multiplo
            jne nomult   

            multiplo :
                mov ah,09h
                lea dx, msj2 ;desplegar numero 2:
                int 21h

                mov dl,cont ;mover al a dl para imprimir
                add dl,30h ;sumar 30 para obtener caracter
                mov ah,02h ;imprimir caracter
                int 21h
                inc cont

            nomult:
                mov ah,09h
                lea dx, msj3 ;desplegar numero 2:
                int 21h     

                mov dl,cont ;mover al a dl para imprimir
                add dl,30h ;sumar 30 para obtener caracter
                mov ah,02h ;imprimir caracter
                int 21h     
                inc cont    

loop ciclo
.exit

limpia proc near
mov ah,00h
mov al,03h
int 10h
ret
limpia endp

leer proc near
mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
ret
leer endp
end
4

2 回答 2

1

div bl正在划分ax,但您只加载al. 大概ah有剩余价值,所以div溢出。ax例如,尝试使用movzx ax, cont.

此外,学习结合指令集参考使用调试器。

于 2013-04-29T11:49:52.977 回答
1

当被除数为 8 位时,商将存储在AL. 因此,您需要确保商适合 8 位,否则您的程序将崩溃。

您可以通过在除法之前清除AH寄存器来实现此目的,例如使用以下方法之一。

CBW   ; only if AL is unsigned (00h..7Fh)

; or..

MOV AH,0

; or..

XOR AH,AH
于 2013-04-29T11:50:23.150 回答