Tips & Tricks

Nesta página mostramos-lhe um exemplo interessante e algumas routinas do que pode ser feito na Linguagem Assembly.

Como criar um TSR ?

Criar um  programa TSR (Termina e fica residente) é algo diferente de fazer um programa normal. No entanto não é muito difícil ! Nesta secção vou tentar explicar os básicos de um TSR.

O que é um TSR ?

Um programa TSR é basicamente um pedaço de código que fica na memória quando o programa é terminado. "Mas quando é que é executado se o programa já terminou?", podem perguntar. O programa principal alte rou (antes de terminar) a Tabela de Vectores de Interrupções (TVI) de modo a apontar para o teu pedaço de código residente. Desta forma, cada vez que uma interrupção ocorre, o teu pedaço de código (a rotina de resposta a interrupção ou RRI) é executada.
As interrupções podem ser geradas de duas formas: por
hardware ou por software. Um exemplo de uma interrupção por hardware é aquela de um porto série ou vinda do teclado. A RRI é responsável por atender a causa que gerou a interrupção ( recebeu um byte por exemplo). Interrupções por software são por exemplo interrupç ões do BIOS ou rotinas do DOS, que provavelmente utlizas muitas vezes nos teus programas através da instrução INT.

Como é que alteramos a TVI (Tabela de Vectores de Interrupções) ?


A TVI é apenas um pedaço de memória  no endereço 0000:0000 (com 256 ponteiros de 4 bytes do tipo FAR para RRI) cujos valores podes alterar. Outra maneira (mais compatível e recom endável) é usando as rotinas do DOS para isso. Vê o meu exemplo mais tarde.

Que fazer quendo a minha RRI é executada ? O queres exactamente fazer na tua RRI depende de qual interrupção é que queres tratar, mas existem umas consderações gerais: A interrupt-flag está normalmente desactivada (impedindo outras interrupções de ocorrerem) no início da tua RRI. Boa programação aconselha a activá-la no fim da rotin a ( usando a instrução STI).
Grava todos os registos que estás a planear utilizar na pilha, a não ser que realmente queiras que sejam alterados depois da tua RRI estar completa. Quando "agarrares" a tua interrupção de hardware, tu definitiva mente não queres mudar nenhum registo. Não precisas de guardar o regsto das FLAGS, isto foi automaticamente feito quando a interrupção ocorreu. Usa apenas IRET para saíres da tua RRI em vez do normal RET. Podes utilizar também RET 2 ( para saltar 2 bytes na pilha, os bytes das FLAGS !) quando queres alterar as FLAGS ! De novo, não podes fazer isso numa RRI de hardware !

Lembra-te que tu não sabes quando nem onde a interrupção correu, por isso o unico registo que conheces é o CS (code segment). Isto não particularmente verdade em interrupções por software, tu podes exigir ao causador para estabelecer uns registos e uns parâmetros. Mas não uses DS se pensas que aponta para os teus próprios dados ou segmento de código.  Se precisares de dados no teu próprio segmento, usa MOV AX,CS  e MOV DS,AX (depois de PUSHares AX) ou PUSH CS e POP DS.
Muito frequentemente tu precisas de chamar a velha RRI ( a que estava instalada antes da tua estar !) quando acabas, ou para manteres as coisas como est avam. Para isso precisas de te
lembrar do velho endereço antes de instalares a tua RRI e usares CALL CS:OldHandler (OldHandler é o antigo endereço)  para cha mar a antiga.

Lembra-te que quando PUSHAs coisas para a pilha, não estás a trabalhar na tua própria pilha, mas na pilha do programa que estava a correr quando a interrupção ocorreu ! Não coloques mais do que alguns registos !

Este Web Site designed com:

Comentários e
Sugestões: