ID do artigo: 100832 - Última revisão: sexta-feira, 9 de dezembro de 2005 - Revisão: 5.0

Descrição das convenções de chamada que ofereça suporte o compilador de 32 bits

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Observação Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 oferece suporte tanto o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e modelo de código não gerenciado Microsoft Windows nativo. As informações contidas neste artigo se aplicam somente ao Visual C++ não gerenciado código.

Observação Microsoft Visual C++ 2005 oferece suporte o modelo de código gerenciado que é fornecido pela .NET Framework e o modelo de código nativo não gerenciado do Windows.
Expandir tudo | Recolher tudo

Sumário

O Visual C++, 32-bit Edition, oferece suporte a três convenções de chamada: C (_cdecl), padrão ( _stdcall ) e fastcall ( _fastcall ). O compilador não oferece suporte a Pascal convenção de chamada ( _pascal ) fornecida pela Microsoft compiladores para MS-DOS e Windows de 16 bits.

A tabela a seguir resume as convenções de chamada.
                          _cdecl         _stdcall       _fastcall

   -------------------------------------------------------------------
   Arguments              Pushed R to L  Pushed R to L  Note 3
   Stack cleaned up by    Caller         Called         Called
   Naming convention      Prepend "_"    Note 1         Note 2
				
Observação 1 _stdcall convenção de chamada decora cada nome de função prepending um caractere de sublinhado (como a convenção _cdecl ) e acrescentando um símbolo arroba "@" e a representação decimal do número de bytes de espaço de pilha necessário. Cada argumento é ampliado para um múltiplo de quatro bytes.
Observação 2 _fastcall convenção de chamada decora cada nome de função por prepending um sinal "@" e acrescentando uma arroba e a representação decimal do número de bytes de espaço de pilha necessário. Cada argumento é ampliado para um múltiplo de quatro bytes.
Observação 3 Os primeiro argumentos da duas função que exigem bytes quatro ou menos são colocados em registros. O chamador envia o restante dos parâmetros na pilha da direita para a esquerda. Esse comportamento pode mudar em versões futuras.
O padrão de convenção de chamada é _cdecl . Se um aplicativo declara uma função que aceita um número variável de argumentos com a convenção de chamada _stdcall ou _fastcall , o compilador usa _cdecl convenção de chamada para essa função.

Mais Informações

Os exemplos de código a seguir ilustram o código gerado na função de chamada e na função de chamada para oferecer suporte a convenção C de chamada.
   int _cdecl CFunc(int a, int b);

      calling function    called function
      -------------------------------------------

      push   b            _CFunc PROC NEAR
      push   a                    .
      call   _CFunc               .
      add    esp,8                .
       .                         RET
       .                  _CFunc ENDP
       .

   int _cdecl CVarFunc(int a, ...);

      calling function    called function
      -------------------------------------------


      push   ...          _CVarFunc PROC NEAR
      push   a                       .
      call   _CVarFunc               .
      add    esp,4+...               .
       .                            RET
       .                  _CVarFunc ENDP
       .
				
o exemplo de código a seguir ilustra o código gerado na função de chamada e na função de chamada para oferecer suporte a convenção de chamada padrão.
   int _stdcall StdFunc(int a, int b);

      calling function    called function
      -------------------------------------------

      push   b            _StdFunc@8 PROC NEAR
      push   a                        .
      call   _StdFunc@8               .
       .                              .
       .                             RET  8
       .                  _StdFunc@8 ENDP
				
o exemplo de código a seguir ilustra o código gerado na função de chamada e na função de chamada para oferecer suporte a fastcall convenção de chamada.
   int _fastcall FastFunc(int a, int b);

      calling function    called function
      -------------------------------------------

      mov edx, b          @FastFunc@8 PROC NEAR
      mov ecx, a                       .
      call @FastFunc@8                 .
       .                               .
       .                              RET 8
       .                  @FastFunc@8 ENDP
				

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 2005 Express Edition
Palavras-chave: 
kbmt kbhowto kbcompiler kbinfo KB100832 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 100832  (http://support.microsoft.com/kb/100832/en-us/ )