Assembly 使用循环将十进制转换为二进制并显示-汇编语言EMU 8086

Assembly 使用循环将十进制转换为二进制并显示-汇编语言EMU 8086,assembly,binary,emulation,x86-16,Assembly,Binary,Emulation,X86 16,在下面的代码中,我试图将count中的值转换为二进制,然后显示它。该代码似乎不起作用,当它应该显示时仅显示1,例如,1000代表8,但相反,它为每个值显示一个。关于我应该改变什么或做什么来改进我的代码,有什么建议吗 我还试图显示一个计数器,但由于错误地失败而放弃了,我使用N1,N2等来显示数字,而不是使用一个循环,这将使我的代码缩短一英里并改进它。也请就此向我提供建议:) 假设我想从0或1开始计数器,我想显示的值,应该是ascii码还是十六进制?例如,我想显示数字5,然后是数字6。(示例将在第二

在下面的代码中,我试图将count中的值转换为二进制,然后显示它。该代码似乎不起作用,当它应该显示时仅显示1,例如,1000代表8,但相反,它为每个值显示一个。关于我应该改变什么或做什么来改进我的代码,有什么建议吗

我还试图显示一个计数器,但由于错误地失败而放弃了,我使用
N1
N2
等来显示数字,而不是使用一个循环,这将使我的代码缩短一英里并改进它。也请就此向我提供建议:)

假设我想从0或1开始计数器,我想显示的值,应该是ascii码还是十六进制?例如,我想显示数字5,然后是数字6。(示例将在第二个代码段中显示)。代码2行吗?为了让它工作,应该改变什么?是否应将ascii值放入
CX
?我应该改用内存变量吗

代码2注:2点表示代码省略,如果您不理解代码,请询问。请不要介意这些问题,我仍然是一个业余的编码和有困难做最简单的事情。感谢阅读:) 以下是整个计划的代码,供有需要的人使用:

代码1:

OUT1 MACRO COUNT ;new macro added, edit date 7th july
MOV CL,COUNT
MOV AL,CL            
MOV DX,0378H
OUT DX,AL 
ENDM

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
.
.
N0              DB      '0','$'
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('$') ; ADDED NEW
COL1            DB      36 ; ADDED NEW
.
.
.code
.
MOV COUNT,5
.
.
    BINARY: LEA SI,STR1
        PUSH CX
        MOV CL,4
BINL1:  MOV AL,COUNT
        CBW
        DIV TWO
        MOV BYTE PTR[SI],AH
        INC SI
        DEC CL
        JNZ BINL1
        POP CX
        JMP PRINTBINARY

PRINTBINARY:    MOV AH, BYTE PTR[SI]
                PUSH CX
                PUSH AX     
                MOV CL,4
PBIN1:          CURSOR COL1,22 ; 36,22 then 35,22 to 33,22
                CMP AH,0
                JE ZERO
                JNE ONE
ZERO:           DISP N0
                JMP X
ONE:            DISP N1
x:              DEC SI
                DEC CL
                JNZ PBIN1
                POP AX
                POP CX
                JMP L0
代码2:

mov cx,5
disp cx
inc cx
disp cx

我测试了链接代码。问题是从数字(“计数”)到二进制(“str1”)的转换算法。我做了三个更改,腐蚀DNA必须替换代码中的下一个代码并运行它:

1。向变量“str1”添加了一个字节,以在末尾存储“$”,并用int 21h显示它,ah=9:

STR1            DB      5 DUP('$')
2.将算法更改为从数字(“计数”)转换为二进制(“str1”)。除法不正确,我将位右移,将每个提取的位转换为“0”或“1”,并将这些字符存储在“str1”中:

3.最后,显示“str1”(以“$”结尾):


啊,我明白了,非常感谢你编辑了我的代码并指出了我的错误,我现在明白了转换比分割要好。我还意识到,由于我将在printbinary中显示一个字符串,所以我不需要每次移动循环来向后更改光标。再次感谢,将测试代码并回复:)代码工作完美,谢谢。我想声明,我将生成的二进制代码移动到字符串的原因是,我可以稍后使用它将该二进制代码发送到LED段,以便我可以显示相应的数字,再次感谢Jose:)我有一个问题要问你Jose。如果我想将字符串移动到内存或寄存器中,这样我就可以使用OUT函数将其发送到任何端口,这样可以吗?(添加到问题的末尾)您需要一个循环来逐个字符地将字符发送到端口。我明白了,如果我将每个字符逐个复制到另一个字符串,比如说str2,将str2中的值移动到例如CX,然后像这样使用out函数:out DX、CX(包含str2的CX和包含各自端口的DX),是否有效?否。您需要一个普通的循环,并将每个字符发送到端口。
BINARY: MOV SI,OFFSET STR1+3     ;POSITION OF THE LEAST SIGNIFICANT BIT (EXTREME RIGHT).
        PUSH CX
        MOV CL,4
        MOV AL,COUNT
BINL1:  
        SHR AL, 1                ;PUSH BITS TO THE RIGHT. BIT 0 IN CARRY FLAG.
        JC  BIT_1                ;IF ( CARRY FLAG == 1 ) JUMP TO BIT_1.
        MOV [ BYTE PTR SI ], '0' ;IF NO JUMP, BIT IS ZERO.
        JMP NEXT_BIT             ;SKIP "BIT_1".
BIT_1:  MOV [ BYTE PTR SI ], '1'        
NEXT_BIT:                    
        DEC SI                   ;NEXT BIT POSITION IS TO THE LEFT.
        DEC CL
        JNZ BINL1
        POP CX
        JMP PRINTBINARY
PRINTBINARY:    CURSOR 36,22 ; 36,22 then 35,22 to 33,22
                MOV AH, 9              ;SERVICE TO DISPLAY STRING '$' ENDED.
                MOV DX, OFFSET STR1    ;STRING TO DISPLAY ('$' ENDED).
                INT 21H
                JMP L0