を計算する方法を知っているあなたは実効アドレスは上記のそれは^場所での計算はどうすればよい は、誰もが実効アドレス
MOV EAX, [label1] ; label1 is at location 0x00D5A360
NASM
アセンブリ内でこの命令があるとします。アドレッシングモードがDirectであることがわかりました。
を計算する方法を知っているあなたは実効アドレスは上記のそれは^場所での計算はどうすればよい は、誰もが実効アドレス
MOV EAX, [label1] ; label1 is at location 0x00D5A360
NASM
アセンブリ内でこの命令があるとします。アドレッシングモードがDirectであることがわかりました。
nasm label
はラベルのアドレスを指し、[label]
はそこに格納されている値を取得します。だから、行うことができます。
mov eax, label1 ; eax <- 0x00D5A360
それとも万能lea
(ロード有効アドレス)を使用します。
lea eax, [label1] ; eax <- 0x00D5A360
それとも、アセンブラが実効アドレスを決定する方法を求めているの?これは、アセンブラ、オプションでリンカとローダによって組み合わせて処理されるためです。通常、コードはrelocationsで中間オブジェクト形式にコンパイルされ、リンカーまたはローダーはlabel1
の実効アドレスの計算を処理します。 「:第2巻インテル64およびIA-32アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル」:から
よくわかっているのは、アセンブラからの実効アドレスを計算する方法です。例えば、i行目の例です。 MOV EAX、[label1]; label1は0x00D5A360の位置にあります 有効なアドレスは0x00d5a360です –
@Shawnricshawnawic:それでは、私の答えの2番目が関係しています。環境/出力形式に応じて、静的に(ORGディレクティブでこれに影響を与えることができます)、リンク時に(externシンボルで)、実行時に(externシンボルでも)影響を受けます。 – user786653
完璧なおかげで私は新しいテクニック "lea"を学んだことを理解していますLOLがあなたに大変感謝してくれたと思っていたロード有効なアドレス: –
LEA r16, m ; Store effective address for m in register r16. LEA r32, m ; Store effective address for m in register r32. LEA r64, m ; Store effective address for m in register r64.
は、(第2オペランド(ソースオペランド)の実効アドレスを計算し、最初のオペランドに格納しデスティネーションオペランド)。ソース・オペランドは、プロセッサのアドレッシング・モードの1つで指定されたメモリ・アドレス(オフセット部分)です。デスティネーション・オペランドは汎用レジスタです。
例:
; indirect addressing mode
MOV EBX, label1 ; copy the address of label1 to EBX
MOV [EBX], 100 ; store 100 at the location pointed to by EBX
; using LEA
LEA EBX, [label1] ; stores the effective address of label1 in EBX
MOV [EBX], 100 ; store 100 at the location pointed to by EBX
2つの違いは、MOV
バージョンが組み立て時に実効アドレスを解決し、一方LEA
は、実行時に実効アドレスを計算することです。
これは基本的にLEAをタイプし、実効アドレスは画面に表示されますか?これを行うための手作業の方法がありますか?コンピュータの使用 –
私はNasmに精通していません。 MIPSアセンブラでは、ラベルへのジャンプコマンドは相対値、すなわち、現在の行とラベルが付いている行との間の行数を使用します。 NASMはシンプルなMIPSとはかなり違っているようだが、私はこのMOVコマンドがラベルで何をしているのか分からない。 – melak47
これ以上の計算はありません!命令の第2部分としての32ビット番号(0x00D5A360)** MOV EAX **は直接メモリ位置を指します。 –