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...

Oficina

3. Curso relâmpago de Assembly

Sex

25

Mai

2007


20:08

(54 votos, média 4.63 de 5) 


Um pequeno programa

Este é um programa extremamente simples:

mov ax, 0x4C00 ; AH = 0x4C, AL=0 int 0x21 ; a interrupção de software 0x21 é chamada

Este programa nada mais faz do que... terminar. Está na hora de usar o helpPC para esclarecer este assunto:

  1. Inicie o helpPC - uma tela chamada "Main Topic Menu" será mostrada.
  2. Destaque o item de menu "Interrupt Services DOS-BIOS-EMS-Mouse" e tecle Enter.
  3. Destaque o item "DOS Functions" e tecle Enter.
  4. Escolha INT 21,4C

O helpPC nos informa que a INT 21,4C corresponde a Terminate Process With Return Code, ou seja, Termine o Processo com Código de Retorno. Também informa que AH precisa conter o valor 4C e que AL precisa conter o código de retorno (do arquivo de lote). Além disto, a instrução não tem valor de retorno.

Portanto, para usar esta instrução, basta preparar AH e AL com os parâmetros exigidos e chamar a interrupção. Com isto terminamos o programa... e com o método aprovado! Se quiser testar este programa, salve o código fonte como teste1.asm, compile-o com o NASM com nasm -o teste1.com teste1.asm para obter teste1.com

Escrevendo um caracter na tela

Do mesmo modo indicado no exemplo anterior, procure no helpPC por uma função que dê saída para a tela. Em "DOS Functions", a primeira encontrada é a INT 21,2 que revela: precisamos de AH=02 e DL com o caracter que deve ser mostrado. Daí, são dois palitos:

mov ah,2 ; serviço 2 da interrupção 21 mov dl,'A' ; caracter que deve ser impresso int 0x21 ; chama a interrupção e imprime na tela mov ax,0x4C00 ; serviço 4C da interrupção 21 int 0x21 ; chama a interrupção e termina o programa

Para compilar e testar o programa, proceda como indicado no exemplo anterior.

Variáveis

As variáveis no Assembly são um pouco diferentes quando comparadas com as de outras linguagens de programação. No Assembly podemos inserir dados diretamente no programa com DB, DW e DD (onde B=byte=8bits, W=word=16 bits e D=duplo word=32 bits). Além disto, podemos atribuir marcadores para os dados para identificá-los por nomes - estão aí as nossas variáveis!

varb db 0 ; 1 byte chamado "varb" é inserido varw dw 0 ; 1 word chamado "varw" é inserido (1 word=2 bytes) vard dd 0 ; 1 duplo chamado "vard" é inserido (1 double=4 bytes) b2 db 0,1 ; 2 bytes chamados "b2" são inseridos w3 dw 1,1,1 ; 3 words chamados "w3" são inseridos str db 'abcd' ; uma string (4 bytes) chamada "str" é inserida

Veja alguns exemplos de como manipular os valores das variáveis acima definidas:

mov al, 15 ; Põe 15 no byte baixo de AX mov [varb], al ; Transfere 15 para a variável varb mov bx, 0x1234 ; Põe 1234hex no byte baixo de BX mov [varw], bx ; O novo valor de varw agora é 0x1234 mov [b2], bx ; O valor de "b2" agora é 0x1234 mov bl, [b2] ; BL = Primeiro byte em "b2" = 0x34 mov bh, [b2+1] ; BH = Segundo byte em "b2" = 0x12 mov dl, [str] ; DL = Primeiro byte em "str" = 'a' mov dl, [str+1] ; DL = Segundo byte em "str" = 'b' mov dl, [str+2] ; DL = Terceiro byte em "str" = 'c' mov dl, [str+3] ; DL = Quarto byte em "str" = 'd' mov ax, [w3] ; AX = valor do word no endereço w3 = 1 mov ax, [w3+1] ; AX = valor do word no endereço w3+1 = 256 mov ax, [w3+2] ; AX = valor do word no endereço w3+2 = 1

Para obter o endereço de variáveis, basta omitir os colchetes:

mov dx, str ; DX = Ponteiro pata "str" mov al, [dx] ; AL = Primeiro byte em "str" = 'a' mov al, [w3+6] ; AL = 'a'

Informações adicionais