Pergunta

Se eu compilar:

int *a;

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

e depois desmontar main no cdb recebo:

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    

Então *a é simbolizado por pointersproject!a.Tudo certo.

Porém, se eu declarar o ponteiro dentro de main:

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

Vejo que a é apenas um deslocamento do ponteiro da pilha (acredito), em vez da estrutura legível por humanos que eu esperaria (como, digamos, 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

Provavelmente, trata-se tanto da minha compreensão do que o compilador faz quanto de qualquer outra coisa, exceto:alguém pode explicar por que a notação para a não é o que eu espero?

(Isso foi inspirado na reflexão ao observar a depuração x64 do Windows:Fundamentos práticos de Dmitry Vostokov).

Foi útil?

Solução

Quando uma variável é definida dentro de uma função, ela é uma variável automática, a menos que seja declarada explicitamente como estática.Tais variáveis ​​​​só permanecem durante a execução da função e normalmente são alocadas na pilha, portanto, são desalocadas quando a função termina.A mudança que você vê no código cumprido não se deve à mudança no escopo, mas à mudança de variável estática para automática.Se você fizer um estático, ele não será alocado na pilha, mesmo que seu escopo seja a função main.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top