Como ler o que está no setor
de boot de um disquete?
|
Utilize o utilitário debug do DOS para isso.
Você pode aproveitar para ver um exemplo do setor de boot utilizando
o comando:
-l address disk sector number
então utilize address=c700, disk=0, sector=0,
number=1 para solicitar a leitura do primeiro setor do disquete
e coloca-lo na posição c700 de memória a partir do segmento
atual. O comando w do debug faz a operação inversa (grava
um bloco de memória em um setor do disco:
-w address disk sector number
Observe que o setor de boot gravado pelo DOS possui um bloco de informações
após os 3 primeiros bytes do setor. E o programa contorna esse bloco
colocando uma instrução jmp logo no início.
|
O que quer dizer a mensagem de erro
NTLDR missing, quando coloco o disquete para dar o boot? |
Significa que você formatou o disquete com o
Windows NT e que não instalou seu boot loader. O NT
sempre grava um setor de boot padrão avisando que o disquete
não é de boot. A mesma coisa serve para os outros Windows
e DOS quando você não formata o disquete com sistema.
|
Estou tendo problemas tentando alocar
memória, por menor que seja o segmento de memória que tento
alocar a função retorna dizendo que não existe memória
suficiente. Isso seria alguma limitação dos programas .com?
Pelo que entendi preciso alocar memória para criar o buffer no loader
intaller, também estava tentando alocar memória para criar
um FCB, já que é mais fácil determinar o tamanho do
arquivo através de FCB´s. |
Em nenhum dos programas será obrigatório
alocar memória. Lembre-se que buffer=variável. Basta então você declarar a
variável com o tamanho necessário para o buffer. Por exemplo, se quiser declarar uma variável
de 210 bytes, use:
variavel resb 210
|
Uma das nossas tarefas é
elaborar um programa a ser instalado no setor de boot do disquete que tenha
as funcionalidades
descritas no roteiro do trabalho. É impressão minha ou esse
programa deve ter no maximo 512 bytes para caber por completo neste setor?
Caso a reposta seja negativa, onde eu devo instalar o resto do programa? Nos
setores seguintes? |
Realmente o setor de boot tem apenas 512 bytes
e só aceitará um programa de até 510 bytes (lembre-se
que os últimos dois bytes contém a assinatura do setor para
mostrar que ele é executável). Se seu programa couber em 510
bytes, melhor pra você. A BIOS vai carrega-lo diretamente quando o computador
der boot. Mas se ele for maior que isso, você deverá quebra-lo
em dois ou mais pedaços e grava-lo em setores diferentes. Só
que a BIOS continuará carregando apenas o primeiro,
então você também deverá criar uma rotina
(que deve ficar no primeiro setor) que carrege os outros setores para a memória
e execute-os conforme o necessário.
|
Como devo encerrar meu programa?
|
Seu programa não deve terminar. Para reiniciar
o computador, use o botão de reset.
|
Meu programa funciona perfeitamente
na linha de comando, mas quando gravo no setor de boot ele não
funciona.
|
Essa pergunta é muito genérica, use o
checklist abaixo:
- Verifique se o disquete está ok. Use o comando "l c700
0 0 1" dentro do debug para ler o setor do disco. Se der erro,
pode ser um problema no disquete;
- Certifique-se de ter trocado o endereço do orgdo
seu arquivo .asm. Lembre-se que a diretiva org apenas informa ao montador
que o programa será carregado em outra posição de memória
mas não gera nenhuma instrução extra. Um programa .com
gerado para outro endereço que não seja o 0x100 poderá
não ser executado corretamente na linha de comando do DOS;
- Lembre-se que quando o computador inicia a execução
do setor de boot, apenas os registradores CS e IP estão com
valores válidos. Você deve definir valores iniciais para todos
os outros registradores (através de instruções no programa),
principalmente para os registradores de segmento (SS, ES e DS) e para os de
pilha (BP e SP).
|
É necessário digitar
o nome do arquivo a ser instalado pela linha de comando ou basta defini-lo
dentro do próprio arquivo .ASM?
|
Basta colocar dentro do próprio .ASM. Não
esqueça de especificar isso no relatório.
|