【问题标题】:Storing in LC-3 issues存储在 LC-3 问题中
【发布时间】:2014-04-11 04:57:05
【问题描述】:

所以我正在使用 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 子例程中使用了错误的 Load 方法,但我不确定,如果有人能提供帮助,将不胜感激。

【问题讨论】:

  • trap x20 和 x21 使用哪些寄存器,哪些寄存器受到影响?为什么在'GETSTR'的开头这个“ADD R1,R0,0”?不是清除存储地址吗?看起来“GETSTR”是用 R1 中的存储地址调用的。
  • LC3中的Trap向量存储到R0中,这就是为什么我将R0添加到R1中,以便在R0被Trap x20覆盖之前将内存位置传递给R1
  • 抱歉,我需要更强的眼镜:主程序调用 GETDEC,而不是 GETSTR。

标签: assembly lc3


【解决方案1】:

我觉得存储没问题,你的问题就在这里(在 GETDEC 中):

JSR GETSTR
LD  R2, JIMB <=

您从这里的缓冲区加载数据,而不是缓冲区地址。 您可能需要 LEA。

那么这里:

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

第一行将 R2 视为数据,第二行视为指向数据的指针。

【讨论】:

  • 所以我做了一些调整,我现在有 1 个寄存器 LEA 我的缓冲区的地址,我的 LDR 寄存器到另一个保存缓冲区地址值的寄存器中。然而,我仍然遇到的问题是 GETDEC 子例程卡在无限循环中。它应该在输入 0 时分支,但当我这样做时不会分支。
  • 好的,我知道我做错了什么,当 GETDEC 分支时,R0 是唯一没有保存/恢复的寄存器,所以它必须是推 0 的寄存器,我必须切换寄存器在做什么,这样 R0 只是检查 0 而没有别的。之后子程序运行正常,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多