sábado, 11 de abril de 2009

Assembly - hello world

Iniciando uma nova série sobre... assembly! =D

Aos navegantes: um programa simples em assembly para plataforma Intel, que só roda em Windows (o Linux usa arquitetura AT&T).

.MODEL SMALL ;avisamos o montador que não vamos precisar de muita memória (por hora, fica nisso)
.386 ;indica que vamos brincar de ser um 386

.DATA ;indica o segmento de dados
Msg db "Hello World", "$" ;"cria" uma string de bytes (db) chamada Message

.CODE ;indica o segmento de codigo
Start: ;indica o comeco do programa (vc escolhe o nome que quiser)
mov ax, seg Msg ;move o numero do segmento "Msg" para o registrador AX
mov dx, offset Msg ;move o endereço de Msg para o registrador DX
mov ds, ax ;move ax para ds, carregando o segmento de dados
mov ah, 09h ;coloca o nro da interrupcao "DOS" de escrever na tela em AH
int 21h ;chama a interrupcao com o codigo AH

mov ax, 4c00h ;coloca o nro da interrupcao de retorno para o DOS
int 21h ;chama a interrupcao
End Start ;indica o fim do programa


Estamos usando 2 segmentos aqui: DS (ou DATA SEGMENT) e CS (ou CODE SEGMENT). No DS estão os dados (!) e no CS está o código do programa (!!). Temos outros, mas só usamos esses.
As linhas que começam com pontos são diretivas para o montador (assembly não se compila, se monta).

AX é um registrador de uso geral, assim como DX. AX tem 16 bits, que são divididos em 2: AH (8 bits mais significativos) e AL (8 bits menos significativos - à direita). O mesmo vale para DX, que possui DH e DL. Temos outros, mas só usamos esses (no novo).

mov faz uma atribuição. Então, mov ah, 09h significa:
av <- 9h
O "h" depois do número indica que ele é hexadecimal.

int chama uma interrupção de BIOS (Basic Input/Output System) ou de DOS (Disk Operating System). o número depois dela é o código da interrupção.

Por hora é isso... :P

11 comentários:

Breno disse...

Valew vocês me ajudaram a criar meu primeiro programa em Assembly =D

Rodolfo disse...

É sempre bom ajudar! :)

Se quiser ocupar esse espaço pra falar o que vc fez, ou onde vc teve dificuldades, esteja à vontade!

--
Rodolfo

vladimir disse...

obrigado xd esse é meu primeiro programa! pode me ajudar a perceber o que significa ´´offset msg´´e ''4c00h''? se poder, pode aconselhar alguns materias que expliquem isso bem))
abraço

Rodolfo disse...

Olá Vladimir!

> mov dx, offset Msg ;move o endereço de Msg para o registrador DX

"offset" pega o endereço de Msg. É isso que vai para o "dx" pelo comando "mov".

> mov ax, 4c00h ;coloca o nro da interrupcao de retorno para o DOS

Logo depois disso, é executado o comando que chama a interrupção 21h. O 4c00h indica para o DOS que o comando é para escrever na tela.

vladimir disse...
Este comentário foi removido pelo autor.
vladimir disse...

mov ax, seg Msg ;move o numero do segmento "Msg" para o registrador AX
mov dx, offset Msg ;move o endereço de Msg para o registrador DX
podes me explicar, se faz favor, a diferença entre o numero do segmento e o endereço de "Msg"...diferença entre estas duas linhas de código

Aoshish disse...

E como compila??

Aoshish disse...

E como compila?

Anônimo disse...

tmb quero saber como compila

Anônimo disse...

o q vc quer dizer com "(o Linux usa arquitetura AT&T)" -_-

Rodolfo disse...

Intel and AT&T Syntax: http://asm.sourceforge.net/articles/linasm.html#Syntax

"Compilar" não é a palavra certa, mas eu estava usando o Turbo Assembler: https://secure.wikimedia.org/wikipedia/en/wiki/Turbo_Assembler