0

谁能帮我理解这个命令:

mov %esp,%edi

lea 0x10(%edi),%esi

首先我加载espto的地址edi。然后我加载 的值edi+10,即esp+10to的地址esi。但这对堆栈意味着什么?如果我进行推送,我会在堆栈上写入 4 个字节,对吗?如果我在堆栈上跳回 10 字节,这一点在哪里?

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

1 回答 1

0

您使用的是 x86,而不是 x64,对吗?我将假设这一点。

“这对堆栈意味着什么?”

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

此代码不会影响您的堆栈操作(push、、pop等)。那是因为堆栈操作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 也会减去espsizeof(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 回答