2016-05-02 15 views
2

私は現在、MIPS-アセンブラでいくつかのものを書いていますし、私はいくつかの問題があります。私は、この関数を書いた を:アセンブラ - スキップ指示

PRINT_FLOAT: 

     addi $sp, $sp, -4  #stackpointer um ein wort weiterrücken 
     sw $ra, 0($sp)   #rücksprungadresse auf stack speichern 
     la $a0, strFloat 
     add $a1, $s0, $zero 
     jal printf 
     lw $ra, 0($sp)   #rücksprungadresse aus stack holen 
     addi $sp, $sp, 4  #stackpointer um ein wort zurückrücken 
     jr $ra 

私は命令は$ A1、$ S0を追加し、このプログラムを実行する場合、私はGDBと、このプログラムデバッグする場合、

もう面白い... $ゼロがスキップされ、なぜ私にはわからない:

main: 

     addi $t0, $zero, 3 
     addi $t0, $zero, 3 
     addi $t0, $zero, 3 
     jal READ_FLOAT 

     jal PRINT_FLOAT 

をメインにブレークポイントを設定し、ブレークポイントがあります3番目の「addi $ t0、$ zero、3」に設定します ここではどうなりますか?

+0

最適化で組み立てていますか?それは3つの 'addi'ステートメントで意味をなさないでしょう。なぜなら、それらのステートメントはすべて同じものを2つ作るからです。 –

+0

あなたのアセンブラは分岐遅延スロットにaddを入れていますか?あなたの分解はこのコードのために何を示していますか?私はgnuアセンブラを最後に使ったときに、単に命令をブランチとスワップしただけで、明示的にそれを指示しなくてはなりませんでした。またはアーキテクチャに分岐遅延スロットがないことを伝えます。 –

答えて

1

gdbは高レベルのソースデバッガですので、命令ごとに命令でasmを処理するのは少し難しくなります。

たとえば、Cコードをステップ実行するには、通常は「s」[step]コマンドが使用されます。しかし、gdbは、単一のCステートメントの一部であるとみなすasmシーケンスを「踏み越え」ます。

個々のasm命令をステップ実行するには、「si」[ステップ命令]コマンドが必要です。 help si

同様に、ブレークポイントを設定するときは、コマンドの変更された形式を使用します。 break * whateverを使用して、のアドレスwhateverにブレークポイントを設定します。 help break

正しいアドレスを取得するには、ビットを逆アセンブルする必要があります。help disassemblehelp xを参照してください。単一の命令を逆アセンブルする場合は、x/i ...も機能します。

dwelchが指摘したように、あなたのアセンブラは「かわいくなる」かもしれないし、物事を並べ替えるかもしれません。 gdbに分解をさせることで、これが起こったかどうかを知ることができます。また、分岐遅延スロットが実際のプロセッサでが有効/有効になっている場合は、それらを考慮する必要があります。たとえば、spimまたはmarsのようなシミュレータで実行する場合、分岐遅延スロットの使用は設定可能であり、デフォルトではオフですが、実際のプロセッサでは選択肢がない可能性があります。

私はこのプログラムに命令を実行した場合$ A1、$ S0を追加し、$ゼロがスキップされ、私はなぜ知らない...あなたはadd $a1,$s0,$zero思い理由かもしれ

命令はスキップされています。 [「ステップ」を有する] gdbは単一のブロックとして以下扱う。

la  $a0,strFloat 
    add  $a1,$s0,$zero 
    jal  printf 

ブレークポイントは、上記と同様の理由により、再び

addi $t0, $zero, 3に設定されています。 breakpointコマンドの代わりの形式を使用します。

0

関数でブレークポイントを設定し、デバッグ情報がない場合、gdbはfunction prologueの後にブレークポイントを設定しようとします。

Gdbは機械命令を解析してプロローグを検出します。 "addi $ sp、$ sp、-4"はプロローグとして認識されるようですが(私はMIPSの専門家ではないので間違っているかもしれません)

組み立て時またはリンク時にデバッグ情報を有効にし、gdbには利用可能なフレームに関する詳細情報が必要です。

メイン(disasメイン)を逆アセンブルして、ブレークポイントを "break main"の代わりに最初の命令のアドレス(break * 0xabcdefのように)に設定することもできます。

+0

私は "addi $ sp、$ sp、-4"を見直したMIPS disassembyに基づいて、スタックサイズを4バイト増加させます。通常、関数addi $ sp、$ sp、4の終わりには、スタックを同じ量だけ減らすための補完線があります。 – James

関連する問題