2017-01-09 37 views
-1

我需要编写一个返回c = | a - b |的汇编代码。我被允许使用的唯一命令是:显示c = | a - b |使用有限操作的assambly

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

你卡在哪里?你算出算法吗?你可以做伪代码或流程图吗? – Jester

+0

是的,抱歉,编辑。 – NotSure

+0

您应该再次编辑并更正它以使用正确的格式。 –

回答

1

您是否调试过负值?看起来我喜欢一些组合,它可能实际上正确地扭曲。然后再次为其他人不会,像| 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 

不要做“label1”为“label4”,给他们一些意思,他们正在做什么。

相关问题