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

8. O loader Numaboa

Sab

26

Mai

2007


16:20

(6 votos, média 5.00 de 5) 


Escrevendo a string na tela

A sub-rotina ou procedimento PoeString vai precisar de um loop que, a cada passada, imprima o caracter encontrado na tela. Este loop termina quando o caracter 0 (zero) for encontrado. Nossa rotina de teletipo ficará dentro desta função:

[BITS 16] ; Código de 16 bits [ORG 0x7C00] ; Origem do código em 7C00 principal: ; Marcador do início do programa ; Limpar a tela mov ah,0x07 ; Indica a rotina de rolagem de tela da BIOS mov al,0x00 ; Rolar TODAS as linhas mov bh,0x07 ; Texto branco em fundo preto mov ch,0x00 ; Linha do canto superior esquerdo mov cl,0x00 ; Coluna do canto superior esquerdo mov dh,800 ; Linha do canto inferior direito (maior que a tela) mov dl,1200 ; Coluna do canto inferior direito (maior que a tela) int 0x10 ; Chamar a INT 10 ; Posicionar o cursor mov ah,0x02 ; Indica a rotina de posicionamento do cursor mov bh,0x00 ; Número da página de vídeo mov dx,0x0000 ; Linha e coluna da nova posição do cursor (0,0) int 0x10 ; Chamar a INT 10 mov ax,0x0000 ; Como não é possível carregar diretamente DS mov ds,ax ; passamos o valor de ax para ds mov si,StringSO ; Ponteiro para o deslocamento da string call PoeString ; Chamar a rotina de impressão pendura: jmp pendura ; Loop infinito ; Procedimentos PoeString: ; Marcador do início da sub-rotina mov ah,0x0E ; Indica a rotina de teletipo da BIOS mov bh,0x00 ; Número da página de vídeo mov bl,0x07 ; Texto branco em fundo preto .proxCar ; Marcador interno para início do loop lodsb ; Copia o byte em DS:SI para AL e incrementa SI or al,al ; Verifica se al = 0 jz .volta ; Se al=0, string terminou e salta para .volta int 0x10 ; Se não, chama INT 10 para por caracter na tela jmp .proxCar ; Vai para o início do loop .volta ret ; Retorna à rotina principal ; Dados StringSO db 'Sistema Operacional NumaBoa',13,10,0 ; Para terminar times 510-($-$$) db 0 ; Preenche o resto do setor com zeros db 0x55,0xAA ; Põe a assinatura do boot loader no final

O opcode LODSB carrega um byte existente em [DS:SI] em AL. Depois disto incrementa ou decrementa SI (dependendo da flag de direção: incrementa se a flag for 0, decrementa se for 1). Este código operacional é uma mão na roda para transferir sequências de bytes.

Bem, o código acima realiza o que projetamos. Salve-o como loader2a.asm e compile-o para loader2a.bin com o NASM.

Verificando o boot loader Numaboa

Só para matar a curiosidade, vamos dar uma olhada no código compilado. Use o editor hexadecimal da sua preferência e verifique os 512 bytes do arquivo loader2a.bin, que deve mostrar o seguinte:

0000    B4 07 B0 20 B7 07 B9 00    00 B6 20 B2 B0 CD 10 B4  ´.° ·.¹..¶ ²°Í.´
0010    02 B7 00 BA 00 00 CD 10    B8 00 00 8E D8 BE 35 7C  .·.º..Í.¸..ŽØ¾5|
0020    E8 02 00 EB FE B4 0E B7    00 B3 07 AC 08 C0 74 04  è..ëþ´.·³.¬.Àt.
0030    CD 10 EB F7 C3 53 69 73    74 65 6D 61 20 4F 70 65  Í.ë÷ÃSistema Ope
0040    72 63 61 69 6F 6E 61 6C    20 3E 75 6D 61 42 6F 61  racional NumaBoa
0050    0D 0A 00 00 00 00 00 00    ...
...
01F0                        ...    00 00 00 00 00 00 55 AA

Testando o bootloader Numaboa

Prepare o disquete de teste da mesma forma como foi explicado no módulo anterior. Agora, é só cruzar os dedos e torcer para que tudo dê certo (pra mim deu smile ).

Dê o boot com o disquete no drive e deixe o Sistema Operacional Numaboa assumir o comando e ficar "travado" no loop infinito...

Informações adicionais