0

Это мой LC3 кодПочему я получаю ошибку «ожидаемого регистра или немедленного значения»?

.ORIG x3000 
AND R0,R0, #0 
AND R2,R2, #0 
ADD R2,R2, #7 
JSR SUB 
ADD R2,R2, ASCII 
ADD R0,R2,#0 
TRAP x21 
SUB ADD R2,R2,#9 
ADD R7,R7,#1 
RET 
HALT 
ASCII .FILL x0000 
.END 

Монтаж При попытке сборки код, я получил эти ошибки enter image description here

Я знаю, что проход 1 относится к первому шагу в процессе сборки, который должен добавлять переменные и значения, которые они удерживают в таблице символов. Я знаю, что шаг 2 заключается в замене значений с помощью таблицы символов. (Использование Lc3 Assembly в качестве ссылки)

Может ли кто-нибудь объяснить, почему ассемблер пытается заменить в первом проходе и вызывать ошибку? Не следует ли передавать 1 признавать ASCII в качестве переменной, которая содержит x0001 и не пытается ее заменить?

ответ

1

Вы получаете эту ошибку, потому что на конечной машине LC3 есть только две версии команды ADD.

  • ADD R1, R2, R3
  • ADD R1, R2, # 7

Вы можете видеть, что мы можем добавить регистры вместе или мы можем использовать ADD немедленно. ADD немедленный где мы используем последний операнд как целое значение между -16 и 15.


Это означает, что, чтобы получить свой сегмент кода для работы вам нужно будет загрузить переменную в регистр первым.

.ORIG x3000 
AND R0,R0, #0 
AND R2,R2, #0 
ADD R2,R2, #7 
JSR SUB 


LD R1, ASCII ; load the value stored in ASCII into R1 
ADD R2, R2, R1 ; R2 = R2 + R1 


ADD R0,R2,#0 
TRAP x21 
SUB ADD R2,R2,#9 
ADD R7,R7,#1 
RET 

HALT ; Remember to add this at the end of your running code 
     ; or else the LC3 will execute the values stored in your 
     ; variables 

ASCII .FILL x0001 
.END 
+0

Ahh Я вижу. Я согласен с тем, что вы сказали. Я попытался немного поэкспериментировать, изменив ASCII .FILL x0001 на ASCII .FILL x0000 и добавив HALT (показано выше). Я все же получил ту же ошибку. Должно ли x0000 или десятичное значение 0 работать как значение немедленного значения (падает в диапазоне от -16 до 15)? – committedandroider

+0

Вы видели строку кода, в которой мы передаем значение ASCII в R1, а затем добавляем регистры вместе? –

+0

Я получаю это, но когда вы используете немедленный режим, вам не нужно загружать значение. Непосредственное значение будет здесь 0. Итак, R2 сохранит содержимое R2 + 0? – committedandroider