Secteur boot : afficher un message

Signaler
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008
-
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008
-
bonjour
je suis ADABLA et je debute en OS, il y a 1 semaine. je voudrai SVP, votre avis sur mon petit code de boot.
En fait je voudrai afficher un message au demarrage mais je passe par une methode qui marche certes mais ne me plait pas beaucoup.
Vous avez une autre methode?
je vous envoie le code que j'utilise


[bits 16]
[org 100h]


;*** cette partie me permet de sauver sur le secteur 1 de la disquette ***
mov ax,0x00
mov dl,0x00
int 0x13
mov ax,0x301
mov bx,start
mov dx,0x0000
mov cx,0x0001
int 0x13
ret
;*********************************************************


;********** partie qui est sauvée sur le secteur 1 *********
start:


mov ah,0h ; je rentre en mode graphique 320x200x256
mov al,13h
int 10h


mov ah,0x0e ; je me prepare a ecrire un caractere
mov bh,0x00
mov bl,0x07


message:
mov al,'O' ; debut de mon message
int 0x10 ; mais cela se fait caractere par caractere
mov al ,'S'
int 10h
mov al,' '
int 0x10
mov al ,'V'
int 10h
mov al,'E'
int 0x10
mov al ,'R'
int 10h
mov al,'S'
int 0x10
mov al ,'I'
int 10h
mov al,'O'
int 0x10
mov al ,'N'
int 10h
mov al,' '
int 0x10
mov al ,'1'
int 10h
mov al,'.'
int 0x10
mov al ,'0'
int 10h ; a partir d'ici je ne sais pas comment revenir a la ligne apres


times 510-($-start) db 0
db 0aah
db 55h
;********************* fin *******************


voila le code. je precise que j'ai essayé ce code d'avord à partir du label message ci dessus:


message:
msg db "OS version 1.0",10,13,0
mov si,msg


mov ah,0x0e
mov bh,0x00
mov bl,0x07
continue:
lodsb
cmp al,0
je fin
int 10h
jmp continue
fin:


times 510-($-start) db 0
db 0aah
db 55h


et avec ce code ca ne marche pas du tout. Il n'affiche rien du tout.


Merci beaucoup de m'aider, vraiment

8 réponses

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

tu ne creera jamais un secteur de boot avec une origine de 0x100. Le Bios charge ton mbr a l'offset 0x7C00. Donc il faut mettre [ORG 0x7C00]

ensuite, tu integre le binaire
de ton mbr dans ton programme com.

de plus, il faut savoir que le code doit commencer a 0x7C00. Si tu met une chaine de caractere, tu cree un code aléatoire qui bien sur plantera a l'execution.

la bonne methode c'est:
jmp moncode
msg db "blablablabla",13,10,0
moncode:
mov si,msg
[ici c'est les mov et tout et tout]

ou alors:

moncode:
mov si,msg
[ici c'est les mov et tout et tout]

msg db "blablablabla",13,10,0

@++
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

merci de ta reponse patatalo. je vais refaire mon code avec tes indications.
Juste une précision. dois je initialiser mes segments (DS et ES):
1ere maniere:
code:

[bits 16]
[org 0x7C00h]

moncode:
mov ax,cs
mov ds,ax
mov es,ax

mov si,msg
mov ah,0x0e
mov bh,0x00
mov bl,0x07
continue:
lodsb
cmp al,0
je fin
int 10h
jmp continue
fin:
msg db "blablablabla",13,10,0

times 510-($-start) db 0
dw 0x0aa55h

ou 2eme maniere:
code:

[bits 16]
[org 0x7C00h]

moncode:
mov ax,0x7C00
mov ds,ax
mov es,ax

mov si,msg
mov ah,0x0e
mov bh,0x00
mov bl,0x07
continue:
lodsb
cmp al,0
je fin
int 10h
jmp continue
fin:
msg db "blablablabla",13,10,0


times 510-($-start) db 0
dw 0x0aa55h

ton aide m'es vraiment necessaire. Je te met au courant des resultats de ton aide.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

pour acceder a ta memoire en mode réel, tu utilise un segment et un offset.
l'adresse physique = segment * 16 + offset.
concretement, quand tu ecris "mov ax,[bx]" tu ecris implicitement "mov ax,[ds:bx]"
ds est utilisé par defaut pour tout les acces memoire sauf pour le registre bp qui lui utilise le segment ss par default.

donc:soit tu mets cs ds es = 0 et ton offset sera de 0x7C00soit tu mets cs ds es = 0x7C0 et ton offset sera 0soit tu mets cs ds es = 0x7B0 et ton offset sera de 0x100
...

fait une recherche sur "Art of Assembly" ou un truc comme ça sur google.

@++
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

slt,
j'irai jeter un coup d'oeil sur ce site, je le connaissait deja, mais je vais le relire.
Pour revenir a mon probleme, j'ai fait ce que tu dis. Ca ne plante plus, OK. Mais aucun message. ca charge mon secteur, ca passe en mode gtaphique 320x200x256( refere premier code plus haut) et plus rien. Le trou noir. j'ai juste fait:

[BITS 16]
[ORG 0x7C00]
;*** cette partie me permet de sauver sur le secteur 1 de la disquette ***
mov ax,0x00
mov dl,0x00
int 0x13
mov ax,0x301
mov bx,start
mov dx,0x0000
mov cx,0x0001
int 0x13
ret

moncode:

mov ah,0h ; je rentre en mode graphique 320x200x256
mov al,13h
int 10h

mov si,msg
[les movs.....]

msg db "blablablabla",13,10,0
times 510-($-start) db 0
dw 0x0aa55h

je soupsonne le code qui charge sur le premier secteur mbr, mais quant j'affiche caractere pas caracter c'est OK, mais enervant si le message est long. Je ne voudrai surtout pas t'embeter, mais tu n'aurais pas un code simple qui fonctionne, un code pour NASM?
SVP ne vous faché pas pour des trucs aussi simple, c'est important pour moi.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

voilà un code mbr de disquette commun qui charge un kernel stocké a partir du secteur 2:
une fois compilé, nous l'appelerons mbrD7.bin

[ORG 0]
[BITS 16]
%define pb byte
%define pw word
%define pd dword


%define pushb push byte
%define pushw push word
%define pushd push dword


start:
jmp .mbrcode
nop
.name
db "TOMFAT "
.SecSize
dw 512
.ClustSize
db 1
.RsvdCnt
db 1
.FatCnt
db 2
.RootCnt
dw 224
.TotSec16
dw 2880
.Media
db 0xF0
.FatSize16
dw 9
.TrkSize
dw 18
.HeadCnt
dw 2
.HiddCnt
dd 0
.TotSec32
dd 0
.DrvNum
db 0
.Reserved1
db 0
.BootSig
db 0
.mbrcode
mov ax,0x7F0
mov dx,0x7C0
cli
mov ss,ax
xor sp,sp
mov es,ax
mov ds,dx
sti
cld


pushw 5
pushw [kernsize]
pushw 0x100
pushw 0
pushw 2
mov bp,sp


lea si,[azlk]
call outs


.0
dec pw[bp+8]
je .4
.1
lea si,[azpt]
call outs
mov ax,0x201
mov bx,[bp+4]
mov dx,[bp+2]
mov cx,[bp]
int 0x13
jc .1
cmp pb[bp],18
jne .2
inc pb[bp+1]
and pb[bp],0
.2
cmp pb[bp+1],80
jne .3
and pw[bp],0
inc pb[bp+3]
.3
inc pb[bp]
add pw[bp+4],0x200
dec pw[bp+6]
jne .1


add sp,10


lea si,[azok]
call outs


push ss
push ss
pop ds
pushw 0x100
xor ax,ax
xor bx,bx
xor dx,dx
xor cx,cx
xor si,si
xor di,di
xor bp,bp
retf


.4
lea si,[aznok]
call outs
xor ax,ax
int 0x16
int 0x19


outs:
cmp pb[si],0
mov al,[si]
je .1
mov ah,0xE
int 0x10
inc si
jmp outs
.1
ret
azpt:
db ".",0
azlk:
db "Load kernel",0
aznok:
db "n"
azok:
db "ok",13,0


times (508-($-start)) nop
kernsize:
dw 0
db 0x55,0xAA

voilà le code qui permettra de creer la d7 boot et que nous appelerons une fois compilé mkboot.com:

%define pb byte
%define pw word
%define pd dword


%define pushb push byte
%define pushw push word
%define pushd push dword


[BITS 16]
[ORG 0x100]
mkboot:
mov pw[bootdata+0x1FC],((kernpad-kerndata)/512)+1
lea bx,[bootdata]
mov dx,0
mov ax,0x301
mov cx,1
int 0x13
jc mkboot


pushw ((kernpad-kerndata)/512)+1
pushw kerndata
pushw 0
pushw 2
mov bp,sp


.1
mov ax,0x301
mov bx,[bp+4]
mov dx,[bp+2]
mov cx,[bp]
int 0x13
jc .1
cmp pb[bp],18
jne .2
inc pb[bp+1]
and pb[bp],0
.2
cmp pb[bp+1],61
jne .3
and pw[bp],0
inc pb[bp+3]
.3
inc pb[bp]
add pw[bp+4],0x200
dec pw[bp+6]
jne .1

add sp,8
ret


bootdata:
incbin "mbrD7.bin"
kerndata:
incbin "kernel.com"
kernpad:
times 512 nop
kernend:

le fichier batch pour compiler tout ça:
\bin\nasm.exe -f bin -o mbrD7.bin mbrD7.asm
\bin\nasm.exe -f bin -o kernel.com kernel.asm
\bin\nasm.exe -f bin -o mkboot.com mkboot.asm

cela te permettra de créer et charger un kernel d'une taille max de 60Ko environ.

@++
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

re,

merci, je vais etudier ce code de tres pres. Avec un chargement de kernel c'est un peu plus compliqué pour moi mais pas impossible, je voulais d'abord comprendre le chargement d'une chaine de caractere simple. Je suis content d'avoir en plus un chargement de kernel. Comme on le dis chez nous (chez d'autres aussi) tu m'a donné le beurre et l'argent du beurre. Mais bien sur attends toi a d'autres questions mais cette fois ci elles refleteront une evolution que tu m'a apporté. Merci PATATALO. see you
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

je crois que vous aurez du commenter un peu votre code, il y a trop de dans ma tete....
le l'ai imprimé pour mieu l'exploiter. mais j'ai compris le principe, enfin je crois :

-declaration des variables à labels
.name
db "TOMFAT"
....................
.Bootsig
db 0

-puis initialiser les registres segments en desactivant les interruption (CLI)
la pile va de 0h à 7F0h (mais je pensais que ss contenait la faible valeur (0h) et sp la grande valeur ( 7C0h), et vous avez fait l'inverse. A moins que ca n'ai pas d'importance.
es et ds pointe vers 07C0h, où est chargé mon secteur lors du boot, si j'ai bien compris vos explication.

-mais pourkoi :
cld
pushw 5
pushw [kernsize]
pushw 0x100
pushw 0
pushw 2
mov bp,sp

la fonction outs sert à imprimer tout ce qui est texte sur l'ecran.
- on affiche apres "Load kernel"
-pw[bp+8] signifie word[bp+8] si je ne me trompe pas. mais j'ai pas bien compris les bp+4 ou bp+8 etc.

voila c'est tout pour le mbrD7.bin
pour le mkboot.com, alors là c'est la cata.
pourkoi heuuu !!!, pourkoi toutes instructions? et pourtant c'est la partie que je veux surtout comprendre pour charger mon mbr, car bochs ne marche pas bien chez moi.

Merci de prendre de temps en temps votre temps pour m'expliquer et aussi me donner des codes, je serai peut etre utile plus tard. Ne vous decouragé pas je vais finir par comprendre et reussir..
a bientot PATATALO
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

merci beaucoup de ton aide. J'ai passé mon temps à etudier ton code et d'autres encore. En fait le probleme est que j'inclus le code qui charge sur le premier secteur dans le meme fichier que le code du boot. Je les ai separé en deux fichier comme tu l'a fait: boot.bin et mkboot.com. Je t'envoie les sources. Franchement merci. le resultat est cool. et comme c'est mon premier boot diskette, je suis content . peut etre que mon code sera util a d'autres.

Je vous envoie les sources que vous verrez. j'espere que cela va aidez ceux qui sont deja dans le meme probleme que moi, a s'en sortir.
au fait comment on envoie les sources zippées ou dois je ecrire le code directement ici?