3
       .data
VALS:  .half 0xbead, 0xface
RES:   .space 4
    .text
    la     $t0,VALS
    lh    $t1,($t0)
    lhu    $t2,2($t0)
    sll    $t2,$t2,16
    or    $t2,$t1,$t2
    jal    AVG
    .word  -2
    .word  -6
    la    $t4,RES
       sw  $v0,($t4)
       li     $v0,10
    syscall
AVG:   lw  $v0,($ra)
    lw    $t3,4($ra)
    add    $v0,$v0,$t3
    sra    $v0,$v0,1
    addi   $ra,$ra,8
    jr     $ra

この MIPS コードでは、.word 部分は何をするのでしょうか? 私のエミュレータは、テキスト セクションのデータ ディレクティブを処理できません。ディレクティブは何をしますか? そして、.word -8 ではなく、.word -2 と .word -6 を実行するポイントは何ですか?

4

1 に答える 1

4

このディレクティブは、ワード値 -2 および -6 をコード ストリームに配置します。このチャンクの実際のバイナリ表現を見ると、命令エンコーディングの途中で、エンディアンに応じて FFFFFFFEFFFFFFFA または FEFFFFFFFAFFFFFF が見つかります。

アセンブラは、値がそれぞれ -2 と -6 の 2 ワード分のデータを出力します。-8 の 1 ワードとは異なります。

AVG: ラベルの内容を見ると、

lw $v0, ($ra)
lw $t3, 4($ra)

これにより、レジスタ v0 および t3 に戻りアドレス (つまり、コード セグメントに埋め込まれたデータからジャンプした場所) から 2 ワードがロードされます。つまり... v0 は -2 を取得し、t3 は -6 を取得します。また、埋め込まれたデータを飛び越えるために、コード セグメントが戻る前に $ra に 8 を追加する方法にも注意してください。

つまり、コード ストリームの一部としてレジスタに読み込まれる定数値をエンコードする方法です。

次に、コードが行うことは、戻る前に 2 を加算し、右にシフトすることです (Average の実​​装を想定しています)。この特定のケースでは、コンパイル時に単純に平均を直接計算できる場合 (または頭の中で asm を直接記述した場合)、それほど多くの作業を行うことはあまり意味がありません。AVG は多くの場所から呼び出されることになっていると思いますが、その場合でも、コード セグメント (通常は読み取り専用) からの値を期待しているため、定数値で数学を計算するポイントがわかりません。

于 2010-03-04T11:20:03.700 に答える