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

Converting decimal to binary using loop and displaying it - Assembly Language EMU 8086

在下面的代码中,我试图将计数值转换为二进制值,然后显示它。该代码似乎不起作用,只在应该显示 1 时显示 1,例如 1000 表示 8,但它为每个值显示一个。关于我应该更改或改进我的代码的任何建议?

我也尝试显示一个计数器,但在失败后放弃了,我使用 N1N2 等来显示数字,而不是使用循环,这会使我的代码缩短一个英里并改进它。请也给我一些建议:)

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

CODE 2 NOTE: 2点代表代码省略,如有不明白的地方请追问。请不要介意这些问题,我在编码方面仍然是一个业余爱好者,做最简单的事情也有困难。谢谢阅读 :) 这是为需要它的人提供的整个程序的代码:Full Code Here

代码 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

我测试了链接代码。问题是从数字 ("count") 转换为二进制 ("str1") 的算法。我做了三处更改,corruptdna 必须替换您代码中的下一个代码并且 运行 它:

1. 向变量"str1" 增加了一个字节以在末尾存储'$'并用int 21h 显示它,ah=9 :

STR1            DB      5 DUP('$')

2. 更改了算法以将数字 ("count") 转换为二进制 ("str1")。除法不是正确的方法,我右移了位,将每个提取的位转换为“0”或“1”并将这些字符存储在 "str1" 中:

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

3.最后显示"str1"(以'$'结尾):

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