0

所以我相信我存储字符串的方式是有效的。我只是在将字符串从子例程中传递出来时遇到了一些问题。我听说为了从子程序中传递一些东西,你需要将它存储在 R1 中,但我无法将它存储到我的 WORD 数组中

   .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
4

1 回答 1

0

这里最大的问题是“返回字符串”的概念。您在GETS 末尾实际上在做的是返回字符串开始的内存地址。然后,当您在调用函数中将其存储到 WORD 中时,您正在将输入的字符串的第一个字节的内存地址(即 MEMORYBLOCK 的内存地址)存储到 WORD 的第一个字节中。您没有将整个字符串从 MEMORYBLOCK 复制到 WORD 中。

你想要做的最简单的“修复”就是改变

   LEA     R0,WORD

   LD      R0,WORD

然后为了更好的衡量:

WORD  .blkw   20

WORD  .fill   0

因为现在您只是使用它来存储单个值(即 MEMORYBLOCK 的内存地址)。

但是,此时您还没有制作字符​​串的副本。如果你想这样做,那么你需要创建一个循环,通过 MEMORYBLOCK 将每个字节复制到 WORD 中。

最后一种更便宜的方法是直接从调用函数中使用 MEMORYBLOCK。在这种规模的程序中,它的有效性并没有降低,除非项目要求另有要求。

于 2014-12-23T20:10:56.213 回答