NASM (Mode protégé) Interuption du clavier

Signaler
Messages postés
112
Date d'inscription
lundi 21 octobre 2013
Statut
Membre
Dernière intervention
4 janvier 2014
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
Bonjour, je voudrais savoir comment faire pour que quand on appuie sur une touche du clavier, cela lance un fonction, car je crée un OS et je ne peux pas utiliser d'interruptions du BIOS.

Merci d'avance.

3 réponses

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

Cette simple question nécessite de bonnes connaissances du fonctionnement materiel de l'ordi et notement du processeur. Je te conseille dans un premier temps de lire la documentation intel pour 386.

Cela marche comme pour le 16 bits. Une interruption est générée sur le pic par le clavier. En mode 32 bits, la table pointée par le registre IDTR est utilisée afin de trouver la routine qui est appelée. Soit tu programme la routine avec l'acces aux ports E/S du clavier. Soit tu place le processeur en mode V86 pour appeler la routine BIOS.

Je ne trouve pas comment mettre des liens direct alors:
-http://codes-sources.commentcamarche.net/source/35523-v86-hook-bios-dos
-http://codes-sources.commentcamarche.net/source/46723-live-cd-omf

ici, tu trouveras des exemples pour utiliser IDTR et comment utiliser les interruptions materielles.

1 - initialiser le pic pour qu'il redirige les interruptions sur nos vecteurs (0x20-0x2F) dans les exemples.
2 - Initialiser la table des interruptions et IDTR.
3 - Ton gestionnaire devra impérativement lancer une EOI sur le PIC afin de terminer l'interruption en cours sinon, le PIC ne génèrera plus aucune interruption.
4 - Finir par ton gestionnaire par un iretd.

bon courage.
Messages postés
112
Date d'inscription
lundi 21 octobre 2013
Statut
Membre
Dernière intervention
4 janvier 2014

Merci, je vais regarder
Messages postés
112
Date d'inscription
lundi 21 octobre 2013
Statut
Membre
Dernière intervention
4 janvier 2014

Bonjour, je ne comprends pas très bien les liens que vous m'avez donnés.
Pouvez vous m'expliquer comment faire pour initialiser la IDT (33 pour le clavier) ?

Merci d'avance
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
(33 pour le clavier) ? Je ne comprends pas ce que tu veux.

align 4
IDT:
%assign i 0
%rep 48
dd IDT.i
dw DESC_INTG,FLAT_CODE0
%assign i i+1
%endrep
.reg
dw ($-IDT)-1
dd IDT
dw 0

.0
iretd
.1
...

Ensuite, le descripteur necessite une modification car un descripteur ne correspond pas à la structure:

struc IDTDESC
.address resd 1
.type resw 1
.codesel resw 1
endstruc

mais à:

struc IDTDESC
.off1 resw 1; address bits 0 .. 15
.sel resw 1 ; / / un sélecteur de segment de code en GDT ou LDT
.type resw 1
.off2 resw 1 ; address bits 16 .. 31
endstruc

j'ai été obligé de faire comme cela avec nasm car il n'acceptait pas de calculer directement sur les adresse des fonctions

idt.init:
mov ecx,48
.1
mov ax,[IDT-6+ecx*8]
mov dx,[IDT-2+ecx*8]
mov [IDT-2+ecx*8],ax
mov [IDT-6+ecx*8],dx
loop .1

lidt [IDT.reg]

ici, on a ecx = 48 ... 1

la suite de cette fonction dans livecd permet de mettre les hwis (interruption PIC) sur les vecteurs 20h..2Fh


avec ecx = 0 ... 47, on aurait:

.1
mov ax,[IDT+2+ecx*8]
mov dx,[IDT+6+ecx*8]
mov [IDT+6+ecx*8],ax
mov [IDT+2+ecx*8],dx
loop .1


@++