Итак, я закончил программу сборки, которая запрашивает символ, читает его, повторяет его, повторяет это четыре раза, а затем печатает эти символы в последовательной строке.Затем я захотел поэкспериментировать с подпрограммами (о которых мы еще не узнали в классе), поэтому я сделал следующую подпрограмму для вывода символа новой строки в консоль:
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
для "возврата" из этой подпрограммы?Как можно это сделать?
Спасибо!