8位普通减法运算

时间:2019-02-23 23:20:36

标签: assembly conditional conditional-statements bitflags intel-8080

这是我的代码:

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,请转到零部分。否则,请转到减号部分。

我的错误在哪里?
跳跃似乎不正确。

1 个答案:

答案 0 :(得分: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指令将执行它的工作跳到了周期的开始。