2016-03-03 2 views
1

У меня есть базовый цикл, который запрашивает у пользователя ввод значения, которое затем печатается на экране. Программа останавливается, когда пользователь нажимает Enter. Я также хочу сохранить другие входы в блок памяти для последующего использования. По моему простому пониманию, я думаю, что сохраняю только значения в первом слоте памяти, и я перезаписываю этот слот памяти каждый раз, когда пользователь вводит значение. Как выполнить итерацию через блок памяти?LC-3 Итерация через блок памяти

Благодаря

.ORIG x3000 

     LEA R0, memSpace 
LOOP GETC 
     ADD R3, R0, #-13 
     BRz DONE 
     OUT 
     STR R2, R0, #0 
     ADD R2, R2, #1 
     ADD R1, R1, #-1 
     BRnzp LOOP 
     memSpace .BLKW 30 
     LEA R3, memSpace 
     PUTS 
DONE HALT 

.END 

ответ

1

Итак, у нас есть несколько проблем здесь ...

  1. memSpace .BLKW 30 должен быть послеHALT, чтобы избежать перезаписи инструкции.
  2. GETC копирует персонаж в R0, поэтому вы теряете регистр memSpace. Поместите указатель массива в R2; вы уже увеличиваете R2, при необходимости.
  3. Теперь вам необходимо STR R0, R2, #0.
  4. ADD R1, R1, #-1 ничего не делает.
  5. 13 - код ASCII для возврата каретки; вы, вероятно, захотите изменить это на 10 для фида.

Есть еще несколько пунктов, на которые стоит обратить внимание. Вместо использования BRnzp LOOP, безусловно, ветвь с BR LOOP. Кроме того, команды LEA и PUTS между ветвью и остановкой недоступны; Я предполагаю, что вы разместили их там для отладки. Хотя вы, возможно, хотели записать содержимое memSpace на консольный дисплей, PUTS не обязательно это сделает. Он будет заканчиваться на пространстве (или, возможно, никогда). В любом случае вам понадобится LEA R0, memSpace1 до PUTS.

Фиксированная версия:

.ORIG x3000 

     LEA R2, memSpace 
LOOP GETC 
     ADD R3, R0, #-10 
     BRz DONE 
     OUT 
     STR R0, R2, #0 
     ADD R2, R2, #1 
     BRnzp LOOP 
DONE HALT 

memSpace .BLKW 30 

.END 
Смежные вопросы