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 に答える