2015-11-23 63 views
1

我是新來的彙編語言,我有一個問題。我正在嘗試使用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

請將您的代碼放在q問題,而不是圖像鏈接。 – rmunn

+0

你有沒有好友,對於代碼抱歉,我不知道爲什麼代碼是這樣發佈的 –

回答

2

有一個與你正在做的分裂的方式的問題。您試圖將8位值(Numero2)除以8位值(ALNumero1))。

需要注意的是,DIV指令將所有的AX除以8位(字節)操作數。您可以設置ALNumero1但你沒有確保該AH寄存器爲0如果不這樣做,你將AX可能有垃圾AH製作與您的除法運算工作錯號碼。

的指令集說由R/M8這大約DIV

無符號除法,AX,與存儲在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

+1

是的,男人,你真棒,它真的幫助我,你已經救了我的最後一個職位 –