1

这是我的代码:

init:
    ; expected to go in "zero" part
    mvi a, 0ah
    mvi e, 05h
    ; content of reg b is "251"

    ; expected to go in "zero" part
    ;mvi a, 0ah
    ;mvi e, 0ah
    ; if followed two are commented out content of reg b is "254"


    ; expected to go in "minus" part
    ;mvi a, 0ah
    ;mvi e, 03h
    ; if followed two are commented out content of reg b is "254"


    ; expected to go in "minus" part
    ;mvi a,0ah
    ;mvi e,0bh
    ; if followed two are commented out content of reg b is "255"

subtractionLoop:
    sub e
    jp subtractionLoop
    jz zero
    jm minus

minus:
    mvi b, 0ffh
    ; print value as 255 to see it comes within "minus" part
    ; the part means last result is minus, so we can get remainder by adding
    ; content of reg E only one time
    hlt

zero:
    mvi b, 0bh
    ; print value as 11 to see it comes within "zero" part
    hlt

我只是尝试实现简单的除法,但是当您阅读评论(;)时,我得到了不同且有趣的结果。

我的想法如下:
只要股息为正,subtractionLoop就继续减法。如果达到0,则转到零部分。否则,转到减号部分。

我的错误在哪里/在哪里?
跳跃似乎不对。

4

1 回答 1

0

这是发生的事情:

  1. mvi a, 0ah

    a设置为 10。

  2. mvi e, 05h

    e设置为 5。

  3. sub e

    a设置为 10 - 5,即 5。符号标志被丢弃,意味着结果不是负数。

  4. jp subtractionLoop

    跳回到sub e

  5. sub e(再次)

    a设置为 5 - 5 = 0。符号标志仍然被丢弃。

  6. jp subtractionLoop

    sub e再次将控制权移回。

  7. sub e

    a设置为 0 - 5 = -5,无符号值为 256 - 5 = 251。这次升起符号标志。

所以我的猜测是,a当您看到 时,它是您正在查看的寄存器251的值,而不是b寄存器的值。

请注意,jz跳转实际上永远不会将控制传递给零,zero:因为零a会导致符号标志被丢弃,因此前面的jp指令将完成其工作跳转到循环的开头。

于 2019-05-12T21:11:52.593 回答