Pmode

TRAX44 Messages postés 93 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 20 juillet 2006 - 22 juin 2003 à 00:49
cs_Yoha Messages postés 10 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 3 novembre 2007 - 20 nov. 2007 à 08:23
salut, svp si ya kk1 ki c pa c en pmode i pourrai me passé sa source parce que je galère un max la dessu!! G suivi plusieur tutoriaux é a chaque foi sa bug (mon pc redémare kan je passe en pmode : changement du bit cr0)
Merci d'avance
TRAX

7 réponses

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
22 juin 2003 à 15:45
Il ne suffit pas de chager le bit 0 de cr0, il faut préparer le passage car la gestion de la mémoire en pmode est complètement différente par rapport au mode réel !

As-tu la GDT et l'IDT ?
As-tu activé la ligne d'adresse A20 affin d'accéder à la mémoire étendue (XMS) ?

Core Breaker :)
0
TRAX44 Messages postés 93 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 20 juillet 2006
28 juin 2003 à 17:32
salut,
oui je c k'il faut faire tout cela g thériquement charger la gdt (je c pas si sa marche c pour cela ke je dis ke c théorique)
l'idt je c pas comment la charger (g mi une suuite de 256 0)!!
l'ouverture de la ligne A20 j'en suis pas sur!!
Ben voila je c ya pas grand chose c pour sa que je demande un truc déjà fé ou kk chose de concret comme du code!!!
Merci
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
28 juin 2003 à 22:36
Un code entier serait trop long à taper
Il y a bien des pages web mais j'en ai pas sous la main

Si tu ne valide pas la ligne d'adresse 20 ça rique de planter
Voici une routine pour valider la ligne d'adresse:
EnableA20 				proc near

pushf
mov		 				ah, 0DFh
cli
call					Empty8042
jnz		 				GateA20_fail
out		 				0EDh, ax
mov		 				al, 0D1h
out		 				64h, al
call					Empty8042
jnz		 				GateA20_fail
mov		 				al, ah
out		 				60h, al
call					Empty8042
push					cx
mov		 				cx, 14h

GateA20_loop:
out		 				0EDh, ax
loop					GateA20_loop
pop		 				cx
jmp						short GateA20_end

GateA20_fail:
jmp						short Erreur

GateA20_end:
popf
ret

EnableA20				  endp

Empty8042 				proc near

push					cx
xor		 				cx, cx
dec				 		cx

Empty8042_try:
out		 				0EDh, ax
call					IODelay
in						al, 64h
and		 				al, 2
loopnz				Empty8042_try
pop		 				cx
ret

Empty8042 				endp



Une suite de 256 0 ne suffit pas pour l'IDT ce n'est pas cela c'est une suite de 256 desctipteur d'interruption
Si l'idt est mal définie à la moindre exception ça plante !

ref dw offset nullint, selecteur_de_nullint, 9E00h, 0
idt db 2048 dup(0)
idtr dw 7FFh
dd offset idt


Code 16bits:
xor eax, eax
mov ax, segment_code_32bits
shl eax, 4
add [idtr+2], eax
xor eax, eax
mov ax, segment_donnees
shl eax, 4
add [ref], ax
adc [ref+6],0
shr eax,16
add [ref+6],ax
cld
mov cx, 256
mov di, offset idt
copy_loop:
mov si, offset ref
movsd
movsd
loop copy_loop
lidt [idtr]


Code 32bits:
nullint:
iretd


Core Breaker :)
0
TRAX44 Messages postés 93 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 20 juillet 2006
5 juil. 2003 à 10:39
salut,
je te remercie pour ce code mais g encor kk petit pb avec :
je compile sous nasm mais il m'indique des erreur et ne peut donc compiler:
la première ligne pour les decripteur idt:

ref dw offset nullint, selecteur_de_nullint, 9E00h, 0

et je ne c pas à quoi resemble un dscripteur d'idt ; si g bien compris, tu à laisser la place que je le mette :
segment_code_32bits
segment_donnees
ne renvoie à rien
Je c, c ennuyeu d'expliquer aux newbies mais merci com même!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
5 juil. 2003 à 18:54
segemnt_donnees est la valeur de l'adresse de segment de la variable ref

segment_code_32bits est la valeur de l'adresse de segment où se trouve nullint.

Le code que je t'ai donnée fonctionne avec TASM il faut faire quelques petites transformation pour ta ligne c'est:
ef dw nullint, selecteur_de_nullint, 9E00h, 0


La structure d'une entrée dans l'IDT s'appelle un descripteur d'interruption en voici la structure:
taille du descripteur: 8 octets
offset, taille, description
0, 2, partie basse de l'offset du vecteur d'interruption
2, 2, selecteur de code du vecteur d'interruption
4, 1, valeur nulle (0)
5, 1, attributs
6, 2, partie haute de l'offset du vecteur d'interruption

description des attributs:
bit de début, nombre de bits, description
0, 4, type de descripteur d'interrruption (0Eh)
4, 1, valeur nulle
5, 2, DPL du descripteur (niveau de privilège): c'est la ring
7, 1, bit de présence: doit être à 1 sinon provoque une exception de segement absent

types de desctipteurs:
- 05h: Porte d'appel (call gate)
- 06h: Porte d'interruption 16bits (la partie haute de l'offset est alors ignorée et le sélecteur doit conserner un segment 16 bits)
- 07h: Porte de trappe 16bits (une trappe permet que le flag IF, flag d'interuption ne soit mis à 0 lorque se déclenche l'interruption et ceci contrairement à la porte d'interruption)
- 0Eh: Porte d'interruption 32bits
- 0Fh: Porte de trappe 32bits

Core Breaker :)
0
cs_Yoha Messages postés 10 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 3 novembre 2007
20 nov. 2007 à 08:23
TRAX44: Evite le langage SMS sur les forums, ce n'est pas bon pour la lisibilité et cela peut également faire fuir d'éventuelles aides.

Comme site, j'ai trouvé ceci: http://amamraworld.ifrance.com/Assembleur-1/Pmode/PM_FR.HTM
0
cs_Yoha Messages postés 10 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 3 novembre 2007
20 nov. 2007 à 08:23
PS: Désolé pour le décalage ^^.
0
Rejoignez-nous