2

次のコードを見てください:
(ebp-0x8 -> int)
(ebp-0x4 -> int*)

=> 0x80483f3 <main+6>:  mov    DWORD PTR [ebp-0x8],0x0
   0x80483fa <main+13>: mov    DWORD PTR [ebp-0x4],0x0
   0x8048401 <main+20>: mov    DWORD PTR [ebp-0x8],0xa

   0x8048408 <main+27>: lea    eax,[ebp-0x8]
   0x804840b <main+30>: mov    DWORD PTR [ebp-0x4],eax

   0x804840e <main+33>: mov    eax,0x0
   0x8048413 <main+38>: leave  
   0x8048414 <main+39>: ret  

LEA コマンドは本当に必要ですか? 左の間違ったアドレスに関係なく、次の式が間違っていて無効であることは知っていますが、このようにする同様の方法はありませんか?

=> 0x80483f3 <main+6>:  mov    DWORD PTR [ebp-0x8],0x0
   0x80483fa <main+13>: mov    DWORD PTR [ebp-0x4],0x0
   0x8048401 <main+20>: mov    DWORD PTR [ebp-0x8],0xa

   0x804840b <main+30>: mov    DWORD PTR [ebp-0x4],ebp-0x8

   0x804840e <main+33>: mov    eax,0x0
   0x8048413 <main+38>: leave  
   0x8048414 <main+39>: ret

無理だとは思いますが、確認したかったのです。

最後の質問ですが、この式ebp-0x8は理論的には「レジスタの内容ebpから差し引いた値0x8を返します。したがって、この式[ebp-0x8]は、アドレス"レジスタの内容から"をebp引い0x8た値のメモリの内容を返します。ここで、メモリ内のいくつかのバイトの内容のみを取得する場合、LEA コマンドがメモリ アドレスを取得する方法を知りたいと思っています。

ばかげた質問で申し訳ありませんが、[ ]は非常に紛らわしい場合があります。

4

2 に答える 2

3

2 番目のコード スニペットを機能させるには、別の命令として減算を行う必要があります。つまり、代わりに

DWORD PTR [ebp-0x4],ebp-0x8

あなたが必要だろう

mov eax,ebp
sub eax,0x8
mov DWORD PTR [ebp-0x4],ax

使用する利点はlea、算術演算と mov 命令を組み合わせることです。したがって、2 つの命令の代わりに

mov eax,ebp
sub eax,0x8

単一の命令を使用できます

lea eax,[ebp-0x8]

このlea命令は、「実効アドレスをロードする」ことを意味します。2 番目のオペランドはアドレスを指定し、そのアドレスを計算するために必要な計算は、プロセッサ内のアドレス生成ロジックによって行われます。

一方sub、命令は、プロセッサの汎用算術論理演算ユニット (ALU) を使用します。

要約すると、このlea命令は、プロセッサのアドレス生成ロジックを使用して 2 つの命令を 1 つに結合し、そうでなければ ALU で行う必要がある数学的計算を実行します。

于 2015-10-04T08:14:05.500 に答える
1

いいえ、それは無効な式です。[] ブラケットを指定する場合を除いて、 mov source operandでメモリ アドレスを使用して数式を実行することはできません。これは、メモリ アドレスから値を逆参照するという別の意味です (これは、C ポインタをその値を取得します)

アドレスで数式を作成する方法は、LEA 命令を使用することです。これは、例では次のとおりです。

lea    eax,[ebp-0x8]
mov    DWORD PTR [ebp-0x4],eax

leaの動作はmov命令とは大きく異なることに注意してください。

これは、 lea命令の Intel マニュアルからの最初の定義です。

第 2 オペランド (ソース オペランド) の実効アドレスを計算し、それを第 1 オペランド (デスティネーション オペランド) に格納します。

movはデータ転送命令として知られていますが、leaは主に数学演算を使用してアドレスを計算するために使用されます。

これは、 movleaの違いのいくつかの例です。

mov eax, [ebp-0x8]   ; compute new address ebp-0x8 and get its value from new address
mov eax, ebp-0x8     ; this is invalid
lea eax, [ebp-0x8]   ; compute new address ebp-0x8 and give it to eax
于 2015-10-04T08:30:45.710 に答える