Bom pra quem ta começando com assembly, como outras linguagens, um programa básico é o Olá Mundo/Hello World, vou explicar por partes e depois o código comentado.
Antes de partimos para o código em si, precisamos passar alguns "parametros"/"diretivas" para nosso assembler (usaremos o masm32), tais como, a qual processador se refere, modelo de memória, variáveis, etc. Resumindo,
- A primeira diretiva é o modelo do processador, por exemplo:
- Em seguida, vamos especificar o modelo de memória juntamenta com o "modelo de passagem de parâmetros", no caso usaremos MODEL FLAT, como modelo contínuo e STDCALL(StandartCall) para passagem de parâmetros, este modelo é uma mescla entre os usados em C e em Pascal. Exemplo:
- Como vamos usar API's em nosso programa, precisamos declarar as lib's as quais elas pertencem, por exemplo, a 'MessageBox' pertence a user32, então temos que declará-la, aqui usamos includelib \endereço_da_lib\. Junto com as lib's, precisamos usar a diretiva include, para cobrir a declaração de funções, assim poderemos chamá-las através do 'invoke'. Exemplo:
OBS: A vantagem das API's é que elas são importadas em tempo de execução, o que decha o programa bem mais leve.
- Agora nos resta declarar as variáveis e por fim o código. As variáveis com valores iniciais vão na diretiva .DATA, as sem valores iniciais vão na .DATA?, por fim as consantes vão na .CONST. No nosso caso usaremos somente a .DATA, para passar o texto e o título da MessageBox. Exemplo:
- Agora sim, chegamos ao código em si. Este fica na diretiva .CODE e para delimitar o início e o fim do código usamos por padrão 'inicio:' e 'end inicio'. Exemplo:
Usaremos, neste caso, as API's MessageBox() para chamar a caixa de mensagem e a ExitProcess para finalizar. Para conferir os parâmetros destas API's recomendo consultar na msdn.
Código completo comentado:
É isso aew, dúvidas/sugestões/críticas ?
Antes de partimos para o código em si, precisamos passar alguns "parametros"/"diretivas" para nosso assembler (usaremos o masm32), tais como, a qual processador se refere, modelo de memória, variáveis, etc. Resumindo,
- A primeira diretiva é o modelo do processador, por exemplo:
- Código:
.386 -> Para processadores 80386
.486 -> Para processadores 80486
- Em seguida, vamos especificar o modelo de memória juntamenta com o "modelo de passagem de parâmetros", no caso usaremos MODEL FLAT, como modelo contínuo e STDCALL(StandartCall) para passagem de parâmetros, este modelo é uma mescla entre os usados em C e em Pascal. Exemplo:
- Código:
.MODEL FLAT,STDCALL
- Como vamos usar API's em nosso programa, precisamos declarar as lib's as quais elas pertencem, por exemplo, a 'MessageBox' pertence a user32, então temos que declará-la, aqui usamos includelib \endereço_da_lib\. Junto com as lib's, precisamos usar a diretiva include, para cobrir a declaração de funções, assim poderemos chamá-las através do 'invoke'. Exemplo:
- Código:
includelib \masm32\lib\kernel32.lib ;Para a ExitProcess()
includelib \masm32\lib\user32.lib ;Para a MessageBox()
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
OBS: A vantagem das API's é que elas são importadas em tempo de execução, o que decha o programa bem mais leve.
- Agora nos resta declarar as variáveis e por fim o código. As variáveis com valores iniciais vão na diretiva .DATA, as sem valores iniciais vão na .DATA?, por fim as consantes vão na .CONST. No nosso caso usaremos somente a .DATA, para passar o texto e o título da MessageBox. Exemplo:
- Código:
.DATA
;Suas variáveis inicializadas
.DATA?
;Suas variáveis não inicializadas
.CONST
;Suas constantes
- Agora sim, chegamos ao código em si. Este fica na diretiva .CODE e para delimitar o início e o fim do código usamos por padrão 'inicio:' e 'end inicio'. Exemplo:
- Código:
.CODE
inicio:
;Seu código aqui
end inicio
Usaremos, neste caso, as API's MessageBox() para chamar a caixa de mensagem e a ExitProcess para finalizar. Para conferir os parâmetros destas API's recomendo consultar na msdn.
Código completo comentado:
- Código:
.386 ;Para processadores 80386
.MODEL FLAT, STDCALL ;Modelo de memória FLAT, contínuo e StandartCall para
;passagem de parâmetros das funções e posterior ajuste da pilha
option casemap:none ;Para trabalharmos sem problemas com maiúsculas e minúsculas
includelib \masm32\lib\kernel32.lib ;Incluindo as lib's das API's que usaremos
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
.DATA
Texto db "Hello World",0 ;Variável Texto guardando o texto da msg
Titulo db "Titulo da mensagem",0 ;Variável Titulo guardando o titulo da msg
.CODE
inicio:
invoke MessageBox, NULL, ADDR Texto, ADDR Titulo, MB_OK ;Chamando a API da mensagem com seus parâmetros
invoke ExitProcess,0
;Finalizando
end inicio
É isso aew, dúvidas/sugestões/críticas ?