2016-04-16 4 views
1

スタック、スタックポインタ$spは4だけデクリメントされる。MIPSは、境界をダブルワード、ダブル(8バイト)を格納するために、MIPSでポインタ

addi $sp, $sp, -4 
s.d  $f10, 0($sp) 

8バイトであり、これは、私には意味をなさないメモリに取り込まれますが、スタックポインタは単一の単語境界を使用しているかのように動きます。 2つの倍精度値を格納するには、スタックポインターは、予想通り16ではなく、12ずつ減らされているようです:なぜこの現象が発生するのですか?サブルーチンが再帰的に呼び出されると問題が発生します(最初のアライメント、2番目のアライメントは実行されません)

を編集します。このコードはMARS 4.5で実行しています。 s.d $f10, 8($sp)

に翻訳されます
lui $1,0 
addu $1,$1,$29 
sdc1 $f10,8($1) 

この間にスタックポインタは移動されません。ステップスルーすると、sdc1は、$f10$f11の両方を一度にスタックに入れます。

+0

このコードを生成している人(つまり、what/whoがスタックポインタをどれくらい減らすかを決定しています)ですか? MARSでは、 's.d'はペソ命令です。おそらく、完全なプログラムの文脈における擬似命令拡張を見ることは、あなたの質問に答えるのに役立ちます。 – Zack

+0

@Zack元の投稿を更新しました。 – qwr

+0

私はまた、スタックポインタが8ではなく4で減るべきだと思います。あなたが8が正しくないと思うように導くのは何ですか? – Zack

答えて

0

$ spがちょうど8の倍数以外の値に設定されているかどうかを確認してください。その場合は、andi $sp, $sp, 0xfffffff8を試してください。 $ SPを8の次の倍数にバンプする必要があります。しかし、$ spを元の値に正しく戻すことができるように注意する必要があります。

+0

'add $ sp、$ sp 、 '-4'と '$ sp、$ sp、4 'を追加します。これは本質的に同等です。 MARSのエラーの背後にある理由は、私がもっと興味を持っていることです。 – qwr

+1

MIPSでは、データを「整列」させる必要があります。つまり、ワードデータのアドレスは4の倍数でなければならず、ダブルワードデータのアドレスは8の倍数でなければなりません。$ spが8の倍数に初期化されるとしたら、整数をプッシュし、ダブルワードフロートを押します。 $ spはもはや8の倍数にならないので、2回目のプッシュは実行時エラーを引き起こします。上の 'andi'は '切り捨て'します。減算しません。 – Zack

関連する問題