显示 c = |a - b |在有限的操作下使用 assamly

Showing that c = |a - b | using assambly with limited operations

我需要编写 returns c = |a - b | 的汇编代码。我唯一可以使用的命令是:

INC - 增加存储在一个寄存器中的值。

DIC - 减少存储在一个寄存器中的值。

JNZ - 跳转到代码中的某个点 (LABEL)。只要在代码行附近完成最后的操作就不等于零。

HALT - 停止代码。

你想用多少寄存器就用多少(越少越好),所有寄存器的值都初始化为0。

我正在尝试这样做,但不幸的是我每次都卡住了。 这就是我目前拥有的:

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

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

你调试过负值吗?在我看来,对于某些组合,它实际上可以通过正确地扭曲来工作。然后对于其他一些则不会,例如 |5-0|。

我假设您正在谈论类似真实的二进制 CPU 架构,其中数字只有固定数量的位,负值被编码为二进制补码,因此 "warping" around 有效。

所以...我认为你可以这样做:

  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

不要做“label1”到“label4”,给他们一些意义,他们在做什么。