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) 


Escrevendo uma string na tela

Procure novamente no helpPC uma função do DOS que imprima texto na tela. Se você encontrou a INT 21,9 - parabéns! O serviço 9 da interrupção 21 pede que DS:DX apontem para uma string terminada em $. Por enquanto ignore a novidade do DS:DX, a única coisa importante no momento é saber que DX precisa conter o endereço da string:

; Este é um programa DOS => ele será carregado no endereço 0x100 ; O Nasm precisa do endereço para poder calcular o valor dos ponteiros. ; Para dar um endereço base para o Nasm, use o comando ORG (de ORiGem): [ORG 0x100] mov ah, 9 ; Imprimir string mov dx, msg ; (DX=Ponteiro para msg) int 0x21 mov ax, 0x4C00 ; Termina programa int 0x21 msg db 'NumaBoa$' ; Insere a mensagem - uma string terminada em "$"

Entrada de teclado

Ponha novamente o helpPC em ação e procure pela interrupção do DOS INT 21,A. A explicação parece um pouco complicada, mas não se preocupe. DS:DX deve conter um ponteiro para um buffer. Este buffer contém 3 áreas: max - o número máximo de caracteres que devem ser lidos, count - o número de caracteres retornados e buffer - a área de entrada. O código comentado vai facilitar as coisas:

[ORG 0x100] mov ah, 9 ; Imprime "Escreva alguma coisa: " mov dx, msg1 ; int 0x21 ; mov ah, 0xA ; Coleciona as teclas digitadas mov dx, buf ; armazenando-as no buffer int 0x21 ; mov ax, 0x4C00 ; Termina o programa int 0x21 ; msg1 db 'Escreva alguma coisa: $' ; Este é o buffer de entrada buf: max db 20 count db 0 data db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Como atribuímos 20 zeros à área data do buffer e indicamos 20 na área max, o buffer poderá conter no máximo 20 caracteres, ou seja, após 20 "tecladas" nenhuma mais é aceita. Para encerrar o programa, basta digitar Enter.

Saltos

Saltos, os famosos jump, desviam a linha de execução. Geralmente são condicionais, do tipo "se alguma coisa, então salte para...", mas existe também uma instrução de salto incondicional. Os mais comuns são:

JA Salte se acima (above) JAE Salte se acima ou igual (above or equal) JB Salte se abaixo (below) JBE Salte se abaixo ou igual (below or equal) JE Salte se igual (equal) JMP Salto incondicional JNA Salte se não acima (not above) JNB Salte se não abaixo (not below) JNE Salte se não igual (not equal) JNZ Salte se não zero (not zero) JZ Salte se zero

Como a maioria dos saltos são condicionais, é claro que precisamos de uma instrução que faça comparações. É a CMP, mnemônico de CoMParar (ou CoMPare). Observe no código abaixo como criar um loop com uma instrução de salto. Este programa imprime NumaBoa cinco vezes e termina:

[ORG 0x100] mov cx, 0 ; Contador = 0 Marcador: ; marcador para dirigir o salto mov ah, 9 ; Imprimir mensagem mov dx, msg int 0x21 inc cx ; Contador = Contador + 1 (inc=incrementa) cmp cx, 5 ; Compara contador com 5 jne Marcador ; Se contador diferente de 5, salta para Marcador mov ax, 0x4C00 ; Termina o programa int 0x21 msg db 'NumaBoa',13,10,'$' ; A string contém nova linha (13,10)

Informações adicionais