首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基础cdb: cdb标记作用域的方式有变化吗?

基础cdb: cdb标记作用域的方式有变化吗?
EN

Stack Overflow用户
提问于 2011-05-19 01:24:08
回答 1查看 194关注 0票数 1

如果我编译:

代码语言:javascript
复制
int *a;

void main(void)
{
    *a = 1;
}

然后在cdb中反汇编main,我得到:

代码语言:javascript
复制
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:

代码语言:javascript
复制
void main(void)
{
    int *a;
    a = 1;
}

我看到a只是一个堆栈指针的偏移量(我相信),而不是我期望的人类可读的结构(比如pointersproject!main!a):

代码语言:javascript
复制
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调试:实用基础)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-19 01:58:15

当变量在函数中定义时,除非显式声明为静态变量,否则它是自动变量。这样的变量只在函数执行期间存在,并且通常分配在堆栈中,因此当函数退出时,它们会被释放。您在编译后的代码中看到的更改不是由于作用域的更改,而是由于从静态变量到自动变量的更改。如果你创建了一个静态,它将不会被分配到堆栈中,即使它的作用域是函数main。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6048602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档