X86アセンブルコマンド--LEA
X86 Assemble Command Lea
LEA命令の説明
オペコード | ニモニック | 説明 |
---|---|---|
8D / r | LEA r16、m | mの実効アドレスをレジスタr16に格納します |
8D / r | LEA r32、m | mの実効アドレスをレジスタr32に格納します |
LEA命令
LEA命令は、第2オペランド(ソースオペランド)の実効アドレスを計算し、そのアドレスを第1オペランド(宛先オペランド)に保存するために使用されます。ソースオペランドは、CPUアドレッシングモードのメモリアドレッシングモード(オフセットをサポート)です。ターゲットオペランドは汎用レジスタ(GPR)です。この命令は、上記の表に示すように、アドレスサイズとオペランドサイズの属性の影響を受けます。命令のオペランドサイズは使用するレジスタによって異なり、アドレスのサイズはコードセグメントによって決定されます。
効果
LEA:実効アドレスをロードします。有効なアドレスをロードしてください。ソースオペランドのアドレスをデスティネーションレジスタにロードします。Note: not the actual address
たとえば、LEA EAX、[EBX + ECX]は、EBXとECXの値を計算するのと同じで、この値をEAXレジスタに保存します。理由:EBX + ECXによって計算された値はメモリアドレスであるため、メモリアドレスによって取得された値は[EBX + ECX]によって取得され、LEAコマンドは値の実効アドレスをロードして宛先レジスタに保存します。つまり、EBX + ECXの値をEAXレジスタに保存します
Since the payload is loaded instead of the actual address, EAX saves EBX+ECX instead of ds:EBX+ECX
インスタンス
- 複数のデータの操作を計算します
通常、複数のデータ追加が計算されます。たとえば、1 + 2 + EBXの値はEAXレジスタに配置されます。 ADDには3つの命令が必要です。
ADD EAX,1 ADD EAX,2 ADD EAX,EBX
LEAでは、必要なコマンドは1つだけです。
LEA EAX,[1+2+EBX]
- アドレスポインタを計算する
たとえば、1つstruct
Is a Pointがあり、intは32ビットと4バイトを占めます。したがって、ここでxcoord
オフセットは0、ycoord
オフセットは4、構造体全体のサイズは8バイトです。
struct Point { int xcoord int ycoord }
現在、ステートメントがある場合:
int y=points[i].ycoord
それらの中でpoints
はPoint
構造の配列です。そして、配列のベースアドレスが保存されています。EBX
レジスタに、i
値がEAX
レジスタに保存されます。したがって、このステートメントのアセンブリ命令は次のとおりです。
MOV EDX [EBX+8*EAX+4];
配列のベースアドレスはEBXレジスタにあり、各Point要素は8バイトを占有し、iはEAXレジスタに格納されているため、EBX + 8 EAXはpoints [i]のベースアドレスを取得し、ycoordのオフセットは4であるため、EBX + 8 EAX +4が取得するのはpoints [i] .ycoordです
will y
値はレジスタに保存されますEDX
そしてEBX+8EAX+4
値は実効アドレスです。
そして、Cには次のようなポインタがあります。
int *p = &points[i].ycoord
今回はLEA命令が必要です。
LEA ESI, [EBX+8*EAX+4]
結果は、配列のi番目のデータ構造になりますycoord
アドレスはESIレジスタに格納されます。これはp
inです。