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?

Foi útil?

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.

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