Artigo: 100832 - Última revisão: sexta-feira, 9 de Dezembro de 2005 - Revisão: 5.0

Descrição das convenções de chamada que 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.
Nota Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 suportam ambos os o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e modelo de código não gerido Microsoft Windows nativo. As informações contidas neste artigo aplicam-se apenas ao Visual C++ não gerido código.

Nota Microsoft Visual C++ 2005 suporta o modelo de código gerido que é fornecido pelo .NET Framework e o modelo de código Windows nativo não gerido.
Expandir tudo | Reduzir tudo

Sumário

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

A tabela seguinte 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
				
Nota 1 _stdcall convenção de chamada decora cada nome da função prepending um carácter de sublinhado (como acontece com a convenção _cdecl ) e acrescentar uma arroba "@" e a representação decimal do número de bytes de espaço de pilha necessário. Cada argumento é aumentado para um múltiplo de quatro bytes.
Nota 2 _fastcall convenção de chamada decora cada nome da função por prepending uma arroba "@" e acrescentar uma arroba e a representação decimal do número de bytes de espaço de pilha necessário. Cada argumento é aumentado para um múltiplo de quatro bytes.
Nota 3 Os primeiro argumentos da dois função que requerem bytes quatro ou menos são colocados em registos. O autor da chamada emite os restantes parâmetros para a pilha da direita para a esquerda. Este comportamento pode ser alterada em futuras versões.
A predefinição convenção de chamada é _cdecl . Se uma aplicação declara uma função que aceita um número variável de argumentos com a convenção de chamada _fastcall ou _stdcall , o compilador utiliza _cdecl convenção de chamada para essa função.

Mais Informação

Os exemplos de código seguintes ilustram o código gerado a função de chamada e a função chamada para suportar a convenção de chamada C.
   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 seguinte mostra o código gerado a função de chamada e a função chamada para suportar 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 seguinte mostra o código gerado a função de chamada e a função chamada para suportar 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )