Emu8086 存储 8 位数字问题

Emu8086 storing 8-bit number issue

提问人:Root 提问时间:11/12/2023 最后编辑:Sep RolandRoot 更新时间:11/13/2023 访问量:55

问:

在这个问题中,我问为什么我的代码不起作用,我认为问题只是当程序试图打印出 ASCII 字符时,但从那时起我意识到还有另一个问题。

任务是接受 8 个字符 1 和 0,然后将结果保存在寄存器中。

我的算法如下:

这是我的代码中应该这样做的部分:

    mov cx,0
    mov bl,8
input:
    mov ah,07h
    int 21h

    cmp al,46
    sub al,30h

    cmp al,0
    je valid
    cmp al,1
    je valid
    jmp input

valid:
    sub bl,1
    cmp bl,0
    je exit
    
    shl cl,1
    add cl,al
    jmp input

但是当我使用模拟器检查寄存器时,它从未真正向我展示我想要什么;例如,如果我键入该值,则该值最终会保存在寄存器中,这显然是不正确的。我做错了什么?cl1100000060hcl

程序集 二进制 x86-16 数据转换 EMU8086

评论

1赞 Peter Cordes 11/12/2023
在您的计数中看起来像一个相差 1 的数字。 (您的测试用例)是 ,但 是(少一个零)。110000000C0h60h1100000
0赞 Root 11/12/2023
为什么会这样?
0赞 Peter Cordes 11/12/2023
好吧,这是一种过于复杂的编写方式/就像 Sep 的答案所示,以检查它是否不是上面的 unsigned-above 1。永远不要写一个在 a 上前进一条指令的指令,只需以与目标相反的条件进行跳跃。(除非它太远了,以至于它太远了,无法进行短距离跳跃。cmp al,1ja inputjccjmpjmp

答:

1赞 Sep Roland 11/13/2023 #1

如果我键入 11000000,则值 60h 最终会保存在 cl 寄存器中,这显然是不正确的。我做错了什么?

该代码要求 8 个有效的二进制数字是正确的。但是,由于决定离开环路的指令的特殊位置,第八位数字不存储在 CL 寄存器中。你不允许发生在那八位数字上。shl cl,1add cl,al

快速解决方法是将代码从以下位置更改为:

valid:
    sub bl,1
    cmp bl,0
    je exit       <<< exits too soon the 8th time
    
    shl cl,1      <<< these need to execute 
    add cl,al     <<<   the 8th time also
    jmp input

自:

valid:
    shl  cl, 1
    add  cl, al
    dec  bl
    jnz  input

有关同一循环的更好/优化版本,请阅读我对您之前问题的回答 无法理解为什么程序集不工作 即使从值寄存器中正确复制值,输出也不会显示正确的结果