Aula 1

Através de leitura da memória, descubra quais leds do teclado estão acesos.

Para isto, primeiro você deve descobrir em que endereço da memória esta informação está armazenada, e de que forma está codificada.


Help PC

O HelpPC 2.10 - Copyright 1991 David Jurgens - explica onde e como ler esta informação. Faça o download do Helppc zipado na seção de Downloads deste site.

Assim que baixar, extraia em alguma pasta e execute o HELPPC.COM. No menu de tópicos principal (Main Topic Menu), acesse a opção Tables and Formats used by DOS & BIOS.

Lá, selecione a opção memory map. A lista de opções está em ordem alfabética.

Procure a linha em que o texto explica sobre o endereço de memória 40:97 - Keyboard LED flags (é aí que você irá encontrar o que está querendo).


Perceba que toda a informação que você quer está armazenada em apenas 1 byte, no segmento 0040h com deslocamento 0097h, e o HelpPC descreve como este byte armazena em cada bit uma flag correspondente a algum estado do teclado.

Para nosso caso, nos interessará apenas os 3 primeiros bits.


Debug

Agora que você já sabe onde encontrar e como interpretar as flags dos leds do teclado, execute o debug para visualizar o conteúdo da memória em 0040:0097 de uma máquina virtual rodando no modo real.

Iniciar - Executar - cmd

[Iniciar > Executar > "cmd"]
> debug

O comando do debug para visualizar a memória é d (de DUMP). Digite d seguido do endereço de memória que você deseja visualizar.

imagem Debug
d 40:97 com NUMLOCK e SCROLL LOCK ligados. Valor na memória = 03

Leia agora os dois primeiros dígitos hexadecimais(no caso da imagem "03") e interprete-os conforme as instruções lidas no HelpPc. Mude o estado dos leds do teclado, pressionando as teclas NUM LOCK, CAPS LOCK ou SCROLL LOCK e digite novamente no debug d 40:97 para ver os valores do byte mudando!

imagem Debug

imagem Debug

Tente agora ver a posição da memória 49:7 (ou 0049:0007) e compare com a posição 0040:0097 que você estava lendo anteriormente indicada pelo HelpPC. Compare agora não só o byte desejado, mas também toda a região de memória apresentada pelo debug. Qual a relação entre estes endereços? O que é endereço efetivo e como calculá-lo?


Assembly

Agora faça um programa em assembly que leia, a partir do estado dos 3 LEDs do teclado, um número binário de 000 à 111 (0 à 7 em decimal), e armazene o produto deste número por 10 (decimal) no registrador AX.

Baixe as ferramentas para montar o programa na seção de Downloads em "assemblyutils.zip". Caso esteja iniciando, execute o atalho.bat que irá mostrar os comandos mais usados para montagem (tasm, tlink).


Dica

Tire um tempo para explorar o Helppc, ele possui (muitas) informações úteis e bem estruturadas, até coisas que não são fáceis de encontrar pela Internet são facilmente encontradas neste programa.

Desafio: através do HelpPC encontre outro endereço de memória que também guarde informações sobre os leds do teclado.

Spoiler (selecione para ler): 40:17

Super-desafio(piada): Tente fazer o mesmo programa dos LEDs usando a linguagem JAVA :)


Exemplo de código para o programa pedido: ledstecl.asm



Autor: Rodolfo Cesar de Avelar Ferraz
07/09/2008