【发布时间】: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。