Базовый cdb: изменяется ли cdb в зависимости от области видимости?

Если я скомпилирую:

int *a;

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

а потом разбирать main в cdb получаю:

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 не соответствует ожиданиям?

(Это вдохновлено размышлениями при взгляде на отладку Windows x64: практические основы Дмитрия Востокова).

1 ответ

Решение

Когда переменная определена внутри функции, она является автоматической переменной, если явно не объявлена ​​как static. Такие переменные существуют только во время выполнения функции и обычно размещаются в стеке, поэтому они освобождаются при выходе из функции. Изменение, которое вы видите в соответствующем коде, связано не с изменением области действия, а с изменением статической переменной на автоматическую. Если вы сделаете статический объект, он не будет размещен в стеке, даже если его область действия - функция main.

Другие вопросы по тегам