使用汇编语言访问堆栈帧

时间:2013-05-22 08:27:16

标签: assembly masm stackframe

我是汇编新手,然后遇到了这个article

它说这段代码

void MyFunction()
{
  int a, b, c;
  a = 10;
  b = 5;
  c = 2;

等同于此

push ebp     ; save the value of ebp
mov ebp, esp ; ebp now points to the top of the stack
sub esp, 12  ; space allocated on the stack for the local variables
mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c

根据这个video,要访问基指针上方的堆栈值,我们应该添加。如果它低于指针,我们应该减去。鉴于上面的例子,他们从基指针中减去一些东西来移动所需变量的位置,这与视频中所述的相反。

我错过了什么?我知道sub esp,12正在为局部变量分配一个空间,所以我想到的是EBP低于那个分配,所以我认为它应该是[ebp + something]而不是减去。

所以当他做这个子esp,12时,这就是Stack的样子。

            ESP is here
|     2    | Ebp + 12
|     5    | Ebp + 8
|     4    | Ebp + 4
|          | Old EBP value

文章错了,还是我错了?

2 个答案:

答案 0 :(得分:6)

使用ebp的原因是esp会改变,例如将参数传递给子例程。所以你的ebp将使你能够使用相同的偏移量访问相同的变量,无论esp指向那一刻。

当你在堆栈上推送值时,它的值会递减;弹出时递增。

代码减去12(4 * 3),为3个32位(4字节)整数腾出空间。 Ebp指向“底部”,其中esp在之前。所以你使用负偏移来访问变量,例如EBP-4。所以你的图片是错的:ebp +无论你的代码不应该使用什么东西。

     BEFORE

     lower address
     |
     |<--------------  esp (=ebp after mov ebp, esp)
     |
     | 
     higher address


     AFTER mov ebp, esp; sub esp, 12

     lower address
     |<--------------  esp
     |
     |
     |<--------------  ebp
     |
     | 
     higher address


     AFTER mov [ebp-4], 10 ecc.

     lower address
     | 2  <--------------  esp
     | 5
     | 10
     |<--------------  ebp
     |
     | 
     higher address

此时[esp]将检索[ebp-12],即2.

答案 1 :(得分:2)

stack-pointer(基指针) - 地址向下“增长”,朝向地址空间中的较低地址。
您的堆栈从例如0x70000000开始,当您push上的内容时,esp (ebp)将被dword降低 - &gt; 0x6ffffffc(如果我是对的)。

请参阅hereherehere