除法产生错误的结果
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
我是汇编语言的新手,遇到了问题。我正在尝试使用 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