Partilhar via


Overview of x64 Calling Conventions

Duas alterações importantes de x86 a x64 é o recurso de 64 bits addressing e um conjunto de plano de 16 registros de 64 bits para uso geral.Dado o conjunto expandido do registro, x64 usa apenas __fastcall que chama a convenção e um modelo RISC- base de manipulação de exceção.O modelo de __fastcall usa registros para que os primeiros quatro argumentos e o quadro de pilha passa os outros parâmetros.

As seguintes ajuda a opção de compilador você otimiza o aplicativo para x64:

Convenção de chamada

A interface de binária de aplicativo (ABI) de x64 é uma convenção de chamada de rápido- chamada de 4 registros, com pilha suporte para esses registros.Há uma correspondência um-para-um entre argumentos strict em uma função, e os registros para esses argumentos.Nenhum argumento que não couber em 8 bytes, ou não é 1, 2, 4, ou 8 bytes, devem ser passados por referência.Não há nenhuma tentativa de espalhar um único argumento por vários registros.A pilha de registro x87 não é usado.Pode ser usada, mas deve ser considerada volátil através de chamadas de função.Todas as operações de ponto flutuante são feitas usando os registros de 16 MMX.Os argumentos são passados em registros RCX, RDX, R8, e R9.Se os argumentos são flutuante/double, eles são passados em XMM0L, em XMM1L, em XMM2L, e em XMM3L.argumentos de 16 bytes são passados por referência.Passagem de parâmetro é descrito em detalhes em Parameter Passing.Além desses registros, RAX, R10, R11, XMM4, e XMM5 são voláteis.Todos outros registros são permanentes.O uso do registro está documentado em detalhes em Register Usage e em Caller/Callee Saved Registers.

O chamador é responsável para atribuir espaço para parâmetros para o receptor, e sempre deve atribuir espaço suficiente para os parâmetros 4 do registro, mesmo se o receptor não tem que vários parâmetros.Isso ajuda na simplicidade de suporte C unprototyped funções, e o vararg C/C++ funciona.Para o vararg ou funções unprototyped, todos os valores de flutuante devem ser duplicados no registro de uso geral correspondente.Todos os parâmetros anteriores dos primeiros 4 devem ser armazenados na pilha, acima de armazenamento reverso para os primeiros 4, antes da chamada.Os detalhes de função de Vararg podem ser encontrados em Varargs.Informações de função de Unprototyped é detalhada em Unprototyped Functions.

Alinhamento

A maioria das estruturas são alinhadas ao alinhamento natural.As exceções são principais o ponteiro de pilha e memória de malloc ou de alloca, que são alinhadas ao byte 16, para ajudar o desempenho.O alinhamento acima de 16 bytes deve ser feito manualmente, mas como 16 bytes são um tamanho comuns de alinhamento para operações de MMX, isso deve bastar para a maioria de código.Para obter mais informações sobre o layout e o alinhamento de estrutura consulte Types and Storage.Para obter informações sobre o layout da pilha, consulte Stack Usage.

Incapacidade de enrolar

Todas as funções de folha [as funções que nem chamam uma função, ou atribuem todo o espaço de pilha elas mesmas] devem ser anotadas com os dados [chamados de xdata ou ehdata, que são apontados de pdata] que descreve o sistema operacional como os desenrolar corretamente, para recuperar registros permanentes.Os prólogos e os epílogos são altamente restritos, de modo que eles possam ser corretamente descritos em xdata.O ponteiro de pilha deve ser alinhado a 16 bytes, exceto as funções de folha, em toda a região de código que não é parte de um epílogo ou um prólogo.Para obter detalhes sobre a estrutura apropriada de prólogo e de epílogos de função, consulte Prolog and Epilog.Para obter mais informações sobre manipulação de exceção e manipulação de exceções/de pdata e de xdata de desenrolamento consulte Exception Handling (x64).

Consulte também

Referência

x64 Software Conventions