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