Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > Programmation d'OS
Programmation d'OS Programmation de systèmes d'exploitation
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/07/2011, 18h08   #1
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Par défaut Création d'une image de disquette pour utiliser avec VirtualBox (Windows) ?

Bonjour,

Voici le code que j'utilise :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[ORG 7C00h]                     ; This is where BIOS put me
 
; ---------------------------------------------------------
; Main program
; ---------------------------------------------------------
 
        mov si, msg             ; Print message
        call putstr
 
hang:   jmp hang                ; Hang!
 
 
 
; ---------------------------------------------------------
; Functions and variables used by our bootstrap
; ----------------------------------------------------------
 
msg     db 'Hello Cyberspace!', 0
 
; Print a 0-terminated string on the screen
putstr:
        lodsb                   ; AL = [DS:SI]
        or al,al                ; Set zero flag if al=0
        jz .done                ; Jump to .done if zero flag is set
        mov ah,0x0E             ; Video function 0Eh
        mov bx,0x0007           ; Color
        int 0x10
        jmp putstr              ; Load characters until AL=0
.done:
        retn
 
times 510-($-$$) db 0
db 0x55
db 0xAA
Je le compile avec :
Citation:
nasm boot2.asm -f bin -o boot2.bin
Puis je créé une image de disquette avec :
Citation:
bfi -t=144 -f=boot2.img -b=boot2.bin
Lorsque je boot avec dans VirtualBox, rien ne se passe... même pas un message d'erreur... j'ai juste un curseur blanc et fixe en haut à gauche...

Si je laisse le lecteur de disquette vide, j'ai bien un message d'erreur qui indique qu'il n'y a pas de média pour booter...

Si j'utilise un fichier *.img d'une disquette de Windows 95, ça fonctionne !

Est-ce mon code qui n'est pas bon ou alors peut-être l'image de disquette qui n'est pas construite correctement ?

Merci,
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 19h20   #2
bifur
Membre habitué
 
passe le balais et l'aspirateur
Inscription : mars 2008
Messages : 111
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : passe le balais et l'aspirateur

Informations forums :
Inscription : mars 2008
Messages : 111
Points : 126
Points : 126
tu initialise si mais pas ds (le selecteur de segment) initialise le par zéros

sa valeur est inconnu si ça se trouve ce n'est pas zéros (c'est même quasiment sur)
bifur est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/07/2011, 23h09   #3
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Bonsoir bifur,

Comment ferais-tu ?

J'ai essayé avec un :
Mais il me provoque cette erreur :
Citation:
boot2.asm:7: error: invalid combination of opcode and operands
Mais je pense que le problème est causé par l'image de la disquette car le code utilisé a été testé par son auteur et fonctionne...

Il faudrait que je trouve une méthode alternative pour créer mon image de disquette avec mon secteur de boot...

Merci,
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 01h34   #4
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
faut faire ça:

Code :
1
2
3
4
5
6
7
8
9
 
format binary as 'img'
org 7c00h
push cs ;pour que ds pointe au meme endroit que cs
pop ds
;code de boot qui fait ce que tu veux
times 510-($-$$) db 90h ;nop
db 55h,0aah
times (80*18*2-1)*512 db 0
et là, l'image de disquette fera la bonne taille, et sera compilée en tant que .img, ou autre, si ça marche pas, après, ça veut surement dire que code n'est pas bon.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 08h39   #5
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Bonjour,

J'ai essayé, ça ne fonctionne toujours pas avec votre proposition de code.

Mon fichier fait bien 512 octets.

Je pense que le problème vient de l'image de la disquette et non du fichier boot2.bin.

Je suis à la recherche d'une solution alternative pour créer un fichier *.img qui est une image de disquette correcte.

Merci,
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 09h03   #6
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Bonjour,

Voici un code qui fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;-----------------------------------------------
; nasm bootsect.asm -f bin -o bootsect.img -l bootsect.lst
;-----------------------------------------------
 
        org 0h
; Initialisation des registres de segment
        mov ax, 0x07C0
        mov ds, ax
        mov es, ax
        mov ax, 0x8000
        mov ss, ax
        mov sp, 0xF000
 
; Afficher le message
        mov si, hellomessage
        call display_zstr
 
infini:
        jmp infini
 
;-----------------------------------------------
; Fonction d'affichage de chaine à zéro final
;-----------------------------------------------
display_zstr:
        push ax
        push bx
.beg:        
        lodsb
        cmp al, 0
        jz .end
        mov ah, 0x0E
        mov bx, 0x0007
        int 0x10
        jmp .beg
.end:
        pop bx
        pop ax
        ret
 
hellomessage:
        db "Tout petit petit système d'exploitation !", 13, 10, 0
 
times 510 - ($ - $$) db 0x90
dw 0xAA55
times (1 * 18 * 512) - 512 db 0
Par contre, à quoi sert cette ligne :
Citation:
times (1 * 18 * 512) - 512 db 0
Merci,
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 15h11   #7
bifur
Membre habitué
 
passe le balais et l'aspirateur
Inscription : mars 2008
Messages : 111
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : passe le balais et l'aspirateur

Informations forums :
Inscription : mars 2008
Messages : 111
Points : 126
Points : 126
mov ds,0 n'est pas une instruction valide car hélas on ne peut directement charger un sélecteur de segment par une constante il faut donc le faire en deux instruction

Code :
1
2
3
 
        mov ax, 0
        mov ds, ax
il faut que l'adresse ds:si pointe sur le bon endroit dans la ram, dans le premier exemple l'adresse aurait dû être 0000:7C00+msg

mais bon dans le dernier exemple la situation est corrgé
bifur est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/07/2011, 16h02   #8
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Merci pour ces explications !

Savez-vous m'expliquer cette ligne :
Code :
times (1 * 18 * 512) - 512 db 0
A quoi sert-elle ?

Merci,
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 13h44   #9
supersnail
Membre Expert
 
Avatar de supersnail
 
Homme
Inscription : novembre 2006
Messages : 1 414
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 1 414
Points : 1 895
Points : 1 895
Bonjour,

Cette ligne sert à remplir le fichier binaire de caractères nuls, pour que l'image disquette fasse effectivement 512 octets
__________________
Toute question technique envoyée en MP ira directement à la poubelle

Un code ne marchera jamais,il n'a jamais reçu la capacité de se déplacer.
Inutile donc de dire "ça marche pas", donnez plûtot des informations précises afin de mieux pouvoir vous aider.


Grand gourou de la -attitude - Sauvons Internet!
supersnail est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 18h46   #10
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Bonsoir supersnail,

Votre explication concerne la première ligne.

Je cherche à comprendre la seconde qui est :
Code :
times (1 * 18 * 512) - 512 db 0
Elle permet de générer un fichier d'extension .img de taille : 9216.

Merci,
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 23h08   #11
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Chercheur d'emploi
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
Citation:
Envoyé par [ZiP] Voir le message
Je cherche à comprendre la seconde qui est :
Code :
times (1 * 18 * 512) - 512 db 0
Apparement, il s'agit de faire un fichier qui remplisse de zéros la première piste d'une disquette 1,44Mo. 18 secteurs × 80 pistes × 2 faces × 512 octets par secteur ÷ 1024 = 1440 kilo-octets.

À cela, on enlève les 512 octets du premier secteur que l'on a défini au départ.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 23h27   #12
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Ha. Ok. Merci pour ces informations !
ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 01h26   #13
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
(80*18*2-1)*512 n'est pas égal à (1 * 18 * 512) - 512, mais alors là pas du tout, le raccourci, surement parti du bon sentiment de simplifier l'équation, est erroné.

je me demande où tu es allé chercher cette ligne de code times (1 * 18 * 512) - 512 db 0 l'opérateur * est prioritaire devant l'opérateur +, donc, il faut bien multiplier les 3 dimension CHS entre elles, et soustraire 1 pour le secteur occupé par le bootloader.

mais rien ne vaut l'expérimentation, faire des erreurs fait partie de l'apprentissage.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 08h12   #14
[ZiP]
Membre confirmé
 
Homme
Inscription : octobre 2006
Messages : 807
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2006
Messages : 807
Points : 248
Points : 248
Bonjour edfed,

Merci pour tes précisions !

C'est corrigé !

ZiP
[ZiP] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 04h57   #15
Pierre Maurette
Membre éclairé

 
Avatar de Pierre Maurette
 
Pierre Maurette
Inscription : juillet 2002
Messages : 266
Détails du profil
Informations personnelles :
Nom : Pierre Maurette
Âge : 57

Informations forums :
Inscription : juillet 2002
Messages : 266
Points : 319
Points : 319
Je crois que c'est moi qui avais posté quelque part le code qui fonctionne posté par [ZiP]. La cible était exclusivement une image de disquette .img pour Virtualbox. Au départ on a times (160 * 18 * 512) - 512 db 0 ou times (2 * 80 * 18 * 512) - 512 db 0 si on préfère caractériser les faces. L'image fait 1440ko. On constate ensuite qu'une seule piste suffira, donc times (1 * 18 * 512) - 512 db 0 ou times (1 * 1 * 18 * 512) - 512 db 0, et que l'image de 9ko fonctionne. Pourquoi me suis-arrêté en si bon chemin ? Mystère, toujours est-il que pour Virtualbox une image de 1 secteur fonctionne, donc times (1 * 1 * 512) - 512 db 0 ou times (1 * 1 * 1 * 512) - 512 db 0 ou tout simplement rien.

remarque: j'écris d'une façon qui me semble autodocumenter le code. C'est un choix personel, et j'aurais pu utiliser à nouveau ... - ($ - $$).

question: comment comme le fait edfed placer de la coloration syntaxique en ligne (span), sans encadrement ?
Pierre Maurette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 11h48   #16
Neitsa
Rédacteur
 
Avatar de Neitsa
 
Homme Sébastien
Chercheur sécurité informatique
Inscription : octobre 2003
Messages : 1 041
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Chercheur sécurité informatique

Informations forums :
Inscription : octobre 2003
Messages : 1 041
Points : 1 949
Points : 1 949
Bonjour,

Citation:
Envoyé par Pierre Maurette Voir le message
question: comment comme le fait edfed placer de la coloration syntaxique en ligne (span), sans encadrement ?
Balise CODEINLINE => foobarbaz = foobar + baz
Code :
[codeinline ] foobarbaz = foobar + baz [ /codeinline]
(enlevez les espaces dans les balises)

c.f. http://www.developpez.net/forums/d10...e/#post5888074
Neitsa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 13h51   #17
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
Citation:
Envoyé par Pierre Maurette Voir le message
toujours est-il que pour Virtualbox une image de 1 secteur fonctionne, donc times (1 * 1 * 512) - 512 db 0 ou times (1 * 1 * 1 * 512) - 512 db 0 ou tout simplement rien.

remarque: j'écris d'une façon qui me semble autodocumenter le code. C'est un choix personel, et j'aurais pu utiliser à nouveau ... - ($ - $$).
autant pour moi alors.
si ça marche c'est tout ce qu'il faut.

sous bochs par contre, je crois qu'il faut impérativement une image de disquette de taille valide, sinon, il répond avec un message d'erreur.

Une image de disquette, c'est du standard, tout les emulateurs que j'ai essayé utilisent le même type d'image, mais seulement pour les disquettes.
Pour les disques durs par contre, c'est différent, certains emulateurs nécessitent un fichier disque dur virtuel qui n'a rien à voir avec une image disque.

L'autodocumentation de code suppose que le lecteur sache déjà ce que fait le code.

Ce que je trouve pas mal, c'est les commentaires très courts en anglais. l'anglais permet des explications techniques vraiment concises, ce qui n'est pas le cas du français.

par exemple:
Code :
1
2
3
 
mov eax,320 ;largeur de l'ecran
mov eax,320 ;screen width
on gagne quelques caractères, ce qui accélère la lecture.

pour la balise de codeinline, le bug de non retour à la ligne est voulu, ne vous inquietez pas. pour y palier, il y a un moyen.car sinon, le texte suivant est collé à la suite et un eventuel retour chariot est ignoré.

il faut toujours composer une ligne de codeinline encadrée par du texte, ou terminé par une ponctuation.
comme la ligne que vous venez de lire.

et en plus, anomaly à ajouté la coloration syntaxique asm dans le chat et le forum.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h16.


 
 
 
 
Partenaires

Hébergement Web