0

誰でもこのコマンドを理解するのを手伝ってくれますか:

mov %esp,%edi

lea 0x10(%edi),%esi

最初にesptoのアドレスを読み込みますedi。次に、 の値をロードします。edi+10つまり、 のアドレスesp+10ですesi。しかし、それはスタックにとって何を意味するのでしょうか? プッシュしたらスタックに4バイト書き込みますよね?そして、スタック上で 10 バイト戻った場合、このポイントはどこにあるのでしょうか?

|______|         # here?
|______|
|______|
|______|
|______|
|______|
|______|
|___*__|         # or at the position of the star?
|______|         # 4 Byte
|______|         # also 4 Byte long...
|______|   <---%edi
4

1 に答える 1

0

あなたは x64 ではなく x86 を使用していますよね? これを仮定します。

「これはスタックにとって何を意味するのか?」

mov %esp,%edi
lea 0x10(%edi),%esi

pushこのコードは、スタック操作 ( 、pop、ect)には影響しません。これは、スタック操作がespスタック ポインターとしてレジスターで機能するためです。上記のコードは変更されないespため、スタックに関する限り、何も変更されません。

「プッシュすると、スタックに 4 バイトが書き込まれますよね?」:

必ずしも。x86 は、16 ビットおよび 32 ビットのオペランドでのプッシュ操作をサポートしているため、スタックに書き込むバイト数は、プッシュするもののサイズによって異なります。例えば:

push %ax  ; will push 2 bytes on the stack (sizeof(ax) == 2)
push %eax ; will push 4 bytes on the stack (sizeof(eax) == 4)

push も だけ減算espすることに注意してくださいsizeof(op1)

「スタック上で 10 バイトジャンプすると、このポイントはどこにあるのでしょうか?」

上のleaコマンドはesi、スタック ポインタを変更しません。そう、

nop                   ; 10 points back on the stack here
mov %esp,%edi       
lea 0x10(%edi),%esi
nop                   ; will be the exact same location as here.
                      ; relative to esi, this location is (esi - 26)
于 2013-06-11T15:41:51.890 に答える