相关疑难解决方法(0)

什么是基本指针和堆栈指针?他们指出了什么?

使用来自维基百科的这个例子,其中DrawSquare()调用DrawLine(),

替代文字

(请注意,此图表底部有高地址,顶部有低地址.)

任何人都可以解释我什么ebp,并esp在这方面?

从我看到的,我会说堆栈指针总是指向堆栈的顶部,而指针指向当前函数的开头?或者是什么?


编辑:我的意思是在Windows程序的上下文中

edit2:eip工作怎么样?

edit3:我有来自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
Run Code Online (Sandbox Code Playgroud)

所有这些似乎都是dwords,因此每个都占用4个字节.所以我可以看到从hInstance到4个字节的var_4之间存在差距.这些是什么?我认为它是返回地址,可以在维基百科的图片中看到?


(编者注:从迈克尔的答案中删除了长篇引文,该答案不属于该问题,但编辑后续问题):

这是因为函数调用的流程是:

* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
Run Code Online (Sandbox Code Playgroud)

我的问题(最后,我希望!)现在是,从我想要调用到prolog结尾的函数的参数弹出的瞬间发生了什么?我想知道ebp,esp是如何在那些时刻发展的(我已经理解了prolog是如何工作的,我只是想知道在我将参数推到堆栈之后和prolog之前发生了什么).

c c++ x86 assembly

215
推荐指数
5
解决办法
17万
查看次数

EBP帧指针寄存器的用途是什么?

我是汇编语言的初学者,并注意到编译器发出的x86代码通常在释放/优化模式下保持帧指针,当它可以使用EBP寄存器时.

我理解为什么帧指针可能使代码更容易调试,并且如果alloca()在函数内调用则可能是必要的.但是,x86只有很少的寄存器,并使用其中两个寄存器来保存堆栈帧的位置,当一个就足够了,对我来说没有意义.为什么即使在优化/发布版本中省略框架指针也是一个坏主意?

performance x86 assembly

87
推荐指数
3
解决办法
5万
查看次数

编译器使用局部变量而不调整RSP

问题编译器:了解从小程序生成的汇编代码,编译器使用两个局部变量而不调整堆栈指针.

不调整RSP以使用局部变量似乎不会中断安全,因此编译器似乎依赖于硬件在发生中断时自动切换到系统堆栈.否则,出现的第一个中断会将指令指针推入堆栈并覆盖本地变量.

该问题的代码是:

#include <stdio.h>

int main()
{
    for(int i=0;i<10;i++){
        int k=0;
    }
}
Run Code Online (Sandbox Code Playgroud)

该编译器生成的汇编代码是:

00000000004004d6 <main>:
  4004d6:       55                      push   rbp
  4004d7:       48 89 e5                mov    rbp,rsp
  4004da:       c7 45 f8 00 00 00 00    mov    DWORD PTR [rbp-0x8],0x0
  4004e1:       eb 0b                   jmp    4004ee <main+0x18>
  4004e3:       c7 45 fc 00 00 00 00    mov    DWORD PTR [rbp-0x4],0x0
  4004ea:       83 45 f8 01             add    DWORD PTR [rbp-0x8],0x1
  4004ee:       83 7d f8 09             cmp    DWORD PTR …
Run Code Online (Sandbox Code Playgroud)

c linux x86 assembly x86-64

9
推荐指数
1
解决办法
330
查看次数

标签 统计

assembly ×3

x86 ×3

c ×2

c++ ×1

linux ×1

performance ×1

x86-64 ×1