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 <bios.h>
#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:
[ Lien ]
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.