NASM (Mode protégé) Interuption du clavier

Greg159357 Messages postés 112 Date d'inscription lundi 21 octobre 2013 Statut Membre Dernière intervention 4 janvier 2014 - 9 nov. 2013 à 21:57
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 14 févr. 2014 à 21:34
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

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
11 nov. 2013 à 07:33
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.
0
Greg159357 Messages postés 112 Date d'inscription lundi 21 octobre 2013 Statut Membre Dernière intervention 4 janvier 2014
11 nov. 2013 à 13:10
Merci, je vais regarder
0
Greg159357 Messages postés 112 Date d'inscription lundi 21 octobre 2013 Statut Membre Dernière intervention 4 janvier 2014
27 nov. 2013 à 16:22
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
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
Modifié par cs_patatalo le 14/02/2014 à 21:39
(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


@++
0
Rejoignez-nous