0

HDL で定義されたプロセッサで実行する単純な SMIPS アセンブリ テストを作成しています。

たとえば、オーバーフロー例外を生成する次のコードがあります。

main:

        #Test Overflow Exception

        addi $2, $0, 0xffffffff
        addi $3, $2, 0x1  

プロセッサが正しいことをしている場合、アドレスに配置されているハンドラにリダイレクトする必要があることを私は知っています0xdeadbeef。上記に次のコードを追加する場合のように、ジャンプのラベルを追加することしか知りません。

overflowHandler: 
        addiu $5 $0, 1
        bne   $0, $5, pass

overflowHandler コードを正しい 0xdeadbeef アドレスで開始する方法はありますか? main はアドレス 0 から始まりますか?

EDIT:(HDLで記述されたプロセッサからのジャンプアドレスを制御しています)

Bluespec のプロセッサ設計の記述からプロセッサ ジャンプ アドレスを制御できるので、それを 4 で割り切れる値に変更して、より近いより便利な場所にジャンプできます。だから私の質問は: アドレスはメインの先頭にあるアドレス 0x0 からカウントを開始しますか?? 最善の解決策は何ですか?: アドレス ジャンプまたはそれに対応するラベルを変更しますか?

前もって感謝します、

4

2 に答える 2

0

この質問にはあまり明確に答えられていません。原則として、一部のラベルのアドレスは、アセンブラー(および/またはリンカー)によって自動的に割り当てられ、多くの要因に依存します。

アセンブラには常に、コードとラベルがアドレス空間のどこに配置されるかをプログラマーがある程度制御できるようにするいくつかのディレクティブがあります。「org」ディレクティブは、アセンブルプロセスの現在のアドレスを設定するためによく使用されます。

ほとんどのアセンブラでは、次のコードはラベルoverflowHandlerを0xdeadbeefに等しく設定します。

                   org 0xdeadbeef ; or any other number
overflowHandler:   
                  ; some code here

しかし、繰り返しになりますが、それは特定のアセンブラー構文に依存します(そして、それらは、原則として、異なる実装間で異なります)。もう1つの問題は、適切にコンパイルされたとしても、コードをメモリの適切なアドレスにロードする必要があることです。このタスクはアセンブラタスクではなく、リンカ、OSのタスクであり、使用されるバイナリファイル形式にも依存します。

ほとんどのオペレーティングシステムでは、プログラマーはバイナリファイルがロードされるアドレスを自由に選択できないことに注意してください。

ここでの適切なアプローチは、プロジェクトに使用されるツール(アセンブラー構文(プロセッサー命令ではなくアセンブラーディレクティブを意味します)、リンカー機能、使用されるバイナリ形式、および実行のためにこのコードをロードするオペレーティングシステム関数)を注意深く学習することです。

于 2013-01-31T22:54:01.317 に答える
0

プロセッサは Bluespec でモデル化されているため、メモリの内容を含むテキスト ファイルを読み取るVerilog の$readmemh()関数を使用して、実行されるコードがプロセッサのメモリにロードされるようです。$readmemh()関数への引数とテキスト ファイル内のアドレス指定子を使用して、コードをロードするアドレスを決定するのは、Bluespec モデル作成者次第です。

メモリの内容を含むテキスト ファイルを作成する最も簡単な方法は、アセンブリ ソース コードを MIPS アセンブラで実行し、アセンブラのソース コード リストから 16 進数のオペコードを抽出することです。

質問: 「アドレスはアドレス 0x0 から数え始めますか?」

MIPS プロセッサ0x1cf00000は、リセット時にコードの実行を開始します。( Simple MIPSプロセッサは、0x00001000リセット時に から開始します。) 通常は、テスト プログラムの先頭へのジャンプをリセット アドレスに配置します。0x0アドレスで実行するテスト プログラムをロードすると、JR $zero動作するはずです。

テスト プログラム内の分岐はすべて相対アドレスにする必要があるため、テスト コード内でラベルのアドレスを指定するために特別なことを行う必要はありません。PASS と FAIL の既知の場所に分岐する必要がある場合は、次のようにします (PASS が address にあると仮定します0x4000)。

LI $t0, 0x4000
JR $t0
于 2013-01-30T21:30:30.990 に答える