String 用LC3中的子例程读取字符串时出现问题
所以我相信我存储字符串的方式是有效的。我只是在将字符串从子程序中传递出去时遇到了一些问题。我听说,为了从子程序中传递某些内容,需要将其存储在R1中,但我无法将其存储到我的WORD数组中String 用LC3中的子例程读取字符串时出现问题,string,subroutine,lc3,String,Subroutine,Lc3,所以我相信我存储字符串的方式是有效的。我只是在将字符串从子程序中传递出去时遇到了一些问题。我听说,为了从子程序中传递某些内容,需要将其存储在R1中,但我无法将其存储到我的WORD数组中 .orig x3000 AND R1,R1,0 LEA R0,PROMPT PUTS JSR GETS ST R1,WORD LEA R0,WORD PUTS halt ; ---------Data Ar
.orig x3000
AND R1,R1,0
LEA R0,PROMPT
PUTS
JSR GETS
ST R1,WORD
LEA R0,WORD
PUTS
halt
; ---------Data Area-------------
WORD .blkw 20
PROMPT .stringz "Enter String: "
; -------------------------------
GETS LEA R1,MEMORYBLOCK ; saves the address of the storage memory block
loop GETC ; input character -> r0
PUTC ; r0 -> console
; always points at the next available block
LD R2,EMPTY ; check for
ADD R2,R2,R0 ; end of line
BRz finish
LD R2,COUNTDOWN
ADD R2,R2,#-1
BRz finish
ST R2,COUNTDOWN
STR R0,R1,#0 ; r0 -> ( memory address stored in r1 + 0 )
ADD R1,R1,#1 ; increments the memory pointer so that it
BR loop
finish LEA R1,MEMORYBLOCK
RET
; ----Subroutine Data Area-------
EMPTY .fill xfff6
COUNTDOWN .fill #10
MEMORYBLOCK .BLKW 20
; -------------------------------
.end
这里最大的问题是“返回字符串”的概念。在GETS末尾实际执行的操作是返回字符串开始的内存地址。然后在调用函数中将其存储到WORD中时,将输入字符串的第一个字节的内存地址(即MEMORYBLOCK的内存地址)存储到WORD的第一个字节中。您没有将整个字符串从MEMORYBLOCK复制到WORD中 对于你正在尝试做的事情,最简单的“修复”方法就是改变
LEA R0,WORD
到
然后,为了更好的衡量:
WORD .blkw 20
到
现在,您只需使用它存储单个值(即MEMORYBLOCK的内存地址)
但是,此时您还没有创建字符串的副本。如果您想这样做,那么您需要做一个循环,通过它遍历MEMORYBLOCK并将每个字节复制到单词
最后一种更便宜的方法是直接从调用函数使用MEMORYBLOCK。在这种规模的程序中,它的有效性并没有降低,除非有项目需求提出了其他要求
WORD .blkw 20
WORD .fill 0