如果我编译:
int *a;
void main(void)
{
*a = 1;
}然后在cdb中反汇编main,我得到:
pointersproject!main:
00000001`3fd51010 mov rax,qword ptr [pointersproject!a (00000001`3fd632f0)]
00000001`3fd51017 mov dword ptr [rax],1
00000001`3fd5101d xor eax,eax
00000001`3fd5101f ret 所以*a用指针项目来表示!a.一切都很好。
但是,如果我在main:
void main(void)
{
int *a;
a = 1;
}我看到a只是一个堆栈指针的偏移量(我相信),而不是我期望的人类可读的结构(比如pointersproject!main!a):
pointersproject!main:
00000001`3fd51010 sub rsp,18h
00000001`3fd51014 mov rax,qword ptr [rsp]
00000001`3fd51018 mov dword ptr [rax],1
00000001`3fd5101e xor eax,eax
00000001`3fd51020 add rsp,18h
00000001`3fd51024 ret这可能是因为我对编译器所做的一切的理解,但是:有人能解释一下为什么a的符号不是我所期望的吗?
(这篇文章的灵感来自Dmitry Vostokov的Dmitry Vostokov的x64 Windows调试:实用基础)。
发布于 2011-05-19 01:58:15
当变量在函数中定义时,除非显式声明为静态变量,否则它是自动变量。这样的变量只在函数执行期间存在,并且通常分配在堆栈中,因此当函数退出时,它们会被释放。您在编译后的代码中看到的更改不是由于作用域的更改,而是由于从静态变量到自动变量的更改。如果你创建了一个静态,它将不会被分配到堆栈中,即使它的作用域是函数main。
https://stackoverflow.com/questions/6048602
复制相似问题