此二进制输出代码无法正常工作 - 汇编语言

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

这里有一些提示可以帮助您上路。

  1. MOV COUNT,5 指令位于数据之间,因此可能是出现故障的原因。

  2. 每次使用 DIV N2 时都会除以 50,因为 N2 被定义为一个字符。最好还用 TWO db 2

  3. 定义数字 2
  4. 当你想比较除法余数时你已经通过宏调用破坏了AH寄存器CURSOR 39,22

  5. 第二次使用 DIV N2 AX 寄存器不再包含可用值,因为宏调用 DISP N0DISP N1 已将数字 09h 放入AH 寄存器。

  6. 要成功进行 4 个除法的级联,您必须保留每个先前除法的商,然后将其用作后续除法的被除数。请参阅下面的示例。

  7. 当您使用 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