IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation d'OS Assembleur Discussion :

Création d'une image de disquette pour utiliser avec VirtualBox (Windows) ?


Sujet :

Programmation d'OS Assembleur

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Création d'une image de disquette pour utiliser avec VirtualBox (Windows) ?
    Bonjour,

    Voici le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    nasm boot2.asm -f bin -o boot2.bin
    Puis je créé une image de disquette avec :
    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

  2. #2
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    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)

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonsoir bifur,

    Comment ferais-tu ?

    J'ai essayé avec un :
    Mais il me provoque cette erreur :
    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

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    faut faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    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

  6. #6
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Voici un code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    times (1 * 18 * 512) - 512 db 0
    Merci,
    ZiP

  7. #7
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

  8. #8
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Merci pour ces explications !

    Savez-vous m'expliquer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    times (1 * 18 * 512) - 512 db 0
    A quoi sert-elle ?

    Merci,
    ZiP

  9. #9
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    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 plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  10. #10
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonsoir supersnail,

    Votre explication concerne la première ligne.

    Je cherche à comprendre la seconde qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    times (1 * 18 * 512) - 512 db 0
    Elle permet de générer un fichier d'extension .img de taille : 9216.

    Merci,
    ZiP

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par [ZiP] Voir le message
    Je cherche à comprendre la seconde qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Ha. Ok. Merci pour ces informations !
    ZiP

  13. #13
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    (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.

  14. #14
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour edfed,

    Merci pour tes précisions !

    C'est corrigé !

    ZiP

  15. #15
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    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 ?

  16. #16
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    [codeinline ] foobarbaz = foobar + baz [ /codeinline]
    (enlevez les espaces dans les balises)

    c.f. http://www.developpez.net/forums/d10...e/#post5888074

  17. #17
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer une image depuis canvas pour email avec outlook
    Par Tankian dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/12/2014, 21h13
  2. Réponses: 6
    Dernier message: 02/02/2011, 10h13
  3. utiliser une image de fond pour une application
    Par AM1NE dans le forum Débuter
    Réponses: 4
    Dernier message: 03/07/2009, 12h18
  4. Lien pour TELECHARGER une image plutôt que pour l'ouvrir
    Par nabab dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/01/2005, 18h07
  5. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo