除法产生错误的结果

Division produces wrong result

我是汇编语言的新手,遇到了问题。我正在尝试使用 TASM(DOS) 制作一个基本的汇编程序,它根据操作的结果打开一些 LED。我所有的操作都有效,除法除外。当我做除法时,只有第一个 LED 亮起,这意味着结果是二进制的 1。如果我为第一个数字输入 4,为第二个数字输入 2,结果应该是 2。第二个 LED 应该亮起,而不是第一个。为什么我的部门工作不正常?

这是代码:

.model small
.stack 64
.data

Numero1 db 0                
Numero2 db 0                
VariableEspecial db 0       


Mensaje1 db 10,13, "Introduce la primera cifra: -> ", '$'
Mensaje2 db 10,13, "Introduce la segunda cifra: -> ", '$'

Mensaje4 db 10,13, "Otra operacion.. 1 - Si, 2 - No, -> ", '$'
Mensaje7 db 10,13, "Escoge operacion: 1 - Suma, 2 - Resta, 3 - Multiplicacion, 4 - Division, -> ", '$'

.code               
begin proc far

mov ax, @data          
mov ds, ax

Inicio:

    mov ah, 09              
    lea dx, Mensaje1        
    int 21h

    mov ah, 01              
    int 21h

    sub al, 30h             
    mov Numero1, al         

    mov ah, 09              
    lea dx, Mensaje2        
    int 21h

    mov ah, 01              
    int 21h                 

    sub al, 30h             
    mov Numero2, al         

    mov ah, 09              
    lea dx, Mensaje7        
    int 21h

    mov ah, 01              
    int 21h

    cmp al, 31h             
    je Suma

    cmp al, 32h             
    je Resta

    cmp al, 33h             
    je Multiplicacion

    cmp al, 34h             
    je Division

Suma:                       
    mov al, Numero1         
    add al, Numero2         

    jmp Leds                

Resta:                      
    mov al, Numero1         
    sub al, Numero2         

    jmp Leds                

; ------------------------      
    Inicio2:                    
    jmp Inicio                  
; ------------------------

Multiplicacion:             
    mov al, Numero1         
    mul Numero2             

    jmp Leds                

Division:                   
    mov al, Numero1         
    div Numero2             

    jmp Leds                

Leds:                       
    add al, 30h             


    cmp al, 31h     
    je UnLed                

    cmp al, 32h             
    je DosLed               

    cmp al, 33h             
    je TresLed              

    cmp al, 34h             
    je CuatroLed            

    cmp al, 35h             
    je CincoLed             

    cmp al, 36h             
    je SeisLed              

    cmp al, 37h             
    je SieteLed             

    cmp al, 38h             
    je OchoLed              

    cmp al, 39h             
    je NueveLed             

    ;-----------------                      
    Inicio3:                                
    jmp Inicio2                             
    ;-----------------

UnLed:                      
    mov dx, 0378H           
    mov al, 00000001b       
    out dx, al              

    jmp FinalizarOperacion  

DosLed:                     
    mov dx, 0378H           
    mov al, 00000010b       
    out dx, al              

    jmp FinalizarOperacion  

TresLed:                    
    mov dx, 0378H           
    mov al, 00000011b       
    out dx, al              

    jmp FinalizarOperacion  

CuatroLed:                  
    mov dx, 0378H           
    mov al, 00000100b       
    out dx, al              

    jmp FinalizarOperacion  

CincoLed:                   
    mov dx, 0378H           
    mov al, 00000101b       
    out dx, al              

    jmp FinalizarOperacion  

SeisLed:                    
    mov dx, 0378H           
    mov al, 00000110b       
    Out dx, al              

    jmp FinalizarOperacion  

SieteLed:                   
    mov dx, 0378H           
    mov al, 00000111b       
    out dx, al              

    jmp FinalizarOperacion  

OchoLed:                    
    mov dx, 0378H           
    mov al, 00001000b       
    out dx, al              

    jmp FinalizarOperacion  

NueveLed:                   
    mov dx, 0378H           
    mov al, 00001001b
    out dx, al

    jmp FinalizarOperacion  

FinalizarOperacion:         

    mov ah, 09              
    lea dx, Mensaje4        
    int 21h
    mov ah, 01              
    int 21h

    cmp al, 31h             
    mov dx, 0378H           
    mov al, 00000000b       
    out dx, al              

    je Inicio3              

    cmp al, 32h             
    mov dx, 0378H           
    mov al, 00000000b       
    out dx, al              

    je Cerrar               

Cerrar: 
    mov ah, 4ch             
    int 21h                 

    begin endp              
    end

你做除法的方式有问题。您正在尝试将 AL(Numero1) 中的 8 位数字除以一个 8 位值 (Numero2).

你必须小心的是DIV指令将所有AX除以8位(字节)操作数。您将 AL 设置为 Numero1 但您没有确保 AH 寄存器为 0。通过不这样做你正在划分 AX 这可能在 AH 中有垃圾使你的除法运算使用错误的数字。

指令集参考是这样说的 DIV

Unsigned divide AX by r/m8, with result stored in AL = Quotient, AH = Remainder.

您需要明确地将 AH 设置为 0。您可以使用 mov ah, 0 或使用首选的替代方法 xor ah, ah 来做到这一点。两者都将 AH 设置为零。

您的部门代码如下所示:

Division:                   
    mov al, Numero1         
    div Numero2             
    jmp Leds

它应该看起来像:

Division:
    xor ah, ah                   
    mov al, Numero1         
    div Numero2             
    jmp Leds  

这确保除法是 00000000:AL(Numero1) 除以 Numero2