2015-11-23 64 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

是的,男人,你真棒,它真的帮助我,你已经救了我的最后一个职位 –