MC 404
Perguntas e Respostas

Envie suas dúvidas por email e elas serão respondidas nessa página. Não enviem o código fonte do programa.

Lab. 1
Lab. 2
Lab. 3
Lab. 4
Lab. 5
Trab. 1
Trab. 2
Trab. 3

Lab. 3

Por que quando uso o serviço 01h (ou 11h) da interrupção 16h e existe uma tecla pressionada é sempre retornado o mesmo valor?
Ambos os serviços (01h e 11h) apenas servem para verificar se existe uma tecla no buffer do teclado. Embora eles digam qual é a tecla, ela continua no buffer do teclado. Sendo assim, você precisa chamar os serviços 00h ou 10h para ler a tecla e remove-la do buffer. Utilize os serviços 01h ou 11h quando quiser saber se existe uma tecla pressionada para realizar uma atividade, pois eles são capazes de avisar inclusive que nenhuma tecla foi pressionada (Zero Flag).

Lab. 4


Lab. 5


Trab. 2

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.

Trab. 3

Qual deve ser o contexto de um processo?
Basicamente, cada processo deve ter sua própria pilha. Para fazer a troca de contexto, bastará salvar os registradores na pilha, trocar a pilha (SP) e restaurar os registradores do novo processo. Cuidado apenas ao definir os valores iniciais de cada uma das pilhas.

Quando eu escrevo na memória de vídeo, o programa só funciona dentro do depurador?
Esse é um problema do Windows NT (e de outros windows talvez). O depurador consegue obriga-lo a emular a memória de vídeo corretamente. Mas basta você chamar o depurador e executar o programa dentro dele uma vez que a partir daí a janela do DOS que você abriu passa a aceitar acessos diretos à memória de vídeo.

Estou com problemas com a interrupção 1Ch.
Tente utilizar a interrupção 8h que também é chamada uma vez por tick do relógio. É a interrupção 8 que chama a 1Ch.

Dado que cada processo deve ser executado durante 1tick, com que velocidade alterar a freqüência do som do processo 4?
Utilize um laço para fazer sua temporização. Seu programa passará a ser dependente de máquina, mas pelo menos você conseguirá muda-lo durante a execução do processo.