我是汇编语言的新手,但我遇到了问题。我正在尝试使用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,因为AX中可能有垃圾,使除法运算使用错误的数字。

指令集参考说明有关DIV


将无符号AX除以r / m8,结果存储在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

10-06 13:14