Secteur de boot : comment ordonner des commandes ???
Foub12
Messages postés44Date d'inscriptionmardi 9 juillet 2002StatutMembreDernière intervention 1 avril 2007
-
2 sept. 2004 à 22:37
TheLudo2013
Messages postés77Date d'inscriptionmardi 12 novembre 2002StatutMembreDernière intervention18 octobre 2007
-
3 janv. 2005 à 21:29
Bonjour,
j'ai une question qui me turlupine depuis un petit moment et j'aimerais bien connaître la réponse...
Le secteur de boot (d'une disquette par exemple) peut-etre contenu dans un tableau de 512 octets donc déclarés comme suit : « unsigned char Buffer[512] ».
Mais là, où je comprends pas, c'est comment dans un tableau de caractères, on peut entrer des instructions qu'interprètera le processeur ????
Pour faire afficher un 'A' avec l'assembleur, on écrirait :
«
mov ah, 0eh
mov al, 41h
int 10h
»
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 2 sept. 2004 à 23:04
le code assembleur doit être transformé en binaire (suite d'octet) que le processeur va décoder et exécuter. le secteur de boot contient 512 octets qui peuvent effectivement être représentés dans un tableau de caractères (car 1 char = 1 octet) mais son contenu ne sera pas humainement lisible
Mais explique moi, où tu lui dis qu'il faut qu'il mette 0Eh dans ah, 41h dans Al et qu'est-ce que tu écris comme caractère pour lui ordonner d'exécuter : int 10h ????????
Là, tu n'as fait que mettre des valeurs dans le tableau...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 sept. 2004 à 23:45
djl> tout ce qui sera dans le bloc
__asm {
}
sera en asm, pas besoin que soit ailleurs, ou alors je ne saisis pas le prob.
Foub12> je ne fais effectivement que mettre des valeurs aux octets, je pensais que c'etait ce que tu voulais.
La zone de boot est lue depuis une interruption bios qui donnera la main au systeme si le boot est valide. A toi de mettre une zone boot correcte.
Foub12
Messages postés44Date d'inscriptionmardi 9 juillet 2002StatutMembreDernière intervention 1 avril 2007 2 sept. 2004 à 23:52
donc si je comprends bien, c le système qui tout seul, saura qu'il faut qu'ils mettent ces valeurs dans le bon registre et et qui de lui même fera appel aux interruptions...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 sept. 2004 à 23:57
va voir exemples de sector boot sur asmfr, tu verras de quoi il retourne.
Si tu veux regarder ce qu'il y a dans la zone boot d'un disque, tu prends mon prog (toujours sur asmfr) qui fait des 'ISO' et tu en fais un depuis un CD bootable par exemple. Te suffira d'afficher ensuite les octets du iso, ce n'est rien d'autre que la zone boot.
Foub12
Messages postés44Date d'inscriptionmardi 9 juillet 2002StatutMembreDernière intervention 1 avril 2007 3 sept. 2004 à 02:23
soit le code suivant :
«
unsigned char Buffer[512];
void test()
{
//affiche un A
asm {
mov ah, 0eh;
mov al, 41h;
int 10h;
}
}
»
Comment puis-je écrire en C pour que mon Buffer contiennent les instructions machines de ma fonction test ???
Naturellement, si j'écris Buffer = test, mon code refuse de compiler...
J'aimerais en fait que Buffer égale :
Buffer[0] = b4
Buffer[1] = 0e
Buffer[2] = b0
Buffer[3] = 41
Buffer[4] = cd
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 3 sept. 2004 à 14:57
le memcpy de aardman m'a aide a comprendre ce que tu voulais.
Par contre Foub12 devra retirer le 'ret 0' de proc Test() et y mettre tout ce don il a besoin.
Foub12
Messages postés44Date d'inscriptionmardi 9 juillet 2002StatutMembreDernière intervention 1 avril 2007 3 sept. 2004 à 15:28
re,
tout d'abord, merci pour votre aide à tous...
BruNews, j'ai un petit soucil avec ton code... Je travaille avec Turbo C++ et il ne compile pas...
Lorsque j'écrit : «
__declspec(naked) void __stdcall Test()
{
__asm {
mov ax, 0E41h
int 10
ret 0
}
}
», il me mets : "__stdcall n'est pas un paramètre de la fonction __decspec"...
J'ai essayé d'enlever __stdcall mais cela ne marche toujours pas.
J'ai aussi essayé en remplacant __asm par "asm" et en mettant des points virgules à la fin de chaque instruction assembleur... mais sans résultat...
Ensuite, il ne comprend pas non plus le mot-clé DWORD... Je l'ai remplacé par "unsigned int", est-ce que j'ai bien fait ???
Enfin, quand tu écris : « a = Test; », il me mets un warning : « Suspicious pointer conversion » alors que tu as bien déclaré la variable a en void *...
Autre question, au lieu de créer une fonction en asm pur, en utilisant le mot clé : « __declspec(naked) », est-ce qu'il ne serait pas possible de laisser ma fonction C initiale (qui intègre quand même un peu d'assembleur) et d'écrire un truc du style :
« memcpy(Buffer, test, sizeof(test)); » ?????
Foub12
Messages postés44Date d'inscriptionmardi 9 juillet 2002StatutMembreDernière intervention 1 avril 2007 3 sept. 2004 à 15:43
beh si mais quand tu veux utiliser les interruptions du BIOS comme par exemple mon « int 10h », je peux pas utiliser VC++... :(: :( :( donc on m'a conseillé de télécharger ce bon vieux Turbo C++ fonctionnant en 16 bits...
TheLudo2013
Messages postés77Date d'inscriptionmardi 12 novembre 2002StatutMembreDernière intervention18 octobre 2007 3 janv. 2005 à 21:29
Pour des raisons qui deviennent de plus en plus évidente au fil de ce thread, les boot sector s'écrivent en assembleur pure et surement pas dans un language de haut niveau.