は、何それは本当に意味:アセンブリレジスタ算術?あなたがMOVとアセンブリ内のLEA命令の両方を使用している場合は、誰かが書き込むとき
具体的mov DWORD PTR [esp+4], 0x80484c
lea eax,[ebp-40]
、彼らは[]内の情報を書くとき。私はleaがアドレスを移動し、movがコンテンツを移動することを知っていますが、leaまたはmovのアドレスを計算しているときに、実際にはどうなっていますか?それはCのポインタ算術と同じですか?
は、何それは本当に意味:アセンブリレジスタ算術?あなたがMOVとアセンブリ内のLEA命令の両方を使用している場合は、誰かが書き込むとき
具体的mov DWORD PTR [esp+4], 0x80484c
lea eax,[ebp-40]
、彼らは[]内の情報を書くとき。私はleaがアドレスを移動し、movがコンテンツを移動することを知っていますが、leaまたはmovのアドレスを計算しているときに、実際にはどうなっていますか?それはCのポインタ算術と同じですか?
lea
はない移動アドレスを行い、それは実効アドレスを計算し、デスティネーション・レジスタに得られたアドレスを格納します。アドレス計算は、C言語のポインタ演算ではなく、通常の演算で機械語で実行されます。
lea eax,[ebp-40]
レジスタebp
の値から40
を減算し、レジスタeax
に結果を格納します。
mov DWORD PTR [esp+4], 0x80484c
レジスタesp
に含まれる値に4
を加算することにより、宛先アドレスを計算し、最初にそのアドレスに、最下位バイトを4つのバイトを占有する32ビット整数値0x80484c
、整数8407116
を記憶します。
lea
は、式を計算して変数に保存するだけです。それは実際にはメモリまたはメモリアドレスでは何もしませんが、それは「ロード実効アドレス」と呼ばれます。
たとえば、lea eax,[ebp-40]
は、eax = ebp - 40
を意味します。
lea eax, [8 * eax + ebx + 10]
は、1つの命令でeax = 8 * eax + ebx + 10
を計算します。
そうでない場合は、たとえば、いくつかの命令を取る式を計算するのに使用することができます。
と[...]
と一緒に使用すると、メモリから/から何かを読み書きするので、Cのポインタを使用するような感じです。
mov DWORD PTR [esp+4], 0x80484c
これは、以下の擬似Cと同じ32ビット符号なし整数のメモリ・ロケーションesp + 4
に(DWORD
)値0x80484c
、すなわち保存します? `それはCでポインタ演算と同じ
*((uint32_t*)(esp + 4)) = 0x80484c;
それで、すべてのレジスタがビット/バイトなしで始まり、それらのレジスタに値を移動するには、それらのレジスタにバイトを追加する必要がありますか?だから私がEAXレジスタに32ビット整数を移動したいのであれば、mov DWORD PTR [EAX + 4](32ビットint)と言う必要がありますか? –
@JohnConradGeenty No.CPUレジスタはCPUの内部変数です。例えば、 'eax'は32ビットのレジスタであり、常に32ビットの変数を含みます。正確には32ビットの変数です。 (詳細については、GoogleのX86アセンブリレジスタについて) –
@JohnConradGeenty値をレジスタに移動するには、 'mov eax、(32ビット値)'を使用します。私は '[...]'だけで 'mov 'がメモリにアクセスすることに言及するために私の答えを編集しました。 –
されます' - いいえ、そうではありません。包括的な答えは、まともなx86アセンブリのドキュメント/ブックにあり、自由に入手できます。 –
'lea'には実際のメモリアクセスがないことに注意してください:単にオペランドのアドレスを計算して保存するだけです。コンパイラは時に符号なし算術演算を実行するためにこれを使用しますが、この場合はそうではありません。 –
アセンブリのドキュメントに包括的な回答が記載されているだけでなく、クイック検索で非常に包括的かつ明確な回答が多数見つかります。 –