DrawSquare()
调用DrawLine()
:
有人能解释一下在这个上下文中
ebp
和esp
是什么吗?从我所看到的,我会说栈指针总是指向栈的顶部,而基指针指向当前函数的开头,对吗?
编辑:我是指在Windows程序的上下文中。
编辑2:那么
eip
是如何工作的呢?编辑3:我有来自MSVC++的以下代码:
var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr 8
hPrevInstance= dword ptr 0Ch
lpCmdLine= dword ptr 10h
nShowCmd= dword ptr 14h
所有这些似乎都是双字(dwords),因此每个占用4个字节。所以我可以看到从
hInstance
到var_4
之间有4个字节的间隙。它们是什么?我猜它是返回地址,正如维基百科的图表中所示。
(编辑注:从迈克尔的回答中删除了一段长引文,该引文不属于问题,但编辑了一个后续问题):
这是因为函数调用的流程如下:
- 推送参数(hInstance等) - 调用函数,该函数推送返回地址 - 推送ebp - 为局部变量分配空间 我的问题(希望这是最后一个!)是,从我弹出要调用的函数的参数到过程前导结束时,到底发生了什么?我想知道ebp和esp在这段时间内是如何演变的(我已经理解了前导的工作,我只想知道在我将参数推入堆栈之后和前导之前发生了什么)。