LC3 показывает настраиваемое приглашение для ловушки ввода символов - PullRequest
0 голосов
/ 30 апреля 2018

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

Процедура ловушки IN обычно говорит Input a character>. Мне нужно, чтобы это сказать Please enter a number between 0 and 9:

В настоящее время у меня есть это:

.ORIG x3000
JSR SAVE ; THIS WILL JUMP TO SUBROUTINE TO SAVE CURRENT REGISTER CONTENTS
SAVE   ST R7, x3031 ;SAVES REGISTER VALUE INTO THE ADDRESS 
ST R3, x3030 ;SAVES REGISTER VALUE INTO THE ADDRESS 
ST R2, X302F ;SAVES REGISTER VALUE INTO THE ADDRESS
ST R1, X302E ;SAVES REGISTER VALUE INTO THE ADDRESS 
LD R0, ten ;LOADS TEN FILL VALUE
JSR check
LEA R1, msg1
LDR R0, R1, #0
BRz error
JMP check
ADD R1, R1, #1
check ST R7, X300D
LDI R3, dsr
BRzp x300D
STI R0, ddr
LD R7, x300D
RET
ten .FILL x000A
dsr .FILL xFE04
ddr .FILL xFE06
msg2 .STRINGZ "Enter a number (0 - 9) to subtract from the first number:
msg1 .STRINGZ "Please enter a number between 0 and 9:

.END

1 Ответ

0 голосов
/ 30 апреля 2018

Ваш код неверен.

  1. Создание подпрограммы для сохранения содержимого регистра не будет работать. Если вы вызываете эту подпрограмму в другой подпрограмме, вы закроете R7 и, следовательно, не сможете выйти из подпрограммы. Лучше всего, чтобы этот код был частью вашей подпрограммы.
  2. ST RX, ADDR не будет работать. Смещения для ST / LD составляют всего 9 бит. Правильное использование - создать метку для места для сохранения вашего регистра. Аналогично метке «десять» в вашем коде.
  3. Инструкция JMP используется неправильно. JMP принимает только регистр, а не метку. Вы не должны использовать JMP для написания подпрограммы. Наиболее распространенным случаем JMP является инструкция RET, которая позволяет вам вернуться из подпрограммы. Если вы хотите безоговорочно перейти к какому-то коду, вместо этого следует использовать BR.
  4. Вы должны использовать только JSR для вызова подпрограмм. Я вижу, что он используется для перехода к пунктам «Проверка JSR», например. Если вам нужно безоговорочно перейти в локацию, используйте BR.

Шаги для написания подпрограммы должны быть выполнены следующим образом

SUBR ; save used registers ; do computation ; restore used registers ; ret

Например, подпрограмма, которая печатает однозначное целое число в R0 (без проверки ошибок), будет выглядеть следующим образом

PRINT_SINGLE_DIGIT ST R7, R7SAVE ; out is a trap so r7 is clobbered we should save it. ST R0, R0SAVE ; save R0. ADD R0, R0, 15 ADD R0, R0, 15 ADD R0, R0, 15 ADD R0, R0, 3 OUT LD R0, R0SAVE LD R7, R7SAVE ; restore R7 RET R0SAVE .blkw 1 R7SAVE .blkw 1

...