Probleme avec un bootloader

anonyme_man_in_this_world Messages postés 161 Date d'inscription samedi 25 juin 2005 Statut Membre Dernière intervention 1 août 2006 - 5 août 2005 à 23:04
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 4 nov. 2007 à 13:52
salut !!

je voudrais coder un bootloader , tous ce compile bien ,je copie / colle le

fichier .BIN dans une disquette ,mais lors le redemmarrage de l'ordinateur rien

ne se passe (: . voici le code :
org 0000h
mov ax,07C0h
mov ds,ax
mov es,ax
mov ax, 08000h
mov ss,ax
mov sp, 0f000h
start :
MOV AH , 0Eh
MOV AL ,'h'
int 10h
MOV AL ,'e'
int 10h
mov al , 'l'
int 10h
mov al , 'l'
int 10h
mov al , "o"
int 10h
mov al , ' '
int 10h
mov al , "w"
int 10h
mov al , "o"
int 10h
mov al , "r"
int 10h
mov al , "l"
int 10h
mov al , "d"
int 10h
xor ax , ax
int 16h
end start
MOV AX,04ch
INT 10h
ret 0
;******************************************************************************
merçi d'avance pour tout aide
@+

11 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
6 août 2005 à 10:39
salut,

qu'est ce que tu appelle coller le .bin a la d7 ?

@++
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
6 août 2005 à 10:47
re,

* un mbr finis par le mot 0xAA55
* remet mov ah,0eh a chaque appel int 10h
* c'est quoi ça:
MOV AX,04ch
INT 10h
* ret 0 vers ou ?
* copier le mbr sur le premier secteur de la d7.

bref, informe toi un peu sur le boot pc.

@++
0
anonyme_man_in_this_world Messages postés 161 Date d'inscription samedi 25 juin 2005 Statut Membre Dernière intervention 1 août 2006
6 août 2005 à 13:39
desolé , mais je ne comprends pas un mot clef dans ton message :

quesque tu veut dire avec "mbr" ?

*remet mov ah,0eh a chaque appel int 10h -> je crois pas que ah va changer
automatiquement : dans le reste du code , je ne l'ai jamais touche donc ...

*MOV AX,04ch
INT 10h -> quitter le programme

merçi 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
6 août 2005 à 16:55
re,

mbr = master boot record ( secteur de boot ou d'amorce )
ok la fonction 0eh de l'int 10h semble ne modifier aucun registre.
mov ax,4c00h; int 21h quitte un programme mais c'est une fonction DOS que tu ne pourra pas utiliser.

@++
0

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

Posez votre question
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005
6 août 2005 à 17:29
Pour commencer, à moins que tu es prévu d'ajouter
d'autres choses à ton code et sauf erreur de ma part, tu n'a pas besoin
d'initialiser ss et sp, ils ne te servent pas ici. Ensuite il ne me
semble pas que mov ax, 4cH INT 10H fasse arrêter un programme.

De plus copier/coller ton bin sur ta disquette n'est
pas une bonne solution, utilise un petit programme pour copier ton bin
sur le premier secteur de ta disquette, il doit s'y trouver
impérativement.



Pour créer une disquette bootable, la seule chose requise est que le
secteur de boot ait une taille de 512 octets et qu'a l'offset 0x1FE
(octet 510), on place le word 0xAA55. Le BIOS vérifie que le premier
secteur de la disquette est bien le word 0xAA55 à la fin, et s'il le
trouve, il charge ce secteur en mémoire, à l'adresse 0x7C00 et JMP à
cette adresse.



Tu doit placer ton secteur de boot sur le secteur 1, cylindre 0, tête 0



Lorsque le BIOS charge le secteur de boot, l'état des registres est:

DL Lecteur sur lequel il a booté, 1h disquette, 80h = 1er disque dur, etc

CS = 0

IP = 0x7c00



Normalement si tu écrit ton programme comme çà, çà doit fonctionner:



[BITS 16] ; Le BIOS démarre en mode réel 16-bit

[ORG 0] ; Data offset = 0



jmp start

message db 'Hello World", 13h, 10h, 0



start

mov ax, 0x7C0

mov ds, ax

mov es, ax

mov fs, ax

mov gs, ax

mov si, message ; c'est plus simple qu'écrire chaque lettre, une après l'autre

lodsb ; charge l'octet à ds:si dans al

or al,al ; teste si le caractère est 0

jz fin_affichage

mov ah,0eh ; place le caractère

mov bx,0007 ; attribut

int 0x10 ; appel le BIOS

jmp message

fin_affichage:

xor ax, ax

int 16h

db 0EAh
; Language machine
pour jumper à FFFF:0000 (reboot, je sait pas comment arrêter




simplement la machine)

dw 0000h

dw 0FFFFh

end start ; pas besoin de mettre de ret: tu reboot







Pour copier le secteur sur la diquette j'ai trouvé un petit programme à
compiler sous DJGPP pour DOS, mais il est pas en assembleur :-(



//***************START****************

#include

#include <stdio.h>



void main()

{

FILE *in;

unsigned char buffer[520];



if((in = fopen("bootsect", "rb"))==NULL)

{

printf("Error loading file\n");

exit(0);

}



fread(&buffer, 512, 1, in);



while(biosdisk(3, 0, 0, 0, 1, 1, buffer));



fclose(in);

}

//*************END****************************





Tu trouvera d'autres information sur le boot à cette adresse:



http://www.nondot.org/sabre/os/articles/



Pense à vérifier (avec un éditeur hexa) que ton Bin fasse bien 512 octets et place 0xAA55 sur les 2 derniers octets.

Tu m'en voudra pas si je ne l'ai pas essayé, je n'est pas de lecteur de
disquette et j'ai pas trop le temps non plus. Dis moi si çà ne marche
pas. Salut.
0
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005
6 août 2005 à 17:35
Une petite erreur c'est pas

message db 'Hello World", 13h, 10h, 0

mais

message db 'Hello World", 13, 10, 0

désolé
0
anonyme_man_in_this_world Messages postés 161 Date d'inscription samedi 25 juin 2005 Statut Membre Dernière intervention 1 août 2006
6 août 2005 à 18:49
re
merçi pour le code mais ça marche pas : les deux compilateurs A86 et TASM

generent a lot d'erreurs lors la compilation (: .

je vais essayer de lire un peu le tutoriaux du site que tu m'as passé

merçi
@+
0
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005
7 août 2005 à 14:50
J'ai testé le code sous A86, mais je
ne connaissait pas la syntaxe, j'ai dut calculer les sauts et j'ai
réussit à compiler un Bin mais j'ai du rectifier les jump à la main
avec un éditeur hexa et w32dasm pour vérifier. Le code que je te donne
ne se compile pas sous A86: jmp 0e8h ne passe pas, modifie le, tu le
rectifiera à la main dans éditeur hexa.



mov ax, 07C0h

mov ds, ax

mov es, ax

mov fs, ax

mov gs, ax

mov si, 21

lodsb

or al,al

jz 09h

mov ah,0eh

mov bx,0007

int 010h

jmp 0e8h

xor ax, ax

int 16h

db 0EAh

dw 0000h

dw 0FFFFh

db 'Hello World", 13h, 10h, 0



Ensuite sous un editeur hexa tu rajoute des 0 pour que ton Bin fasse
512 octets, et les 2 derniers tu tape 55aa, et tu devrait obtenir:



00000000 B8C0 078E D88E C0BE 2100 AC0A C074 09B4 ........!....t..

00000010 0EBB 0700 CD10 EBE8 33C0 CD16 EA00 00FF ........3.......

00000020 FF48 656C 6C6F 2057 6F72 6C64 1310 0000 .Hello World....

00000030 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000040 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000050 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000060 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000070 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000080 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000090 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000A0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000B0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000C0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000D0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000E0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000F0 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000100 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000110 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000120 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000130 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000140 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000150 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000160 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000170 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000180 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000190 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001A0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001B0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001C0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001D0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001E0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001F0 0000 0000 0000 0000 0000 0000 0000 55AA ..............U.



J'ai toujours pas pu le tester, j'espère que çà fonctionne.
0
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005
10 août 2005 à 21:00
Bon alors je me suis trompé monumentalement, (comme quoi aller trop
vite...). Mais cette fois ci j'ai pu tester sur une disquette. C'est
pas encore parfait parce çà m'affiche un truc du genre "Hello
World!!>" je sait pas pourquoi. Mais bon, çà fonctionne, à toi de
paufiner.
D'abord j'ai suprimé mov fs, ax - mov gs, ax (pas compatible mode réel)



:0001.0000 B8C007 mov ax, 07C0

:0001.0003
8ED8
mov ds, ax

:0001.0005
8EC0
mov es, ax

:0001.0007 BE2100 mov si, 0021

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0001.0016(U)

:0001.000A
AC
lodsb

:0001.000B
0AC0
or al , al

:0001.000D
7409
je 0018 ; là j'avait fait un jmp vers 0000 donc çà affichait que des "H" à l'écran...

:0001.000F
B40E
mov ah, 0E

:0001.0011 BB0700 mov bx, 0007

:0001.0014
CD10
int 10

:0001.0016
EBF2
jmp 000A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0001.000D(C)

:0001.0018
33C0
xor ax, ax

:0001.001A
CD16
int 16

:0001.001C EA0000FFFF jmp FFFF:0000



et le secteur complet:



00000000 B8C0 078E D88E C0BE 2100 AC0A C074 09B4 ........!....t..

00000010 0EBB 0700 CD10 EBF2 33C0 CD16 EA00 00FF ........3.......

00000020 FF48 656C 6C6F 2057 6F72 6C64 1310 0000 .Hello World....

00000030 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000040 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000050 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000060 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000070 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000080 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000090 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000A0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000B0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000C0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000D0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000E0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000000F0 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000100 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000110 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000120 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000130 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000140 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000150 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000160 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000170 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000180 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000190 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001A0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001B0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001C0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001D0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001E0 0000 0000 0000 0000 0000 0000 0000 0000 ................

000001F0 0000 0000 0000 0000 0000 0000 0000 55AA ..............U.



Voilà!
0
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
2 nov. 2007 à 15:51
Petite rectification que tous le monde oublis, il faut placer indicateur de BOOT 0x40:0x72 à la valeur 1234h afin d'indiquer a notre amis le bios que ces aun reboot logiciel donc éviter les test matériels de ce faire du POST.







j'aimerai savoir une chose pourquoi des petits malins s'amuse a mettre dans leur code un  :
db 0EAh
dw 0000h
dw 0FFFFh

a la place d'un jmp 0xFFFF:0X0

sa revient au meme et puis faut avouer que le code en assembleur c'est plus parlant (a moin que sa soit une touche d'éthétisme que de le mettre sous forme hexadécimal)
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
4 nov. 2007 à 13:52
salut,

tasm n'est pas fait pour faire un code mbr et n'est pas gratuit, a86 est prévu pour un processeur x86, c'est obsolète, il ne prends pas les instructions plus récentes d'ou les jmp far ecrits sous forme d'octets plutot que par une instruction.

utilise plutôt nasm.

je te conseille vivement d'initialiser la pile qui est bien évidement utilisée dans ton mbr ne serait-ce que par l'instruction "int 10h" et de plus, il peut etre appelé par un autre bootloader qui aura modifié la pile à sa convenance à un endroit qui te sera inconnu.

@++
0
Rejoignez-nous