这是我的代码:
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
,请转到零部分。否则,请转到减号部分。
我的错误在哪里?
跳跃似乎不正确。
答案 0 :(得分:0)
发生了什么事
mvi a, 0ah
a
设置为10。
mvi e, 05h
e
设置为5。
sub e
a
设置为10-5,即5。
删除符号标志,表示结果不是负数。
jp subtractionLoop
跳回到sub e
。
sub e
(再次)
a
设置为5-5 = 0。
仍然删除了标志标志。
jp subtractionLoop
再次将控制权移回到sub e
。
sub e
a
设置为0-5 = -5,该无符号值是256-5 = 251。
这次升起了标志标志。
所以我的猜测是,这是您看到a
时正在查看的251
寄存器的值,而不是b
寄存器的值。
请注意,jz
跳转实际上不会将控制权传递给zero:
,因为a
的零结果将使符号标志掉落,因此前面的jp
指令将执行它的工作跳到了周期的开始。