私はアセンブリ言語に不慣れで、問題があります。操作の結果に応じていくつかのLEDをオンにするTASM(DOS)を使用して基本的なアセンブラプログラムを作成しようとしています。除算を除いて、私のすべての操作は機能します。除算を行うと、最初のLEDのみが点灯します。つまり、結果は2進数で1になります。最初の番号に4を入力し、2番目の番号に2を入力すると、結果は2になります。2番目のLEDは、最初の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の8ビット数(Numero1)を8ビット値(Numero2)で除算しようとしています。
注意しなければならないのは、DIV
命令がすべてのAXを8ビット(バイト)のオペランドで除算することです。あなたはセットALをするNumero1いますが、ことを確認していなかったAHレジスタは、あなたが分裂している、これをやっていないことにより、0であった。AXそうでジャンクを持っているAH間違った番号を使用して除算演算の作業を行うことを。
命令セットリファレンスは、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で除算したものになります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加