2017-01-09 22 views
-1

Мне нужно написать код сборки, который возвращает c = | a - b |. Единственными заказами, которые мне разрешено использовать, являются:Показано, что 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

Где вы застряли? Вы определили алгоритм? Можете ли вы сделать псевдокод или блок-схему? – Jester

+0

Да, извините, отредактировано. – NotSure

+0

Вы должны отредактировать его снова и исправить, чтобы использовать правильное форматирование. –

ответ

1

Вы отлаживали его для отрицательных значений? Мне кажется, что для некоторых комбинаций он действительно может работать, деформируя правильно. Тогда снова для некоторых других это не будет, как | 5-0 |.

Я предполагаю, что вы говорите о бинарной архитектуре с реальным двоичным кодом, где числа имеют только фиксированное количество бит, а отрицательные значения кодируются как дополнение к двум, поэтому «деформирование» работает.

Итак ... Я думаю, что вы можете сделать это:

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», дать им какое-то значение, что они делают.