2

私はアセンブリ (z80 および x86) を学習しており、現在、アセンブラを使用してバイナリをビルドすることに取り組んでいます。

(相対ではなく) 絶対アドレスでラベルを使用するにはどうすればよいですか?

私が理解していることから、アセンブラはコンパイル時にラベルをメモリアドレスに変換しますが、アセンブラは実行時にラベルが存在するアドレスをどのように知ることができますか?

プログラムを特定のメモリ アドレスにロードしRST、プログラム カウンタを0000h. オペレーティング システムが実行されているとどうなりますか?

callオペレーティング システム内で実行されるコードは、その開始アドレスを知らないのではないでしょうか (したがって、 やretラベルのような非相対オペコードを使用する方法がありません)。

4

4 に答える 4

2

CP/M のソリューションを読む価値があるかもしれません。これは単純で、バイナリは常に固定アドレスにロードされ、OS エントリ ポイントは常に別の固定アドレスにあるというものでした。これは、正式な OS を搭載したマシンであっても、8 ビット マシンではかなり一般的であり、MS-DOS にも引き継がれました。また、各プロセスが独自のアドレス空間を取得するため、MMU を利用するマルチタスク OS で技術的にも実現可能であるため、各バイナリは同じ場所にロードされたと考えることができます。

間の世代は再配置可能なコードを使用します。CPU が (Classic Mac OS および 68000 の PC に対する相対アドレス指定に従って) 簡単にサポートするため、場所に依存しないか、実際にはバイナリがロードされるときに従来の 2 パス アセンブラの 2 番目のパスが発生します。したがって、バイナリは、すべての絶対アドレスのプレースホルダーとそれらのプレースホルダーの場所のリストを使用してコンパイルされたコードであり、実際のアドレスが判明したらそれらを置き換えることができます。

唯一の問題は、高速な仮想メモリが妨げられることです。非 MMU Mac OS アプローチでは、プログラムは 16kb のチャンクとしてコンパイルされ、各チャンク内のジャンプは直接発生し、リモート ジャンプはページャーを介して行われます。ターゲットチャンクがロードされている場合はオフになり、そうでない場合はロードされてからジャンプが発生します。ロードのたびにアドレスを計算して入力する必要がある場合、このようなオンデマンドのロードは非常に困難です。

于 2014-11-28T21:32:30.863 に答える
0

あなたのプログラムは 64 kb より短くなると思います。この場合、プログラムはラベルの OFFSET (ニアジャンプと呼ばれる) を知るだけで済みます。オペレーティング システムは、毎回同じ OFFSET でプログラムを開始しますが、別のセグメントで開始します。条件付きジャンプと「jmp short」は、jmp コマンドとラベルの違いのみを使用します。プロシージャが実行前にスタックに格納されるなどの特殊なケースでは、コンパイラは jmp コマンドの引数を変更するコードを挿入します。

于 2014-11-28T07:39:52.743 に答える
-2

アセンブラはオフセットを使用します。

LABEL
     . . . . . 

     JMP LABEL // Knows the number of bytes to label. SO label can be anywhere.
于 2014-11-28T02:26:07.830 に答える