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:
Valew vocês me ajudaram a criar meu primeiro programa em Assembly =D
É sempre bom ajudar! :)
Se quiser ocupar esse espaço pra falar o que vc fez, ou onde vc teve dificuldades, esteja à vontade!
--
Rodolfo
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
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.
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
E como compila??
E como compila?
tmb quero saber como compila
o q vc quer dizer com "(o Linux usa arquitetura AT&T)" -_-
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
Postar um comentário