![]() |
1
5
额外空间有几个原因。一个是变量的对齐。第二种是引入填充来检查堆栈(通常是调试构建,而不是使用空间的发布构建)。第三个是为寄存器或编译器生成的临时变量的临时存储提供额外的空间。 在C调用序列中,通常情况下,会有一系列推送指令将参数推送到堆栈上,然后使用调用指令来调用函数。调用指令将把返回地址推送到堆栈上。 当函数返回时,调用函数将移除推送的参数。例如,对函数的调用(这是带有C++程序的Visual Studio 2005)看起来像:
这是将变量的地址推送到堆栈上,调用函数(函数名根据C++被篡改),然后在被调用的函数返回后,它通过向堆栈指针添加用于地址的字节数来重新调整堆栈。 以下是被调用函数的入口部分。这样做的目的是在堆栈上为局部变量分配空间。请注意,在设置入口环境之后,它将从堆栈中获取函数参数。
当函数返回时,它基本上将堆栈调整回调用函数时的位置。每个函数都负责在返回之前清除对堆栈所做的任何更改。
你提到你正试图更改回邮地址。从这些例子中,您可以看到返回地址位于推送到堆栈上的最后一个参数之后。 这是一个 brief writeup on function call conventions .也看看这个 document on Intel assembler instructions 。 在使用VisualStudio2005进行一些示例工作时,我看到的是,如果我执行以下代码,我就可以访问此示例函数的返回。
请注意,用于此Windows 32位寻址的调用汇编指令似乎将返回地址按字节顺序放置,其中返回地址是从低字节到高字节存储的。 |
![]() |
2
3
额外的空间用于堆栈对齐,这通常是为了获得更好的性能。 |
![]() |
Ilya Loskutov · 无法将单词加载到寄存器中 2 年前 |
![]() |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
![]() |
Arya · 汇编语言中的“标签”——操作码 3 年前 |
![]() |
S1mple · 通过gcc生成64位共享库时的“未定义的主引用” 3 年前 |
![]() |
R0M2 · 为什么“GCC”忽略汇编代码的-fno pic 3 年前 |
![]() |
Akagi Akira · 如何在gnu汇编程序中组装MIPS cpu 3 年前 |