#lc3
#lc3
Вопрос:
Как мне изменить этот код LC-3, чтобы он подсчитывал количество 0 вместо единиц
.ORIG x3000
LD R2, INPUT
AND R0, R0, #0 ; COUNTER INITIALIZED TO ZERO
ADD R1, R0, #1
ADD R3, R0, #15
LOOP
AND R4, R2, R1
BRz SKIP
ADD R0, R0, #1
SKIP
ADD R1, R1, R1
ADD R3, R3, #-1
BRzp LOOP
INPUT .FILL x1997
.END
Ответ №1:
Вы смотрели, как это работает в отладчике? Выполните один шаг в этой небольшой программе, и вы увидите, как это работает.
Можете ли вы найти здесь конструкцию if-then ? Конструкция if-then имеет вид if-condition-then-action . Итак, вы ищете что-то, что имеет этот эффект:
if ( bit is set )
R0 ;
И вы хотите изменить его на противоположное условие, чтобы вместо него считались нули.
if ( bit is clear )
R0 ;
Где bit is clear
то же ! (bit is set)
самое, что и , т. Е. Наоборот.
Обратите внимание, что вышесказанное изложено в терминах структурированного языка, такого как C. В сборке if-condition-then-action выглядит примерно так:
if ( condition is false ) goto Label1; // action is skipped if condition is false
..action.. // action runs if condition is true
Label1:
Это связано с тем, что единственной управляющей структурой в ассемблерном / машинном коде является условная ветвь, которая в C выглядит как if ( condition ) goto label;
Ответ №2:
Если, я полагаю, ваша программа в порядке (я не пробую), быстрая модификация заключается в том, чтобы перевернуть все 0 на 1 и 1 на 0.
НЕ выполняйте задание! Я оставляю вам упражнение.
Другой способ заключается в том, что если вы считаете n бит1, это означает, что у вас есть 16-n бит0… Опять ЖЕ, НЕ ваш друг, чтобы вычислить 16-n
Обратите внимание, что оба оставляют код нетронутым, который можно использовать как подпрограмму.
Не забудьте использовать HALT для остановки программы