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) 


Funções

As funções em Assembly são como os marcadores só que, ao invés de serem acessadas através de saltos, são chamadas e precisam ter uma instrução de retorno. Também é possível enviar parâmetros para as funções através de registradores ou da pilha. As funções são úteis quando há tarefas repetitivas. Observe um esqueleto de uma função:

[ORG 0x100] call func ; Chama a função mov ax, 0x4C00 ; Termina o programa int 0x21 ; func: ; Início da função ; aqui vai o código que deve ser executado ... retn ; retornar

Melhorando o "Escreva alguma coisa"

Fazendo uso de saltos, o programa "Escreva alguma coisa" pode ficar muito mais amigável. A tecla Enter interrompe a entrada de caracteres e pede nova entrada. A tecla Esc encerra o programa. Imagino que os comentários do código sejam suficientes:

[ORG 0x100] inicio: mov ah, 9 ; Serviço de impressão da INT 21 mov dx, msg1 ; Imprime "Escreva alguma coisa: " int 0x21 tecla: mov ah, 0x1 ; Serviço de rastrear uma tecla int 0x21 cmp al,13 ; se for Enter je termina ; salte para termina e põe caracteres na tela cmp al, 27 ; se foe Esc je fecha ; termina o programa mov [data+bx], al ; põe caracter da tecla no buffer mov bl, [count] ; põe número já teclado em BL inc bx ; incrementa número de caracteres mov [count], bl ; atualiza count cmp bl, 20 ; compara número de caracteres com 20 je termina ; se forem 20, termina jmp tecla ; senão volta a esperar tecla termina: mov al, '$' ; Põe caracter terminador '$' em AL mov bl, [count] ; Põe número de teclas digitadas em BL mov bh, 0 ; Zera o byte alto de BX mov [data+bx], al ; Adiciona '$' no final do buffer mov ah, 9 ; Imprime "Você escreveu: " mov dx, msg2 ; int 0x21 ; mov ah, 9 ; Imprime o conteúdo do buffer mov dx, data int 0x21 xor bx, bx ; Zera o registrador BX (o mesmo que mov bx,0) mov bl, 20 ; Máximo de caracteres (20) xor ax, ax ; Zera o registrador AX mov [count], al ; Zera o contador limpa: mov [data+bx], al ; Põe 0 na posição início do buffer + BL dec bl ; Decrementa BL cmp bl, 0 ; Compara com 0 ja limpa ; Se for maior que 0 continua limpando o buffer jmp inicio ; Se não, pede "Escreva alguma coisa: " fecha: mov ax, 0x4c00 ; Serviço para terminar programa int 0x21 ; Os caracteres 13 e 10 forçam uma nova linha msg1 db 13,10,13,10,'Escreva alguma coisa: $' msg2 db 13,10,'Você escreveu: $' ; Este é o buffer de entrada com espaço para 20 bytes para caracteres ; e 1 byte para '$' buf: 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,0

Informações adicionais