此二进制输出代码无法正常工作 - 汇编语言
This code for binary output does not work properly - Assembly language
在下面的代码中,我试图将一个值推送到跳转二进制,然后它将显示为二进制代码。出于某种原因,代码似乎只显示 1111 而不是正确划分并显示每个十进制数的相应二进制代码。有什么建议吗?
CURSOR MACRO Col, Row
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
ENDM
DISP MACRO MES
MOV AH,09
MOV DX,OFFSET MES
INT 21H
.DATA
.
.
.
N1 DB '1','$'
N2 DB '2','$'
N3 DB '3','$'
N4 DB '4','$'
N5 DB '5','$'
N6 DB '6','$'
N7 DB '7','$'
N8 DB '8','$'
N9 DB '9','$'
COUNT DB 0
.
.
.code
.
.
.
.
MOV COUNT,5
.
.
BINARY: MOV AL,COUNT; 22,39 38 37 36
CBW
DIV TWO
CURSOR 36,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
jmp x
ONE: DISP N1
x:
CBW
DIV TWO
CURSOR 35,22
CMP AH,0
JE ZERO1
JNE ONE1
ZERO1: DISP N0
jmp x1
ONE1: DISP N1
x1:
CBW
DIV TWO
CURSOR 34,22
CMP AH,0
JE ZERO2
JNE ONE2
ZERO2: DISP N0
jmp x2
ONE2: DISP N1
x2:
CBW
DIV TWO
CURSOR 33,22
CMP AH,0
JE ZERO3
JNE ONE3
ZERO3: DISP N0
jmp x3
ONE3: DISP N1
x3:
JMP L0
这里有一些提示可以帮助您上路。
MOV COUNT,5
指令位于数据之间,因此可能是出现故障的原因。
每次使用 DIV N2
时都会除以 50,因为 N2 被定义为一个字符。最好还用 TWO db 2
定义数字 2
当你想比较除法余数时你已经通过宏调用破坏了AH寄存器CURSOR 39,22
第二次使用 DIV N2
AX 寄存器不再包含可用值,因为宏调用 DISP N0
和 DISP N1
已将数字 09h 放入AH 寄存器。
要成功进行 4 个除法的级联,您必须保留每个先前除法的商,然后将其用作后续除法的被除数。请参阅下面的示例。
当您使用 DISP N0
显示“0”时,我认为您需要跳过指令 DISP N1
,因为现在您同时获得了“01”。
问题 3 和 4 的一个简单解决方案是在两个宏中至少保存 AX 寄存器。
CURSOR MACRO Col, Row
push ax
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
pop ax
ENDM
DISP MACRO MES
push ax
MOV AH,09
MOV DX,OFFSET MES
INT 21H
pop ax
ENDM
级联的解法(每次划分都要重复):
BINARY: MOV AL,COUNT; 22,39 38 37 36
CBW
DIV TWO
push ax ;Save the quotient in AL
CURSOR 39,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
jmp x
ONE: DISP N1
x: pop ax ;Restore the quotient in AL
cbw ;Extent before byte division
DIV TWO
CURSOR MACRO Col, Row
push ax
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
pop ax
ENDM
DISP MACRO MES
push ax
MOV AH,09
MOV DX,OFFSET MES
INT 21H
pop ax
ENDM
.DATA
.
.
.
N1 DB '1','$'
N2 DB '2','$'
N3 DB '3','$'
N4 DB '4','$'
N5 DB '5','$'
N6 DB '6','$'
N7 DB '7','$'
N8 DB '8','$'
N9 DB '9','$'
COUNT DB 0
TWO DB 2
STR1 DB 4 DUP('$')
.
.
.code
.
.
.
.
MOV COUNT,5
.
.
BINARY: MOV AL,COUNT; 22,39 38 37 36
CBW
DIV TWO
push ax ;Save the quotient in AL
CURSOR 36,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
jmp x
ONE: DISP N1
x: pop ax ;Restore the quotient in AL
CBW ;Extent before byte division
DIV TWO
push ax ;Save the quotient in AL
CURSOR 35,22
CMP AH,0
JE ZERO1
JNE ONE1
ZERO1: DISP N0
jmp x1
ONE1: DISP N1
x1: pop ax ;Restore the quotient in AL
CBW ;Extent before byte division
DIV TWO
push ax ;Save the quotient in AL
CURSOR 34,22
CMP AH,0
JE ZERO2
JNE ONE2
ZERO2: DISP N0
jmp x2
ONE2: DISP N1
x2: pop ax ;Restore the quotient in AL
CBW ;Extent before byte division
DIV TWO
push ax ;Save the quotient in AL
CURSOR 33,22
CMP AH,0
JE ZERO3
JNE ONE3
ZERO3: DISP N0
jmp x3
ONE3: DISP N1
x3: pop ax ;Restore the quotient in AL
JMP L0
在下面的代码中,我试图将一个值推送到跳转二进制,然后它将显示为二进制代码。出于某种原因,代码似乎只显示 1111 而不是正确划分并显示每个十进制数的相应二进制代码。有什么建议吗?
CURSOR MACRO Col, Row
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
ENDM
DISP MACRO MES
MOV AH,09
MOV DX,OFFSET MES
INT 21H
.DATA
.
.
.
N1 DB '1','$'
N2 DB '2','$'
N3 DB '3','$'
N4 DB '4','$'
N5 DB '5','$'
N6 DB '6','$'
N7 DB '7','$'
N8 DB '8','$'
N9 DB '9','$'
COUNT DB 0
.
.
.code
.
.
.
.
MOV COUNT,5
.
.
BINARY: MOV AL,COUNT; 22,39 38 37 36
CBW
DIV TWO
CURSOR 36,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
jmp x
ONE: DISP N1
x:
CBW
DIV TWO
CURSOR 35,22
CMP AH,0
JE ZERO1
JNE ONE1
ZERO1: DISP N0
jmp x1
ONE1: DISP N1
x1:
CBW
DIV TWO
CURSOR 34,22
CMP AH,0
JE ZERO2
JNE ONE2
ZERO2: DISP N0
jmp x2
ONE2: DISP N1
x2:
CBW
DIV TWO
CURSOR 33,22
CMP AH,0
JE ZERO3
JNE ONE3
ZERO3: DISP N0
jmp x3
ONE3: DISP N1
x3:
JMP L0
这里有一些提示可以帮助您上路。
MOV COUNT,5
指令位于数据之间,因此可能是出现故障的原因。每次使用
DIV N2
时都会除以 50,因为 N2 被定义为一个字符。最好还用TWO db 2
定义数字 2
当你想比较除法余数时你已经通过宏调用破坏了AH寄存器
CURSOR 39,22
第二次使用
DIV N2
AX 寄存器不再包含可用值,因为宏调用DISP N0
和DISP N1
已将数字 09h 放入AH 寄存器。要成功进行 4 个除法的级联,您必须保留每个先前除法的商,然后将其用作后续除法的被除数。请参阅下面的示例。
当您使用
DISP N0
显示“0”时,我认为您需要跳过指令DISP N1
,因为现在您同时获得了“01”。
问题 3 和 4 的一个简单解决方案是在两个宏中至少保存 AX 寄存器。
CURSOR MACRO Col, Row
push ax
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
pop ax
ENDM
DISP MACRO MES
push ax
MOV AH,09
MOV DX,OFFSET MES
INT 21H
pop ax
ENDM
级联的解法(每次划分都要重复):
BINARY: MOV AL,COUNT; 22,39 38 37 36
CBW
DIV TWO
push ax ;Save the quotient in AL
CURSOR 39,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
jmp x
ONE: DISP N1
x: pop ax ;Restore the quotient in AL
cbw ;Extent before byte division
DIV TWO
CURSOR MACRO Col, Row
push ax
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
pop ax
ENDM
DISP MACRO MES
push ax
MOV AH,09
MOV DX,OFFSET MES
INT 21H
pop ax
ENDM
.DATA
.
.
.
N1 DB '1','$'
N2 DB '2','$'
N3 DB '3','$'
N4 DB '4','$'
N5 DB '5','$'
N6 DB '6','$'
N7 DB '7','$'
N8 DB '8','$'
N9 DB '9','$'
COUNT DB 0
TWO DB 2
STR1 DB 4 DUP('$')
.
.
.code
.
.
.
.
MOV COUNT,5
.
.
BINARY: MOV AL,COUNT; 22,39 38 37 36
CBW
DIV TWO
push ax ;Save the quotient in AL
CURSOR 36,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
jmp x
ONE: DISP N1
x: pop ax ;Restore the quotient in AL
CBW ;Extent before byte division
DIV TWO
push ax ;Save the quotient in AL
CURSOR 35,22
CMP AH,0
JE ZERO1
JNE ONE1
ZERO1: DISP N0
jmp x1
ONE1: DISP N1
x1: pop ax ;Restore the quotient in AL
CBW ;Extent before byte division
DIV TWO
push ax ;Save the quotient in AL
CURSOR 34,22
CMP AH,0
JE ZERO2
JNE ONE2
ZERO2: DISP N0
jmp x2
ONE2: DISP N1
x2: pop ax ;Restore the quotient in AL
CBW ;Extent before byte division
DIV TWO
push ax ;Save the quotient in AL
CURSOR 33,22
CMP AH,0
JE ZERO3
JNE ONE3
ZERO3: DISP N0
jmp x3
ONE3: DISP N1
x3: pop ax ;Restore the quotient in AL
JMP L0