13

重複の可能性:
LEA命令の目的は何ですか?
LEA命令?

だから私はクラスのバイナリ爆弾の割り当てに取り組んでいます(プログラムのアセンブリコードをステップスルーし、「爆弾」をデコードするためのパスフレーズを見つける必要があるフェーズがたくさんあります)。

leaコマンドがわからないため、現在のフェーズを完了できません。私はそれが算術に一般的に使用されていることを読みました、しかし私はそれがどのようにそれをするのか理解していません。

私が特に見ているコマンドは

lea -0x18(%ebp), %ebx
lea -0x8(%ebp), %esi

続いて

mov -0x4 (%ebx), %eax
add -0x8(%ebx), %eax

次の行では、eaxとebxが比較され、等しい場合はプログラムが続行され、そうでない場合は爆弾が爆発します。

このフェーズについては、最初の2つが0と1である6つの数値が必要であることを十分に理解しました。その後、シーケンスの残りの部分が正しいかどうかを判断するためにいくつかの操作を行います(leaコマンドが次の番号を見つけるためにデコードする必要があります)。

今私が見つけられなかったのは、特に-0x18が何を指しているのかということです。負の符号は何をしますか?それは引き算を示していますか?ebpの18バイト前に見えますか?

ここで助けてくれてありがとう。

4

2 に答える 2

27

LEA 命令は、MOV 命令と同じ演算を使用してメモリ アドレスを計算します。ただし、MOV 命令とは異なり、LEA 命令は、アドレスの内容をロードして格納するのではなく、計算されたアドレスをターゲット レジスタに格納するだけです。

最初の LEA 命令について考えてみます。

lea -0x18(%ebp), %ebx

この命令は、-0x18 と EBP レジスタの値の合計を計算します。結果 S を取得します。S を EBX レジスタに格納します。

加数 -0x18 で、「-」はマイナス記号で、「0x」は 16 進定数であることを意味します。したがって、加数は負の 18 16で、これは -24 10です。したがって、この LEA 命令は単純に EBP の値から 24 を減算し、結果を EBX に格納します。

これを MOV 命令と比較してください。

mov -0x4(%ebx), %eax

この命令は、-0x4 と EBX レジスタの値の合計を計算します。結果 S を取得します。次に、メモリ内のアドレス S にあるワードの値をフェッチし、値 M を取得します。M を EAX レジスタに格納します。

于 2012-10-13T04:01:11.983 に答える
1

このLEA命令は、特定のアドレッシング モードで評価されるアドレスをデスティネーション レジスタにロードします。次の 2 つのケースを考えてみましょう。

lea -0x18(%ebp), %ebx
mov -0x18(%ebp), %ebx

最初の命令は、ebp の現在の値に対するオフセット -0x18 として計算されたアドレスを ebx にロードします。2 番目の命令は、このアドレスのメモリの内容を ebx にロードします。

負のオフセットは位置がレジスターのアドレスより下にあることを意味し、正のオフセットは位置がレジスターのアドレスより上にあることを意味します。メモリは、図の下部にゼロ アドレスがあり、アドレスが上部に向かって大きくなるように表すのが一般的です。

0xFFFFFFFC   !_______!
    ....
+0x4(ebp) -> !_______! 
(ebp) ->     !_______! 
-0x4(ebp) -> !_______! 
    ....
0x00000000   !_______!
于 2012-10-13T04:00:23.443 に答える