Oficina
8. O loader Numaboa
Sab 26 Mai 2007 16:20 |
- Detalhes
- Categoria: Sistemas Operacionais
- Atualização: Domingo, 12 Abril 2009 17:38
- Autor: vovó Vicki
- Acessos: 13440
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:
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:
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.