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

时间:2015-06-29 00:12:42

标签: assembly binary emulation x86-16

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

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

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

代码2注意: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

1 个答案:

答案 0 :(得分:1)

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

1。在变量" str1"中添加了一个字节。存储' $'最后用int 21h显示它,啊= 9:

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

2. 更改算法以将数字(" count")转换为二进制(" str1")。划分不是正确的方法,我右移位,将每个提取的位转换为' 0'或者' 1'并将这些字符存储在" 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

3。最后,显示" str1" (结束于' $'):

{{1}}
相关问题