显示c = | a - b |使用有限操作的assambly

时间:2017-01-09 21:09:24

标签: assembly assemblies low-level

我需要编写一个返回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

这只适用于正数,我现在知道我应该为负数做什么。

1 个答案:

答案 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;,给他们一些意义,他们正在做什么。