Используя подпрограмму TRAP из подпрограммы?- Сборка LC3 - PullRequest
2 голосов
/ 24 февраля 2011

Итак, я закончил программу сборки, которая запрашивает символ, читает его, повторяет его, повторяет это четыре раза, а затем печатает эти символы в последовательной строке.Затем я захотел поэкспериментировать с подпрограммами (о которых мы еще не узнали в классе), поэтому я сделал следующую подпрограмму для вывода символа новой строки в консоль:

PRINT_NEWLINE                         ;procedure to print a newline
  AND   R0,R0,#0                      ;clear output register
  LD    R0,NEWLINE                    ;load newline into output regiester
  TRAP  x21                           ;print it out
  RET                                 ;jump to address in R7

Он вызывается какthis:

JSR PRINT_NEWLINE

После запуска я заметил что-то странное, программа, казалось, остановилась после первого вызова PRINT_NEWLINE.Затем я понял, что TRAP сохраняет адрес следующей инструкции, которая в данном случае RET, в R7, регистр, используемый для связывания подпрограммы.Это перезаписывает адрес, который был сохранен в R7 с помощью JSR.Поэтому причина, по которой он останавливается, заключается в том, что после завершения процедуры TRAP она загружает мою инструкцию RET.Что на самом деле, из-за TRAP, изменение счетчика ПК на себя.Вроде как бесконечный цикл.

Это все замечательно, и я понимаю, что происходит, но есть ли способ, которым я могу использовать системные TRAP подпрограммы внутри моей подпрограммы, все еще используя системную JSR инструкцию?

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

Но мне это кажется неправильным, и я программист, поэтому я ленив и предпочел бы просто наслаждаться плодами чужого труда и использовать комбинацию JSR и RET.

Так можно ли вызвать подпрограмму TRAP в подпрограмме и все еще использовать RET для "возврата" из этой подпрограммы?Как можно это сделать?

Спасибо!

1 Ответ

3 голосов
/ 24 февраля 2011

Вам нужно будет сохранить значение R7 в другом месте перед вызовом TRAP и восстановить его после. Это необходимо сделать и для вложенных вызовов подпрограмм. Большинство архитектур RISC требуют некоторой формы сохранения адреса возврата пользователем; они не реализуют стек памяти в оборудовании, как процессоры x86.

...