我需要编写一个返回c = | a - b |的汇编代码。我被允许使用的唯一订单是:
INC
- 提高存储在一个寄存器中的值。
DIC
- 减少存储在一个寄存器中的值。
JNZ
- 跳到代码中的某一点(LABEL)。只要最后一次操作在代码行附近完成就不等于零。
HALT
- 停止代码。
您可以根据需要使用尽可能多的寄存器(最好尽可能少地使用),并将所有寄存器的值初始化为零。
我正在努力做到这一点,但不幸的是我每次都被卡住了。 这就是我现在所拥有的:
Label 3
Dec a
Jnz label 1
Label 2
Inc c
Dec b
Jnz label 2
Dec c
Halt
Label 1
Dec b
Jnz label3
Label4
Inc c
Dec a
jnz label4
Halt
这只适用于正数,我现在知道我应该为负数做什么。
答案 0 :(得分:1)
你为负值调试了吗?在我看来,对于某些组合,它可能通过正确扭曲实际工作。然后再对其他人来说,它不会像| 5-0 |。
我假设您正在谈论类似于二进制CPU的体系结构,其中数字只有固定的位数,而负值则被编码为二进制补码,因此" warping"工作。
所以...我认为你可以这样做:
do { dec a, dec b } while jnz
; that will achieve: a = a-b, b = 0
; set b = a, d = -a
set_b_and_d_from_a:
inc b
dec d
dec a
jnz set_b_and_d_from_a
find_positive_value:
inc c
dec b
jnz find_positive_value_try_d_too
halt ; c = |a-b| for (a-b) >= 0
find_positive_value_try_d_too:
dec d
jnz find_positive_value
halt ; c = |a-b| for (a-b) < 0
; the positive value will take fewer "dec" to reach
; so one of the halt is reached sooner
; with "c" set to the number of "dec" used
不要做&#34; label1
&#34;到&#34; label4
&#34;,给他们一些意义,他们正在做什么。