函数调用和堆栈

时间:2014-07-08 05:57:20

标签: assembly

我正在读这本书并且它说(根据这个召唤惯例)它是这样做的:

注意:

The function looks like this:
function( int a, int b)
The function call looks like this:
function(2, 1)


push arguments for function a and b backwards onto the stack
function is called, and ret is "placed" onto the stack
Prolog is executed
EBP is pushed onto stack
Variables local to the function are pushed onto the stack

这就是它告诉我堆栈在这一点上的看法:

Low Memory
b
a
Ret
EBP
array
High memory

我的问题是(因为堆栈会减少内存地址):

为什么当a和b成为第一个被推入堆栈的东西时,它们位于顶部?为什么数组在这么高的地址?它是什么意思"向后推到堆栈"?

根据书中的汇编语言如下:

sub 0x8, esp
sub 0x8, esp
push 0x2
push 0x1

然后在反汇编函数里面说:

push ebp

这是我真的很困惑的地方,因为3个推送命令被执行了,怎么会把ebp放到a和b之前?

1 个答案:

答案 0 :(得分:1)

难怪你感到困惑,扔掉那本书。也就是说,也许这本书没有错,但你误解了它。

你没有说array是什么。假设在被调用函数中是一个局部,堆栈可能看起来像插图,虽然混合了低和高内存。

High Memory
b
a
Ret
EBP (saved EBP of caller)
array (local variables of called function)
Low memory