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) 


Declarando uma string

Uma sequência de caracteres, ou string, pode ser armazenada numa variável. Sabemos que variáveis nada mais são do que endereços de memória onde ficam armazenados seus valores. Se quisermos declarar a variável StringSO, que irá conter o valor da nossa string "Sistema Operacional NumaBoa", será preciso declará-la e atribuir-lhe um valor. Além dos caracteres, queremos que o cursor seja posicionado na próxima linha. Para isto, adicionamos os caracteres 13 (return=retorno de carro) e 10 (line feed = mudança de linha). Como se trata de uma string, o caracter terminador precisa ser zero, ou seja:

[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 ah,0x0E ; Indica a rotina de teletipo da BIOS ... ; Dados StringSO db 'Sistema Operacional NumaBoa',13,10,0 ; Para terminar ...

Indicando a posição da string na memória

Só para relembrar: sistemas de 16 bits são muito limitados para indicar endereços de memória. Com 16 bits, o maior número que podemos obter é 65535 (que é o mesmo que 1111 1111 1111 1111 em binário). O valor 65535 corresponde a 64 Kb, o que seria uma quantidade de memória insignificante e limitaria muito os aplicativos e sistemas operacionais. Foi daí que o pessoal resolveu "lotear" a memória em segmentos e, logicamente, em segmentos de 64 Kb. O endereçamento passou a ser composto por duas referências: o segmento e o deslocamento dentro do segmento. Assim, o endereço 0000:0005 se refere ao deslocamento 5 dentro do segmento 0.

A área de memória, onde são armazenados os dados (nossas variáveis), é chamado de segmento de dados. Um dos registradores da CPU fica encarregado de indicar a posição deste segmento: é o DS (Data Segment). O endereçamento é feito com DS:Deslocamento, como explicado acima. O registrador que guarda o deslocamento é o SI (Segment Index ou Índice de Segmento).

Como nosso programa é muito pequeno e deixamos o NASM alocar espaço de memória para o programa e para os dados, acaba ficando tudo "empacotado" no mesmo segmento, o segmento 0 (zero). Neste caso, fica fácil indicar a posição da nossa string: DS = 0 e SI = StringSO. Quando passamos o nome da variável para SI, na verdade passamos o deslocamento correspondente à StringSO. Completando nosso código teremos:

[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 mov ah,0x0E ; Indica a rotina de teletipo da BIOS ... ; Dados StringSO db 'Sistema Operacional NumaBoa',13,10,0 ; Para terminar ...

Novamente tome cuidado ao mover um valor de 16 bits para ax (mov ax,0x0000). Para não bagunçar nosso código, criamos a sub-rotina PoeString. Esta sub-rotina lerá uma a um os caracteres de StringSO, jogando-os na tela, até encontrar o caracter 0 (zero), marcador do final da string.

Informações adicionais