Как мне сделать этот код LC-3 для подсчета количества 0 в значении, хранящемся в R0, и сохранения результата в R1

#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 для остановки программы