Итак, я работаю над заданием на языке ассемблера LC-3, и у меня возникла проблема. Таким образом, программа предназначена для использования подпрограммы GETDEC для ввода некоторого ввода в виде строки с клавиатуры, а затем интерпретирует введенную строку для создания целочисленного значения. Я думаю, что близок к выполнению задания, но, кажется, я застрял. Мы должны использовать блок из 8 слов для входного буфера, и моя проблема в том, что я не могу заставить свою программу сохранять значения входной строки в блоке, что, в свою очередь, не позволяет мне выйти цикла в моем основном методе.
Вот основной метод
LEA R1, DATA
INPUT
LD R0, NEWLN
TRAP x21
LEA R0, PROMPT
TRAP x22
JSR GETDEC
STR R0, R1, #0
ADD R1, R1, #1
ADD R0, R0, #0
BRNP INPUT
LD R0, NEWLN
TRAP x21
LEA R1, DATA
OUTPUT
LDR R0, R1, #0
JSR PUTDEC
LD R0, NEWLN
TRAP x21
ADD R1, R1, #1
LDR R0, R1, #-1
BRNP OUTPUT
TRAP x25
NEWLN .FILL x000A
PROMPT .STRINGZ "Enter an integer, 0 to quit> "
DATA .BLKW 10
Вот моя подпрограмма GETSTR, которая получает ввод в виде строкового значения.
GETSTR
ST R7, GET_7
ST R1, S1
ST R2, S2
ST R3, S3
ADD R1, R0, 0
TRAP x20 ;User input
TRAP x21 ;echoes input
STR R0,R1,0
AND R3,R3,0 ;clears R3
ADD R2, R0, 0 ;R2 <- R0
ADD R1, R1, #1 ;R3 <- R3+1
LD R3, PRZ ;R1 <- xF6 (-10)
ADD R2,R3,R2 ;R2 <- R1 + R2
BRnp -9 ;Branches back to User Input unless last flag is Zero
LD R1, S1
LD R2, S2
LD R3, S3
LD R7, GET_7
RET
GET_7 .BLKW 1
PRZ .FILL xFFF6
S1 .BLKW 1
S2 .BLKW 1
S3 .BLKW 1
А вот моя подпрограмма GETDEC, которая берет входную строку и интерпретирует ее в соответствующее целочисленное значение.
GETDEC ;Input a signed integer to R0
ST R7, GET7
ST R1, GET1
ST R2, GET2
LEA R0, JIMB ;Input a character string
JSR GETSTR
LD R2, JIMB
AND R0, R0, 0
HERE ADD R0, R0, R0 ; multiply by 10
ADD R1, R0, R0
ADD R1, R1, R1
ADD R0, R0, R1
ADD R0, R0, R2 ; R0 <- R0 + X
ADD R2, R2, 1 ; Increments R2
LD R3, WORK
ADD R3, R2, R3
BRnp HERE ;Loop if R2 = 0
LD R1, GET1
LD R2, GET2
LD R7, GET7
RET
GET1 .BLKW 1
GET7 .BLKW 1
GET2 .BLKW 1
JIMB .BLKW 8
WORK .FILL xFFD0
Итак, повторюсь, основной метод зацикливает GETDEC до тех пор, пока на входе не будет введен 0, но что-то в моем коде мешает мне выйти из цикла при вводе 0. Я думаю, что могу использовать неправильные методы загрузки в подпрограмме GETDEC, но я не уверен, если кто-нибудь может помочь, это было бы очень признательно.