Usando PROTO e INVOKE para chamar uma função C de MASM

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: 73407
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sumário
Com o Microsoft Macro Assembler (MASM) versão 6.0, a codificação para uma chamada de procedimento pode ser simplificada pelo uso das diretivas PROTO e INVOKE. Essas diretivas lidar com muitos detalhes, como enviando os parâmetros na pilha na ordem correta, gerar as referências externas corretas, coercing argumentos para o tamanho correto e limpando a pilha (se necessário) após a função terminará.

Os dois programas de exemplo abaixo ilustram como uma função C é chamada de MASM, com e sem as diretivas PROTO e INVOKE. Código de exemplo 1 chama a função C printf() usando o método convencional de codificação. Exemplo de código 2 mostra a chamada simplificada para a mesma função através do uso de PROTO e INVOKE.
Mais Informações
PROTO define um protótipo de um procedimento muito o funcionamento de um protótipo de função em C. Esta é a sintaxe para PROTO:
   label PROTO [distance] [langtype] [,[parameter]:tag]				
PROTO A instrução é usada, o montador para verificar tipos de parâmetro e quantidade com indicando a convenção de nomenclatura para a função. Argumentos da função são indicados por listando o tipo e, opcionalmente, um nome de parâmetro. Por exemplo,
   myfunc PROTO C arg1:SWORD, arg2:SBYTE				
indica que a função myfunc leva dois argumentos. A primeira é uma palavra assinada, o segundo é um byte assinado. Se precisar de uma lista de argumento variável, use o tipo de VARARG.

INVOKE realmente gera o código para chamar a função. Você deve ter definido a função anteriormente com um procedimento, um EXTERNDEF, um TYPEDEF ou uma instrução PROTO. Esta é a sintaxe para INVOKE:
   INVOKE expression [,arguments]				
como o montador sabe o que a função está esperando no meio de argumentos e convenção de chamada, tirar os argumentos passados a instrução de chamada e de envio-los na pilha na ordem correta, chamar a função usando o nome de função necessária e limpe a pilha posteriormente (se necessário, a convenção de chamada usada).

Se um argumento passado por INVOKE for menor que o tipo especificado na instrução PROTO, MASM faz uma conversão de tipo. Ele amplia o argumento a instrução PROTO para coincidir com a instrução de chamada (por exemplo, SBYTE para dois GUMES). Esses tipos de conversões de usam os registradores AX e DX o 8086 e 8088 e os registradores EAX e EDX em 80386/80486. Porque esses registros são substituídos com eficiência, você deve ter cuidado para evitar o uso desses registros para passar argumentos.

O tipo de idioma para a função determina as convenções de nomes e chamadas. Além de tipo de idioma na instrução PROTO, o tipo de idioma pode ser definir a diretiva .MODEL, LANGTYPE OPTION:, ou /gc de opções de linha de comando (para Pascal) e /gd (para C). Há uma tabela das várias convenções do idioma fornecidas em Ajuda.

Código de exemplo 1

; Assemble options needed: /MX          .MODEL small,c             ; The "c" langtype prepends                                     ; labels with an underscore.     ;-----for OS/2-------     ;INCLUDELIB OS2.LIB     ;INCLUDE    OS2.INC     ;--------------------EXTRN     _acrtused:NEAREXTRN     printf:NEAR          .DATAfmtlist   db     "%s, %d, %lu", 0Ah,0string_1  db     "signed byte and unsigned double word", 0data_1    db     -2data_2    dd     0FFFFFFFFh          .CODEmain      PROC          push   word ptr data_2+2   ; push the high word of data_2          push   word ptr data_2     ; push the low word of data_2          mov    al,data_1          cbw                        ; converts data_1 to a word          push   ax          mov    ax,offset string_1  ; load the address of string_1          push   ax                  ; push the address on the stack          lea    ax,fmtlist          ; load the address of fmtlist          push   ax                  ; push the address on the stack          call   printf              ; call the C library function          add    sp,0Ah              ; adjust the stackpointermain      ENDP          ret          end				

Código de exemplo 2

; Assemble options needed: none          .MODEL small,c    ;-----for OS/2--------|    ;.MODEL small,c,os_os2|    ;INCLUDELIB OS2.LIB   <---Not needed if "os_os2" indicated. The    ;INCLUDE    OS2.INC   |   assembler knows to look for os2.lib    ;---------------------|   in the path set by the lib environment    ;                     |   variable.EXTERNDEF _acrtused:WORDprintf    PROTO arg1:Ptr Byte, printlist: VARARG;The first argument is a pointer to a string. The second is a keyword; that permits a variable number of arguments.          .STACK 100h          .DATAfmtlist   BYTE   "%s, %d, %lu", 0Ah,0string_1  BYTE   "signed byte and unsigned double word", 0data_1    SBYTE  -2data_2    DWORD  0FFFFFFFFh          .CODEmain      PROCINVOKE    printf, ADDR fmtlist, ADDR string_1, data_1, data_2main      ENDP          ret          end				
kbinf 6.00 6.00a 6.00b s_c

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 73407 - Última Revisão: 10/20/2003 23:29:30 - Revisão: 2.0

Microsoft Macro Assembler 6.0 Standard Edition, Microsoft Macro Assembler 6.0a, Microsoft Macro Assembler 6.0b

  • kbmt KB73407 KbMtpt
Comentários