Partilhar via


Parâmetro de passagem

Os argumentos de quatro inteiro primeiro serão passados nos registradores.Valores inteiros serão passados em RCX, RDX, R8 e R9 (na ordem da esquerda para a direita).Quatro argumentos e superior será passado para a pilha.Todos os argumentos são direita justificados nos registradores.Isso é concluído para que o computador chamado pode ignorar os bits superiores do registro se precisam ser e pode acessar somente a parte do registro necessário.

Ponto flutuante e precisão dupla argumentos são passados em XMM0 – XMM3 (até a 4) com o slot de inteiro (RCX, RDX, R8 e R9) que normalmente seria utilizado para slot cardinais sendo ignorada (veja exemplo) e vice-versa.

__m128 tipos, matrizes e seqüências de caracteres nunca são passadas por valor imediato, mas em vez disso, um ponteiro será passado para a memória alocada pelo chamador. sistema autônomo estruturas/uniões de dimensionar 8, 16, 32 ou 64 bits e __m64 serão passados sistema autônomo se fossem inteiros do mesmo dimensionar.sistema autônomo estruturas/uniões diferente esses tamanhos serão passados sistema autônomo um ponteiro para a memória alocada pelo chamador.Para esses tipos agregados passados sistema autônomo um ponteiro (incluindo __m128), memória temporária alocada chamador será alinhado de 16 byte.

Funções intrínsecas que não alocar espaço de pilha e não telefonar outras funções podem usar outros registradores volátil para passar argumentos adicionais de registro porque não há uma forte ligação entre o compilador e a implementação da função intrínseca.Esta é uma oportunidade adicional para melhorar o desempenho.

O computador chamado tem a responsabilidade de despejar os parâmetros de registro no seu espaço de sombra se necessário.

A tabela a seguir resume como os parâmetros são passados:

Tipo de parâmetro

Como passada

Ponto flutuante

Primeiro 4 parâmetros – XMM0 através de XMM3.Outras pessoas passado na pilha.

Integer

Primeiro 4 parâmetros – RCX, RDX, R8, R9.Outras pessoas passado na pilha.

Agregações (8, 16, 32 ou 64 bits) e __m64

Primeiro 4 parâmetros – RCX, RDX, R8, R9.Outras pessoas passado na pilha.

Agregações (outros)

Pelo ponteiro.Primeiro 4 parâmetros passados sistema autônomo ponteiros de RCX, RDX, R8 e R9

__m128

Pelo ponteiro.Primeiro 4 parâmetros passados sistema autônomo ponteiros de RCX, RDX, R8 e R9

Exemplo de argumento passando 1 – todos os inteiros

func1(int a, int b, int c, int d, int e);  
// a in RCX, b in RDX, c in R8, d in R9, e pushed on stack

Exemplo de argumento passando 2 – floats todos os

func2(float a, double b, float c, double d, float e);  
// a in XMM0, b in XMM1, c in XMM2, d in XMM3, e pushed on stack

Exemplo de argumento passando 3 – ints misto e floats

func3(int a, double b, int c, float d);  
// a in RCX, b in XMM1, c in R8, d in XMM3

Exemplo de argumento passando 4 –__m64 __m128 e agregados

func4(__m64 a, _m128 b, struct c, float d);
// a in RCX, ptr to b in RDX, ptr to c in R8, d in XMM3

Consulte também

Referência

Convenção de chamada