A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Cap. III - Registradores do Microprocessador

Sab

15

Dez

2007


13:46

(11 votos, média 4.09 de 5) 


Criando suas próprias funções

1 - Agora criaremos uma função que mostre uma mensagem. Esta função terá um parâmetro para indicar o endereço da etiqueta da mensagem. Dentro da função que vamos criar se encontra a API MessageBox, que será reponsável por mostrar a mensagem.

Vídeo 4
prog004.exe

vovo Para assistir ao vídeo, faça o download de prog004.exe.

Como observamos no vídeo, primeiro declaramos a função que vamos utilizar:

Funcion PROC MsgT:DWORD invoke MessageBox,NULL,MsgT,addr MsgTitulo, MB_OK + MB_ICONINFORMATION RET Funcion endp

PROC - Esta diretiva serve para definir um procedimento ou chamado que se irá utilizar e sua sintaxe é assim:

Nome_da_Funcao PROC  Argumento/s (se tiver um) 
RET 
Nome_da_Funcao endp

Se nossa função precisar de um parâmetro, sua sintaxe seria assim:

Nome_da_Funcao PROC  Parametro01: Tipo de variável 
RET 
Nome_da_Funcao endp

Se nossa função precisar de mais de um parâmetro, é necessário separar com "," (virgulas) cada parâmetro, desta maneira:

Nome_da_Funcao PROC  Prmtr01: Tipo de variável, Prmtr02: Tipo de variável, etc.
RET 
Nome_da_Funcao endp

Tipo de variável - Aqui declaramos o comprimento em bytes que se precisa, ou seja: DWORD, WORD, BYTE. Em geral sempre se declara a variável usando o maior comprimento (tamanho) como DWORD.

Nome_da_Funcao - Aqui escrevemos nossa etiqueta para o nome da função. Lembre-se de que esta etiqueta não deve se repetir e que a etiqueta dos parâmetros não deve ser declarada em outra parte do código.

RET (retorno) Nº Bytes

Com esta instrução retornamos do procedimento que chamamos. Também a utilizamos para separar nossos códigos, como no primeiro RET que vem depois da função ExitProcess. O operando Nº Bytes é opcional. Especifica quantos bytes devem retornar.

Outro ponto importante é que, se utilizarmos algumas das variáveis que declaramos nos parâmetros do procedimento da função, como por exemplo MsgT, já não é necessário utilizar addr ou offset. Um exemplo é a variável que foi utilizada no 3º parâmetro da Api MessageBox:

invoke MessageBox,NULL,MsgT,addr MsgTitulo, \ MB_OK + MB_ICONINFORMATION

Já criamos nossa função. Se quisermos utilizá-la com a diretiva invoke, ficaria assim - como fizemos no vídeo:

invoke Funcion,addr MsgTexto

É necessário declarar os protótipos com a diretiva PROTO.

PROTO - Serve para definir os protótipos das funções para que possam ser usadas com invoke. Também informa ao MASM o número de argumentos e o tipo de variável que deve ser usada no momento de se chamar uma função. Sua sintaxe é:

Nome_da_Funcao PROTO Argumento/s (se tiver um)

PROTO é semelhante à diretiva PROC porque ambas trabalham em conjunto. A diferença está na declaração dos tipos de variáveis. O número de variáveis que declaramos depende dos parâmetros da função, por exemplo:

invoke Funcion,addr MsgTexto

É necessário declarar os protótipos com a diretiva PROTO.

PROTO - Serve para definir os protótipos das funções para que possam ser usadas com invoke. Também informa ao MASM o número de argumentos e o tipo de variável que deve ser usada no momento de se chamar uma função. Sua sintaxe é:

Nome_da_Funcao PROTO Argumento/s (se tiver um)

PROTO é semelhante à diretiva PROC porque ambas trabalham em conjunto. A diferença está na declaração dos tipos de variáveis. O número de variáveis que declaramos depende dos parâmetros da função, por exemplo:

invoke Funcion,addr MsgTexto

só contém um parâmetro e o definimos desta maneira:

Funcion PROTO :DWORD

Se nossa função tiver mais de um parâmetro, declara-se as variáveis separando-as com "," (virgulas). Por exemplo, a função MessageBoxA, que está no arquivo user32.inc, quando utilizada precisa de 4 parâmetros:

MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD

Nota - Não se esqueça de que se deve respeitar as maiúsculas e minúsculas quando nos referirmos a qualquer variável ou um nome de função porque, se não o fizermos, na hora de compilar o masm32 nos devolverá erros.

Informações adicionais