2017-12-06 9 views
0

こんにちは、私は がメイン プログラムを書くために、CSクラスの問題トラップサブルーチンLC3総会

 The puts TRAP routine has been disabled for some reason. Write an LC-3 
     subroutine called puts that 
    implements its behaviour. In other words when the subroutine is called 
register R0 will contain the 
address of a null-delimited string and the subroutine will simply print the 
string and return. You will of 
course need to utilize the TRAP routine out that prints a character. 

を持っていないしています。

だから、これまで私のアプローチは、私は、これは正しいですか、私のロジックは

PUTS:  
    ADD R2, R0, #0; 
    AND R0, R0, #0; 
    ADD R0, R2, #0; 

    Out(trapx21) ; print first char in r0; 


    BRp PUTS ; repeat loop 

権利である場合、私は私が正しく任意のヘルプを、これをやっているかはわからないかどうかわからないんだけど、このでしたか?

+0

putCharは通常char値を直接取ります。つまり、 'r0'はASCII値を含むべきですが、' puts'はcharへのポインタをとります。つまり、 'r0'はメモリアドレスを含みます。だからあなたは他のレジスタにポインタをコピーし、ポインタから 'r0'に文字をロードしたままputCharを実行し、無限にループしないで、stringのnulターミネータがヒットするまで。 (私はLC3もトラップAPIも知らないので、あなたのドキュメントに対する私の前提を確認してください。これは他のプラットフォーム上で通常どのように動作するのかという一般的なアドバイスです)。現在の状態は "15%完了してややオフ"しかし、良いスタートのように見えます。 – Ped7g

+0

今、私はいくつかの変更を加えましたか? @ Ped7g – rahulchawla

+0

エミュレータ/シミュレータをデバッガで使用している場合は、アセンブリを学び、実験を続け、デバッガでシングルステッピング命令を保存し、何が起こっているかを観察する最も簡単な方法です。私が上に書いたように、私はLC3を知らない。あなたが編集したものは確かに正しくないか、メモリの負荷やポインタの更新などに似ていません。ランダムなテキストのようです(15%から10%、さらには30%のジャンクが追加されました)。推測しないで、あなたがコンピュータから何をしたいか考えて、それを書いてください。そして、デバッグしてください。 – Ped7g

答えて

1

トラップにはいくつかの問題があります。

  1. 最大の間違いは、トラップサービスルーチン内でOUTトラップを使用していることです。トラップが呼び出されると、R7に戻りアドレスが入ります。 OUTトラップを呼び出すと、R7が閉鎖されます。まず、トラップと呼ばれるコードに戻る方法がありません。
  2. 電話をかけた人に戻るには、最後にRET命令が必要です
  3. コードは実際にR0に含まれる文字列から文字を取得していません。したがって、R0に含まれるアドレスから(LDRを介して)読み取ると、R0 + 1に含まれるアドレスから読み取った最初の文字を取得し、2番目の文字を取得する必要があります。R0のアドレスから連続して文字を読み取る必要がありますNULターミネータである0を受信する。

あなたの問題の指示に反して、テストするためにMAINを書くべきです。

+0

ありがとう、ありがとう – rahulchawla