anonyme_man_in_this_world
Messages postés161Date d'inscriptionsamedi 25 juin 2005StatutMembreDernière intervention 1 août 2006
-
5 août 2005 à 23:04
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 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
@+
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_sylvain16
Messages postés14Date d'inscriptionvendredi 15 juillet 2005StatutMembreDerniè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:
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.
cs_sylvain16
Messages postés14Date d'inscriptionvendredi 15 juillet 2005StatutMembreDerniè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:
cs_sylvain16
Messages postés14Date d'inscriptionvendredi 15 juillet 2005StatutMembreDerniè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:
Mareck666
Messages postés56Date d'inscriptionlundi 6 février 2006StatutMembreDernière intervention30 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)
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.