Partilhar via


Passagem de parâmetro

Os primeiros quatro argumentos inteiros são passados em registros.Os valores inteiros são passados (na ordem esquerda para a direita) em RCX, em RDX, em R8, e em R9.Os argumentos e cinco mais alto são passados na pilha.Todos os argumentos box são justificados os registros.Isso é feito para que o receptor pode ignorar os bits superior do registro se necessário e pode acessar somente a parte do registro necessário.

Os argumentos e de ponto flutuante de precisão dupla são passados em XMM0 – XMM3 até (4) com o encaixe de inteiro (RCX, RDX, R8, e R9) que seria normalmente usado para o slot cardinal que está sendo ignorado (consulte o exemplo) e vice-versa.

os tipos , matrizes e as cadeias de caracteres de__m128 nunca são passados pelo valor imediato mas um ponteiro é passado em vez na memória atribuída pelo chamador.Estruturas/uniões de __m64 de tamanho 8, 16, 32, ou 64 bits e é passado como se fosse inteiros do mesmo tamanho.Estruturas/uniões diferentes desses tamanhos é passado como um ponteiro para a memória alocada pelo chamador.Para esses tipos agregados passados como um ponteiro (incluindo __m128), a memória temporária chamador- atribuída será o byte 16 alinhado.

As funções intrínsecas que não usa o espaço de pilha e não chamam outras funções podem usar outros registros temporários para passar argumentos adicionais do registro porque há uma associação apertado entre o compilador e a implementação de função intrínseca.Esta é uma oportunidade adicional para melhorar o desempenho.

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

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

Tipo de parâmetro

Como passado

Ponto flutuante

Primeiros 4 – parâmetros XMM0 com XMM3.Outro passados na pilha.

Integer

Primeiros 4 – parâmetros RCX, RDX, R8, R9.Outro passados na pilha.

Bit das agregações (8, 16, 32 ou 64), e o __m64

Primeiros 4 – parâmetros RCX, RDX, R8, R9.Outro passados na pilha.

Agregados (outro)

O ponteiro.Primeiros 4 parâmetros passados como ponteiros em RCX, em RDX, em R8, e em R9

__m128

O ponteiro.Primeiros 4 parâmetros passados como ponteiros em RCX, em RDX, em R8, e em R9

Exemplo do argumento que passa 1 – todos os números 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 do argumento que passa 2 – tudo flutua

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 do argumento que passa 3 – ints e flutuadores mistos

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

Exemplo do argumento que passa 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