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

Assembly 显示c=| a-b |使用有限操作的assambly,assembly,assemblies,low-level,Assembly,Assemblies,Low Level,我需要编写一个返回c=| a-b |的汇编代码。我唯一可以使用的订单是: INC-提高存储在一个寄存器中的值 DIC-减少存储在一个寄存器中的值 JNZ-跳转到代码中的一个点(标签)。只要最后一个操作是在代码行附近完成的,则不等于零 HALT-停止代码 您可以使用任意多的寄存器(最好使用尽可能少的寄存器),并且所有寄存器的值都初始化为零 我正试图这样做,但不幸的是,每次我都被卡住了。 这就是我目前拥有的: Label 3 Dec a Jnz label 1 Label 2 Inc c D

我需要编写一个返回c=| a-b |的汇编代码。我唯一可以使用的订单是:

INC
-提高存储在一个寄存器中的值

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

JNZ
-跳转到代码中的一个点(标签)。只要最后一个操作是在代码行附近完成的,则不等于零

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

这只适用于正数,我现在知道应该如何处理负数。

是否调试了负数?在我看来,对于某些组合,它可能通过正确地扭曲来工作。而对于其他一些人来说,它不会,比如| 5-0 |

我假设您谈论的是类似实数的二进制CPU体系结构,其中数字只有固定数量的位,负值被编码为二的补码,所以“扭曲”是可行的

所以。。。我认为你可以做到这一点:

  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
do{dec a,dec b}而jnz
; 这将实现:a=a-b,b=0
; 集合b=a,d=-a
从_a设置_b_和_d_:
公司b
十二月四日
十二月一日
jnz从_a设置_b_和_d_
查找\u正\u值:
公司c
十二月b日
jnz找到积极的价值,也尝试
停止c=| a-b |表示(a-b)>=0
找到\u正\u值\u也尝试\u d\u:
十二月四日
jnz查找正值
停止c=| a-b |表示(a-b)<0
; 正值需要较少的“dec”才能达到
; 因此,其中一个停顿会更快到达
; 将“c”设置为使用的“dec”编号

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

你在哪里卡住了?你找到算法了吗?您能做伪代码或流程图吗?是的,对不起,已编辑。您应该再次编辑并更正它以使用正确的格式。