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.
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.
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"]
> 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.
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!
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?
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).
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