Quem é responsável pela limpeza?
-
12-09-2019 - |
Pergunta
Gostaria de saber qual é responsável pela limpeza da pilha
Suponha que você tenha um divertimento função permite digamos assim:
var = fun(int x, int y, float z, char x);
quando fun
será chamado ele vai para a pilha juntamente com os parâmetros, em seguida, quando a função retorna, que é responsável pela limpeza da pilha é a função que eu ou o "var", que irá realizar o valor de retorno.
Mais uma coisa, alguém pode explicar os conceitos de chamar convenções?
Solução
convenção de chamada refere-se ao que está fazendo a limpeza da pilha; chamador ou callee.
Convenções de chamada pode diferir em:
- em que parâmetros e valores de retorno são colocados (em registos; na chamada pilha; uma mistura de ambos)
- a ordem em que os parâmetros são passados ??(ou partes de um único parâmetro)
- como a tarefa de criar e limpar uma chamada de função é dividido entre o chamador e o receptor.
- que registros que pode ser usado diretamente pelo receptor pode, por vezes, também ser incluídos
Arquiteturas quase sempre têm mais de uma convenção de chamada possível.
Outras dicas
Você consultar a resposta a si mesmo: Convenções de chamada
.A convenção de chamada é semelhante a um contrato . Ela decide as seguintes coisas:
- Quem é responsável para a limpeza dos parâmetros.
- Como e em que ordem os parâmetros são passados ??para a função chamada.
- Quando o valor de retorno é armazenado.
Existem muitas convenções de chamada diferentes, dependendo da plataforma e do ambiente de programação. Duas convenções de chamada comuns nas plataformas x86 são:
stdcall
Os parâmetros são passados ??na pilha da direita para a esquerda. O chamado função limpa a pilha.
cdecl
Os parâmetros são passados ??na pilha da direita para a esquerda. O chamando função limpa a pilha.
Em ambos os casos, o valor de retorno é no registo EAX
(ou ST0
para valores de ponto flutuante)
Muitas linguagens de programação para a plataforma x86 permite especificar a convenção de chamada, por exemplo:
Delphi
function MyFunc(x: Integer): Integer; stdcall;
Microsoft C / C ++
int __stdcall myFunc(int x)
Algumas notas de uso:
Ao criar uma aplicação simples raramente é necessário para mudar ou para saber sobre a convenção de chamada, mas há dois casos típicos em que você precisa se preocupar com convenções de chamada:
- Ao chamar bibliotecas externas, Win32 API por exemplo: Você tem que usar convenções de chamada compatíveis, caso contrário, a pilha pode ter corrompido .
- Ao criar código inline assembler: Você tem que saber em que registros e onde na pilha você encontrar as variáveis ?? .
Para obter mais detalhes, eu recomendo estes artigos da Wikipédia:
No momento em que a linha é var completo vai conter o valor retornado pela fun () e qualquer memória na pilha usada por diversão será ido:. "Push", "pop" tudo arrumado
Chamando convenções: tudo o que o compilador organiza para que diversão pode fazer o seu trabalho. Considerar os parâmetros x, y, z. Qual a ordem que eles são empurrados para a pilha (na verdade eles são passadas através da pilha)? Não importa, desde que o chamador e chamado concordar! É uma convenção.