2017-12-09 54 views
0

私はプログラムの任意のスコープでAに到達することができますが、これを引数としてプロシージャに渡すので、A []のメモリアドレスをレジスタ、たとえば$ a0に保存します。配列のアドレスを取得してアセンブリのレジスタに保存するにはどうすればいいですか?

swの代わりに私がsbを使用した理由は、それをアセンブルするときに問題があります。

私がlb $a0, Aと言うとき、それはアドレスではない値である4から$a0を格納します。

.data 
    A: .space 16 

.globl main 
main: 
    # Initialize values in the array 
    addi $s0, $zero, 4 
    addi $s1, $zero, 8 
    addi $s2, $zero, 3 
    addi $s3, $zero, 5 

    # This $t0 is just used for indexing while inserting to A 
    addi $t0, $zero, 0 

    sb $s0, A($t0) 
    addi $t0, $t0, 4 
    sb $s1, A($t0) 
    addi $t0, $t0, 4 
    sb $s2, A($t0) 
    addi $t0, $t0, 4 
    sb $s3, A($t0) 
    li $t0, 0 

答えて

1

la擬似命令を使用してください。 la $t0, AAが16ビットに収まらない場合は

、これは
lui $t0, high16(A)のようなシーケンスに組み立てます。 ori $t0, $zero, low16(A)this basic MIPS instruction-set reference for LUIを参照してください。アセンブラでoriの代わりにadduiを使用することがあります。いくつかのアセンブラには、li/la疑似命令を選択するオプションがあると思います。

アドレスの代わりに数値定数で使用する疑似命令(ロード即時)もありますが、同じように動作します。


アラインメントの問題については、Aのアドレスがワードアライメントされていることを確認してください。私はこれが自動的に起こると思ったでしょうが、投稿したコードの.asciz文字列定数を先に.dataに書き留めておきます。とにかく、非複数の-4サイズのオブジェクトの前に最初Aを置く、またはAのアドレスは16ビットに収まる場合4.

.data 
    .align 4   # align by 4 bytes. 
    A: .space 16 

の次の倍数にパッドに.alignディレクティブを使用しますか、あなたはそれを必要としないか、またはレジスタ内のオフセットを使用してください。sb $s0, A+4($zero)などを使用してください。 (しかし、あなたがSB/LBを使用している場合、なぜまだ?要素間の4つのバイトによって相殺なぜ4バイトの4バイト長の配列にしない?)

.globl main 
main: 
    # Initialize values in the array 

    li  $t0, 4 
    sw  $t0, A($zero) 

    addui $t0, $zero, 8  # doing it manually without an LI pseudo-instruction 
    sw  $t0, A+4($zero) 

    li  $t0, 3 
    sw  $t0, A+8($zero) 

    li  $t0, 5 
    sw  $t0, A+12($zero) 

    #li $t0, 0 

あなたが使用する必要はありません毎回違うレジスタだと思いますが、は、の場合、は、前のswがそれを読んでいた前にlit0と書き込もうとしたときにストールする可能性があります。スーパスカラCPUでは、異なる命令タイプ(ALU adduiとメモリsw)を混在させて、最初のストアが実行される前に必要以上に待つのではなく、並列に実行できるようにするのが理にかなっています。

また、値とアドレスが一緒になっているため、これはおそらく人間が読みやすくなります。

+0

私は問題に時間を費やしてくれてありがとう。それはあなたにとてもいいです。 –

+0

私はAに達する間に問題を抱えています。私はAのアドレスを$ a0に保持し、A($ a1)に到達したいとします。その単語をロードしたいとき、$ a0($ a1)は機能しません。 $ a0を使ってどのように要素に到達できますか? –

+0

@ M.Kaan:MIPSには1つのアドレッシングモードしかありません:register + imm32。2レジスタのアドレスが必要な場合は、一時レジスタに別の 'addu'命令が必要です。 –

関連する問題