assembleur 16bit en mode reel ou comment coder un bootsector perso

assembleur 16bit en mode reel ou comment coder un bootsector perso - ASM - Programmation

Marsh Posté le 14-09-2006 à 15:42:46    

(2em  mea culpa)
 
 
bonjour tout le monde!
 
j'ai penser que peut-etre on pourrais me permetre de....
parler d'un sujet tres peu aborder sur le net.
vous me direz : "mais quel interet?"
et on pourrait repondre, "cultur general"...
 
nan je rigole.... la realite c'est que j'aurrais bien besoin d'un p'tit coup de pouce
et que j'ai deja lu des postes de gens qui debutais en faisant du 16bit.
 
il est vrai que le 16bit n'as plus beaucoup d'interet de nos jour,
mais il faut savoir que quand vous demarrer vorte pc...
les premieres instructions executee par votre processeur son des  
instructions 16bit.
'est le sujet de la formation que je suis en train de suivre.
et oui! le MBR et le secteur de demarrage des disques dur
sont coder en 16bit et sont executer en mode reel.
 
a la fin de cette formation je metrai en ligne mon rappor de stage
portan sur ce sujet
 
j'ai bien evidemment deja recolter un bon nombre d'information sur la question
et je serai ravis de repondre a d'eventuelle questions
 
je me permet donc de lancer un nouveau sujet de discution
afin de rassembler les gens que ca interesse et les gene qui s'y connaisse   :)
 
merci!
 
 
on peut revenir au sujet s'il vous plait?

Message cité 1 fois
Message édité par sociopath_epitech le 15-09-2006 à 16:05:40
Reply

Marsh Posté le 14-09-2006 à 15:42:46   

Reply

Marsh Posté le 14-09-2006 à 20:51:29    

lis la faq au sujet du sms style pour commencer


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 14-09-2006 à 23:53:05    

sociopath_epitech a écrit :

bonjour tout le monde!
 
je me permet donc de lancer un nouveau sujet de discution
afin de rassembler les gens que ca interesse et les gens qui s'y connaisse   :)
 
merci!


 
c'est mieux?

Reply

Marsh Posté le 14-09-2006 à 23:54:25    

c'est le mininum vital pour que les gens aient envie de te lire


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-09-2006 à 00:04:42    

desolé.... je ne suis pas la depuis longtemp.
 
le sujet t'aurais-t-il quand meme un peu interesser?
 
(pardonner l'orthographe, j'ai preferé l'info a la sorbonne)
 
 :pt1cable:

Reply

Marsh Posté le 15-09-2006 à 00:15:10    

moi ca m interresse j ai comme un soucis avec le mien mais j y connais rien :D

Reply

Marsh Posté le 15-09-2006 à 03:26:42    


oui, donc refais le premier post en lisible :D

Reply

Marsh Posté le 15-09-2006 à 10:47:26    

mIRROR a écrit :

moi ca m interresse j ai comme un soucis avec le mien mais j y connais rien :D


 
quel genre de soucis?

Reply

Marsh Posté le 15-09-2006 à 13:49:36    

bjone a écrit :

oui, donc refais le premier post en lisible :D

Oui, il y a le bouton editer pour ça d'ailleurs.
Sinon, la moderation pourrait bien utiliser le bouton "envwayé ché lé TT (lol)"  :whistle:  
Corriger l'orthographe anglaise de la citation associée serait une cerise sur le gateau.
A+,


Message édité par gilou le 15-09-2006 à 13:50:54

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-09-2006 à 16:25:13    

je souhaite cree un secteur de demarrage qui lancerai un programme .COM
 
je me suis donc renseigner sur mon support.
ce sera une compact-flash en FAT16.
pour retrouver le fichier .COM la methode est donc asser simple
il faut charger les donnees du MBR en memoire, y retrouver la position de la  
partition FAT active, charger le "root directory" (repertoire racine) pour retrouver
la position du premiere cluster du fichier .COM. Bref, tous ca dans la tehorie c'est
bien joli mais dans la pratique....!
 
j'ai pas mal de problemes avec mes donnees... j'arrive bien a copier mes donnees du disque vers
la memoire, a les lire et tout et tout.... mais je lutte pas mal (bizzarement!) pour utliliser des valeurs
que j'ai rentrer en dur dans mon programme...
j'ai dus metre certaine valeur en dur pour recree l'entete d'une partition fat  
et il m'est impossible d'y acceder, elles sont toute erronee...
quelq'un aurrait-il une idee d'ou cela pourrait venir??
 
pour info: je joue beaucoup avec les registres de segment DS, ES et les index SI et DI

Reply

Marsh Posté le 19-09-2006 à 16:25:13   

Reply

Marsh Posté le 20-09-2006 à 11:39:15    

bon j'ai finalement trouver...
le MBR charge bien le secteur de demarrage en 07c0:0000 mais  
le segment de donne avait un offset negatif de 0010:0000
j'ai donc du regler DS a 07B0 pour retrouver mes donnees

Reply

Marsh Posté le 20-09-2006 à 14:10:07    

de l'assembleur 16 bits [:totoz]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-09-2006 à 14:46:22    

:)  ne pleure pas Harkonnen, c'est pas grave!
 
je n'ai pas le choix, tout les secteur de demarrage sont codes ainsi....

Reply

Marsh Posté le 20-09-2006 à 23:21:00    

tu sais, même en mode réel tu as droit au 32bits :D

Reply

Marsh Posté le 21-09-2006 à 10:19:44    

certe....
mais sur une archi x86, au demarrage, la machine ne tourne qu'en 16bit....
ou alors, tout les articles que j'ai lu sont faux.
 
je vous donne mes sources :
http://www.interclasse.com/articles/boot.php
http://ata-atapi.com/hiwos2.htm
http://fr.wikipedia.org/wiki/File_Allocation_Table

Reply

Marsh Posté le 21-09-2006 à 12:25:52    

tu as deux choses:  
instructions 16bits ou 32bits
mode réel ou mode protégé

Reply

Marsh Posté le 21-09-2006 à 12:26:38    

ça dépends si tu veux faire un bootsector compatible 286  :whistle:

Reply

Marsh Posté le 21-09-2006 à 14:33:39    

dans l'idee, il faudrai que ce soit compatible avec le plus de machine possible.
et le programme que doit lancer le loader (qui sera lui meme charger par mon secteur de boot)
tourne deja en mode reel.
tu pense qu'il y aurait une possibilitee de fair le secteur de demarrage avec des instructions 32bit?

Reply

Marsh Posté le 21-09-2006 à 14:37:16    

sachant biensur que je m4ai droit qu'au interuption du BIOS

Reply

Marsh Posté le 21-09-2006 à 23:37:20    

oui tu peux avoir droit aux instructions 32 bits si nécessaire.
 
par contre utiliser des instructions 32 bits en mode généreront plus d'octets (dû à l'octet de préfixe et aux immédiats/offsets qui risque de prendre plus de place).
 
mais tu peux très bien te contenter de faire du 16bits, et uniquement du 32bits au besoin.


Message édité par bjone le 21-09-2006 à 23:40:45
Reply

Marsh Posté le 22-09-2006 à 12:18:22    

si je comprend bien... les jeux d'instructions sont les memes.
seul la taille des operandes change... c'est bien ca?
je pensai qu'il y avait un mode a activer pour passer en 32bit.
un peu comme le passage du mode reel au mode proteger...


Message édité par sociopath_epitech le 22-09-2006 à 12:18:46
Reply

Marsh Posté le 22-09-2006 à 14:39:22    

voilà.
 
en fait il y a un octet de préfixe (66h je crois), qui indique que l'instruction qui suit n'est pas en taille d'opérande courante.
 
ie, un mode réel, l'octet de préfixe spécifies l'instruction suivante en 32bits, et en mode protégé ce même octet de préfixe spécifies l'instruction suivante en 16bits.
 
(ndlr ce qui empêchait le pairage sur le Pentium 1: en mode réel tu pouvais pairer que des instructions 16bits et en mode protégé que des instructions 32bits).
 
- ça va de soit que même si tu as accès aux instructions 32bits (avec les registres eax, ebx....), tu reste en adressage 20bits avec segment:offset.
 
avec un assembleur ne supportant pas le ".386" pour autoriser le jeu d'instruction 32bits, tu peux tricher avec des db 66h:
 
style:
 
db 66h
xor ax,ax => xor eax,eax
 
par contre si y'a des immédiats ou des offsets, faut faire gaffe

Reply

Marsh Posté le 25-09-2006 à 09:59:31    

ok, super.
merci de l'info. c'est bon a savoir.

Reply

Marsh Posté le 26-09-2006 à 13:37:37    

voila... j'ai reussie a charger un fichier .COM en memoire.
maintenant je souhaiterai sauter jusqu'a lui mais je ne comprend pas bien ce qu'il ce passe...
je sais qu'il faut en realite sauter 100h plus loin que le debut du programme
(pour sauter la zone PSP) mais je me demande s'il n'y a pas autre chose a faire avant....
 
quelqu'un aurait-t-il une idee?

Reply

Marsh Posté le 26-09-2006 à 14:26:55    

ton .com il fait quoi ?
il utilise pas de services DOS j'espère ? :D
 
fait le tourner en boucle et afficher des conneries voir.

Reply

Marsh Posté le 26-09-2006 à 15:34:43    

je suis vraiment un boulet....
en plus je l'ais note plus haut.... en realiter c'est pas moi qui est pondu de petit .COM.
je n'ai pas verifier s'il en utilise ou pas...
je vais en faire un autre....  
 merci!
 
ce .COM etait sencer afficher "hi!".... mais il fait pres de 6Ko... il a dus etre assembler avec un million de lib.

Reply

Marsh Posté le 26-09-2006 à 15:59:46    

bon je viens de tester avec un tout petit .COM a la con qui affiche "hello" et qui n'a pas de PSP
je suis a peu pres sur que mon prog ne saute pas car CS ne bouge pas....
je charge mon programme "hello" en 5000:0000 et je souhaite sauter a cette adresse....
c'est possible?
 
j'utilise une machine virtuelle (bochs sous linux pour ceux qui connaisse),,, et je vois le message  
d'erreur:
00001459997i[CPU  ] LOCK prefix unallowed (op1=0x4b, attr=0x0, mod=0x0, nnn=0)
 
et je vois aussi:
00001460000i[CPU  ] | SEG sltr(index|ti|rpl)     base        limit       G D
00001460000i[CPU  ] |  DS:5000( 0000| 0|  0) 00050000 0000ffff 0 0          (regler par mes soins)
00001460000i[CPU  ] |  ES:5000( 0000| 0|  0) 00050000 0000ffff 0 0          (regler aussi par mes soins)
00001460000i[CPU  ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00001460000i[CPU  ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00001460000i[CPU  ] |  SS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00001460000i[CPU  ] |  CS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00001460000i[CPU  ] | EIP=0000010b (0000010b)


Message édité par sociopath_epitech le 26-09-2006 à 16:00:57
Reply

Marsh Posté le 26-09-2006 à 16:09:13    

oui bon..... je viens de voir qu'on pouvais pas sauter n'importe ou en memoire......
la c'etait un peu trop loin.... il faut que je trouve un autre endroit pour le charger en memoire....
desole pour le boulisme....


Message édité par sociopath_epitech le 26-09-2006 à 16:09:24
Reply

Marsh Posté le 26-09-2006 à 17:51:40    

voila... j'ai une version beta qui est capable de lancer un .COM ne comportant pas de PSP
il faudrai maintenant que je me panche sur ce fameux PSP...
quelqu'un aurait une idee?

Reply

Marsh Posté le 27-09-2006 à 14:49:11    

il va maintenant faloir que je fasse un .COM qui chargera un .EXE en memoire et qui le lancera.
cette operation (delicate!) consiste a lire le header du .EXE et de modifier toutes les adresse que contient le .EXE...puis enfin de sauter au bon endroit dans le programme,,,
ca va pas etre une mince affaire!
j'ai trouver ici http://cui.unige.ch/DI/cours/1840/ [...] truct.html le contenu du header
d'un .EXE... il je vais le decortiquer afin de savoir de quoi il retourne.
quelqu'un en serait-il peut etre deja plus?   ;)
un ptit coup de main ne serais pas de refus....

Reply

Marsh Posté le 28-09-2006 à 19:29:44    

Une des meilleures réference que je connaisse sur les PE :
THE PORTABLE EXECUTABLE FORMAT : http://www.nikse.dk/petxt.html"
Il y a une version en français qui traîne sur le Net, mais je ne l'ai pas retrouvée.
 
enfin toussa c'est pas de l'asm...

Reply

Marsh Posté le 29-09-2006 à 10:45:09    

merci Scarmatil... :)
tout ca m'a l'air tres interessant... je vais me pencher dessus.
pourquoi pense tu que ce n'est pas de l'ASM?

Reply

Marsh Posté le 29-09-2006 à 12:41:10    

http://hyatus.newffr.com/TAZ/Rever [...] ortable%22
jej crois que la version francaise dont tu parlais est la au format pdf... mais je trouve ca bien compliquer  
comparer a mes besoin... de plus je manque de temp
mais merci quand meme! :)

Reply

Marsh Posté le 02-10-2006 à 11:55:32    

il me reste un dernier problemme a regler..
l'ors de mon saut en memoire jusqu'a mon .COM  
j'utilise un CALL, or calll ne peu pa me fair sortir du segment...
je ne peut donc pas charger mon prog ou je veux,,,,
comment pourrais-je faire pour faire un saut de la taille d'un segment (par exemple)...?

Reply

Marsh Posté le 02-10-2006 à 12:53:00    

[:drapal] pour la curiosité (j'ai déja eu à bazarder des instructions 32bits dans du code 16bits, à jouer avec vecteurs d'interruptions, à trifouiller la table des segments toussa).
 
Question du jour quand même : c'est quoi la finalité du bazar ? (lancer le code d'un .exe au démarrage de la machine, mais pourquoi faire ?)

Reply

Marsh Posté le 02-10-2006 à 13:36:39    

sociopath_epitech a écrit :

il me reste un dernier problemme a regler..
l'ors de mon saut en memoire jusqu'a mon .COM  
j'utilise un CALL, or calll ne peu pa me fair sortir du segment...
je ne peut donc pas charger mon prog ou je veux,,,,
comment pourrais-je faire pour faire un saut de la taille d'un segment (par exemple)...?


 
y doit bien y avoir un moyen de faire un jump far ?

Reply

Marsh Posté le 02-10-2006 à 15:13:50    

Mackila a écrit :

[:drapal] pour la curiosité (j'ai déja eu à bazarder des instructions 32bits dans du code 16bits, à jouer avec vecteurs d'interruptions, à trifouiller la table des segments toussa).
 
Question du jour quand même : c'est quoi la finalité du bazar ? (lancer le code d'un .exe au démarrage de la machine, mais pourquoi faire ?)


 
c'est pour des equipements embarques... genre ecran de control, la plateforme est une sorte de mini-pc avec un pitit ecran LCD assez mignon.

Reply

Marsh Posté le 02-10-2006 à 15:19:50    

bjone a écrit :

y doit bien y avoir un moyen de faire un jump far ?


 
oui, j'y ai pense mais je n'arrive pas a trouver de syntaxe correcte. j'ai fais plusieur tentative a tatton du genre
 

Citation :


 
PRG_START    equ     0800h   ;segment ou est charger mon prog
 
,,,,
 
jmp                  far ptr  PRG_START
 


ou

Citation :


jmp                  far ptr PRG_START:0000


 
biensur le "0800h" devrai pouvoir devenir un "5000h"
si ca peut aider, j'utilise MASM.....


Message édité par sociopath_epitech le 02-10-2006 à 15:21:47
Reply

Marsh Posté le 02-10-2006 à 16:28:01    

et via des registres style jmp es : di


Message édité par bjone le 02-10-2006 à 16:28:15
Reply

Marsh Posté le 02-10-2006 à 16:31:15    

normalement tu devrais pouvoir y arriver:
 
http://cui.unige.ch/DI/cours/1840/ [...] pcall.html
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed