【问题标题】:Converting decimal to binary using loop and displaying it - Assembly Language EMU 8086使用循环将十进制转换为二进制并显示 - 汇编语言 EMU 8086
【发布时间】:2015-09-15 08:26:04
【问题描述】:

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

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

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

CODE 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

【问题讨论】:

    标签: assembly binary emulation x86-16


    【解决方案1】:

    我测试了链接代码。问题是从数字(“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
    

    【讨论】:

    • 啊,我明白了,非常感谢您编辑我的代码并指出我的错误,我现在看到转移比分割更好。还意识到,由于我将在 printbinary 中显示一个字符串,所以我不需要有一个循环来移动以每次向后更改光标。再次感谢,将测试代码并回复:) 代码完美无缺,谢谢。我想说明我将生成的二进制代码移动到字符串的原因是这样我以后可以使用它将二进制发送到 LED 段,以便我可以显示相应的数字,再次感谢 Jose :)
    • 问你一个问题。如果我想将字符串移动到内存或寄存器,以便我可以使用 OUT 函数将其发送到任何端口,这可行吗? (添加到问题末尾)
    • 你需要一个循环来逐个字符地发送到端口。
    • 我明白了,如果我将每个字符一个字符一个字符地复制到另一个字符串,比如说 str2,将 str2 中的值移动到例如 CX,然后像这样使用 out 函数,它会起作用:OUT DX ,CX(CX 包含 str2,DX 包含各自的端口)?
    • 不。您需要一个正常的循环并将每个单独的字符发送到端口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2021-12-10
    • 2019-05-16
    相关资源
    最近更新 更多