Хранение в выпусках ЛК-3

Итак, я работаю над заданием на языке ассемблера 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, но я не уверен, если кто-нибудь может помочь, это было бы очень признательно.


person user3373305    schedule 11.04.2014    source источник
comment
Какие регистры используют ловушки x20 и x21 и какие регистры затронуты? И почему это ДОБАВИТЬ R1, R0, 0 в начале «GETSTR»? Адрес хранилища не очищается? Похоже, что GETSTR вызывается с адресом хранения в R1.   -  person turboscrew    schedule 11.04.2014
comment
Векторы ловушек в LC3 сохраняются в R0, поэтому я добавляю R0 в R1, чтобы ячейка памяти передавалась в R1 до того, как R0 будет перезаписан ловушкой x20   -  person user3373305    schedule 11.04.2014
comment
Извините, мне нужны более прочные очки: основная программа вызывает GETDEC, а не GETSTR.   -  person turboscrew    schedule 12.04.2014


Ответы (1)


Я думаю, что с хранением все в порядке, и ваша проблема здесь (в GETDEC):

JSR GETSTR
LD  R2, JIMB <=

Здесь вы загружаете данные из буфера, а не адрес буфера. Вам, наверное, нужна ЛЕА.

Тогда здесь:

ADD R0, R0, R2  ; R0 <- R0 + X
ADD R2, R2, 1   ; Increments R2

Первая строка обрабатывает R2 как данные, а вторая строка — как указатель на данные.

person turboscrew    schedule 12.04.2014
comment
Итак, я внес некоторые коррективы, теперь у меня есть 1 регистр LEA, адрес моего буфера, и I LDR, которые регистрируются в другом регистре, который содержит значение адреса буфера. Однако проблема, с которой я сталкиваюсь, заключается в том, что подпрограмма GETDEC застряла в бесконечном цикле. Он должен разветвляться, когда вводится 0, но не разветвляется, когда я это делаю. - person user3373305; 12.04.2014
comment
Хорошо, я понял, что я делал неправильно, R0 был единственным регистром, который не сохранялся/не восстанавливался, когда GETDEC разветвлялся, так что это должен был быть регистр, нажимающий 0, мне пришлось переключаться между тем, какой регистр делал что, так что что R0 просто проверял 0 и ничего больше. После этого подпрограмма работает нормально, спасибо за помощь. - person user3373305; 13.04.2014