分部产生错误的结果

时间:2015-11-23 03:11:59

标签: assembly dos tasm 16-bit

我是汇编语言的新手,我遇到了问题。我试图用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

1 个答案:

答案 0 :(得分:2)

你的分工方式存在问题。您试图将 AL Numero1 )中的8位数除以8位值( Numero2 )。

您必须注意的是DIV指令将所有 AX 除以8位(字节)操作数。您将 AL 设置为 Numero1 ,但您没有确保 AH 寄存器为0.如果不这样做,则分割< em> AX 可能在 AH 中有垃圾,使您的除法操作使用错误的数字。

指令集参考说明DIV

  

无符号除以AX / r8,结果存储在AL =商数,AH =剩余。

在您的情况下,您需要将 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