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 :

Problème d'écriture dans la mémoire vidéo en C


Sujet :

Programmation d'OS Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2019
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Problème d'écriture dans la mémoire vidéo en C
    Bonjour,

    Voila ça fait quelque temps que j'essaye de crée un OS pour le "fun" on va dire ... Cependant ca fait plus d'une semaine que je suis bloqué sur la ligne de départ car je n'arrive pas à créer une fonction qui écrit dans la mémoire video.

    Le C étant mon langage de prédilection je pensais le maitriser ... visiblement c'est pas du tout le cas mdrrr.

    Je suis 2 tutos pour la création de l'os : https://michelizza.developpez.com/re...ropre-systeme/ et https://systeme.developpez.com/tutor...eloppement-OS/

    Pour en revenir au sujet si je fais en asm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov byte [0xB8000], 'H'
    mov byte [0xB8000], 0x57
    pas de soucie, tout ce passe pour le mieux.
    Mes problèmes commencent quand je passe au C.

    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *tt = (char *)0xB8000;
    tt[0] = 'H'
    tt[1] = 0x57
    BOOOM ca fonctionne plus, il m'affiche W (code hexa en ascii : 0x57) et pas H (si j'inverse il m'affiche H mais pas le bon background). Mais si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *tt = (char *)0xB8000;
    tt[1] = 'H'
    tt[2] = 0x57
    et bien ça fonctionne, donc je me suis dit que peut etre qu'il fallait ajouté 1 a l'adresse 0xB8000 (soit 0xB8001)
    Mais plus si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *tt = (char *)0xB8001;
    tt[0] = 'H'
    tt[1] = 0x57
    ben ca marche pas.

    Du coup j'ai testé d'autres choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *tt = (char *)0xB8000;
    *tt = 'H';
    *(tt + 1) = 0x57;
    ça ne fonctionne pas, mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *tt = (char *)0xB8000;
    *tt = 'H'
    ++tt;
    *tt = 0x57;
    ben ça fonctionne ... mais si je fais une boucle dans ma fonction putcar pour faire le fameux ++tt, ca fonctionne plus non plus.

    Du coup j'avoue ne pas tout saisir mais je ne me suis pas découragé et j'ai trouvé une autre méthode avec des short à la place des char ... or les memes problemes apparaissent a peut pres.

    Bref du coup ca me décourage car j'ai deja passé des dizaines d'heures et j'ai jamais reussi à passer la ligne de départ ...

    Pour le moment ma fonction putcar ressemble à ça (elle ne marche pas et a été modifié au moins 150000000000fois mdrr)

    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
     
    void putcar(char letter, char style, short *X, short *Y) {
        short *video = (short *)0x0B8000;
        short index, i, x , y, value;
        x = *X, y = *Y;
        if (letter == 10)                //Retour à la ligne
            x = 0, ++y;
        else if (letter == 13)           //Retour au début de la ligne
             x = 0;
        else if (letter == 9)            //TAB
            x = x + 8 - (x % 8);
        else {                           //AUTRE CHAR
            index = 80 * y + x;
            value = style;              //Tout les tutos mettent la lettre ici mais ca n'a jamais fonctionné pour ma par, or mettre le style à ça place a fonctionné une fois ...
            value = value << 8;
            value |= letter;
            for (i = 0; i < index; ++i)
                ++video;
            *(video) = value;
            ++x;
        }
     
        if (x > 79) 
            x = 0, ++y;
        if (y > 24) {
            for(index = 0; index < (y - 24); ++index)    //C'est pas opti mais j'changerai ca plus tard et de toute facon je ne l'ai pas encore testé
                scrollup();//scrollup(Y - 24);
        }
        *X = x, *Y = y;
    }
    cette fonction affiche (a priori) le bon background, au bon endroit mais met toujours le char '?' à la place de la lettre demandé.
    (j'aime pas trop les variables globales et meme, avec ou sans variables globales ca n'a rien changé à ce niveau la....)

    En terme de Hardware je suis sur une VM kali (avec virtualbox), mon proc est un AMD A9 7th gen, et j'ai 4G de RAM (d'ailleurs je vais passé a 16Giga ... ça aura une influence sur l'os ?). Ah et je suis en mode protégé.

    j'ai aussi entendu parlé de char far* sauf que ça pour le coup j'en ai jamais utilisé et il me semble qu'il necessite un include (on peut inclure des librairie pour la création d'un OS ?)

    Quelqu'un pourrai-t-il m'aider ou m'expliquer ou bien meme me trouver un cours/tuto/faq/forum qui reponde a cette question s'il vous plait ... parce que je ne sais meme plus quoi tester la ...

    PS : Mon but est de crée un OS 64 bit et pas 32, si qq un ce sent de m'expliquer les différences que cela va impliquer il est le bienvenue ... mais bon j'en suis pas encore la.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par lcardao Voir le message
    En terme de Hardware je suis sur une VM kali (avec virtualbox), mon proc est un AMD A9 7th gen, et j'ai 4G de RAM (d'ailleurs je vais passé a 16Giga ... ça aura une influence sur l'os ?). Ah et je suis en mode protégé.

    j'ai aussi entendu parlé de char far* sauf que ça pour le coup j'en ai jamais utilisé et il me semble qu'il necessite un include (on peut inclure des librairie pour la création d'un OS ?)

    PS : Mon but est de crée un OS 64 bit et pas 32, si qq un ce sent de m'expliquer les différences que cela va impliquer il est le bienvenue ... mais bon j'en suis pas encore la.
    1)Oui fait gaffe si tu met 16 GO tu dois recoder tout de zero !
    bref non pourquoi veut tu que ça a une influence ?

    2)Non impossible de mettre un include , sinon le hardware plante !
    ben un include , c'est juste comme le dit son nom , inclure un fichier d'ailleursune fois compilé , il y'a aucune trace d'include ou non...
    Pareil pour une lib , si cette lib est par contre assez indépendante (donc peu de dépendance) , si tu veux utiliser une lib qui utilise API Windows , soit tu recode Windows soit tu t'en passe

    3)Si tu fait pas la différence entre du 64 et 32 bits , je doute que tu as les compétences pour faire un OS.
    Techniquement on est passé au 64 bits seulement pour pouvoir adressé plus de RAM.
    Pour le x86 le 32 bits et le 64 bits sont différent sur certain point , notamment le x64 qui a plus de registre et il a les registres sont généraux.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2019
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    1)Oui fait gaffe si tu met 16 GO tu dois recoder tout de zero !
    bref non pourquoi veut tu que ça a une influence ?

    2)Non impossible de mettre un include , sinon le hardware plante !
    ben un include , c'est juste comme le dit son nom , inclure un fichier d'ailleursune fois compilé , il y'a aucune trace d'include ou non...
    Pareil pour une lib , si cette lib est par contre assez indépendante (donc peu de dépendance) , si tu veux utiliser une lib qui utilise API Windows , soit tu recode Windows soit tu t'en passe

    3)Si tu fait pas la différence entre du 64 et 32 bits , je doute que tu as les compétences pour faire un OS.
    Techniquement on est passé au 64 bits seulement pour pouvoir adressé plus de RAM.
    Pour le x86 le 32 bits et le 64 bits sont différent sur certain point , notamment le x64 qui a plus de registre et il a les registres sont généraux.

    Bon comme je l’ai dit ... je n’ai toujours pas dépasser la ligne de depart pour la création d’un os donc non en effet je n’ai pas les compétences pour crée un OS vue que l’objectif est de les acquérir ...

    Sinon merci pour tes infos mais tu n’as pas répondu a la question principale ... Sais tu pourquoi mes testes donnent des résultats bizarre ?

    Je te remercie quand même pour ton aide... même si j’avoue, j’aurai préféré être moins pris pour un idiot ... mais si c’est le prix pour apprendre pas de soucie

    pour l’include question idiote réponse idiote, totalement normal mdrr

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Pour ton soucis , c'est du mal a le comprendre , dans la version assembleur tu écris dans 0x8B000 , qui est la RAM.
    La version C me semble plus correct vu qu'elle écrit dans 0xB8000 donc la VRAM.

    Il faudrait nous dire dans quel mode tu es ?
    Il est possible qu'il y'est un alignement pour les caractères et donc d'écrire par bloc de 2 octets.

  5. #5
    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
    bon je connais bien la mémoire vidéo en mode texte mais hélas pas du tout le C (y a des étoiles partout dans ton code et je comprend pas a quoi ça sert)
    la structure de la mémoire en mode texte (le mode de démarrage des pc) est assez simple: 2 octet par caractère, le premier octet contient le code ascii étendu et le second octet contient la couleur du caractère (bit 0-3 couleur du caractère, bit4-6 couleur du fond et bit 7 clignotement du caractère)
    la mémoire vidéo est a l'adresse B800 et les caractères sont enregistré dans la mémoire de gauche a droite et de haut en bas il y as 80 caractère par ligne et 25 lignes
    bon je fait un rappel mais tu semble déjà le savoir

    pour écrire un truc sur l'écran il suffit de faire peut de chose, pour écrire chaque caractère suivant ses coordonnées X et Y il faut écrire le code ascii a l'adresse "2(X+80Y)" et l'octet des couleur a l'adresse "1+2(X+80Y)" (pour l'octet des couleur tu peut commencer par choisir la valeur 7 ça correspond a un caractère gris sur fond noir) sans bien sur dépasser les valeur X et Y maximum correspondant a la taille de ton écran

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2019
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Pour ton soucis , c'est du mal a le comprendre , dans la version assembleur tu écris dans 0x8B000 , qui est la RAM.
    La version C me semble plus correct vu qu'elle écrit dans 0xB8000 donc la VRAM.

    Il faudrait nous dire dans quel mode tu es ?
    Il est possible qu'il y'est un alignement pour les caractères et donc d'écrire par bloc de 2 octets.
    Je suis en mode protégé, et je me suis juste tromper en recopiant le code assembleur c'est bien quand j'écris dans 0xB8000 que le code fonctionne.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2019
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par bifur Voir le message
    bon je connais bien la mémoire vidéo en mode texte mais hélas pas du tout le C (y a des étoiles partout dans ton code et je comprend pas a quoi ça sert)
    la structure de la mémoire en mode texte (le mode de démarrage des pc) est assez simple: 2 octet par caractère, le premier octet contient le code ascii étendu et le second octet contient la couleur du caractère (bit 0-3 couleur du caractère, bit4-6 couleur du fond et bit 7 clignotement du caractère)
    la mémoire vidéo est a l'adresse B800 et les caractères sont enregistré dans la mémoire de gauche a droite et de haut en bas il y as 80 caractère par ligne et 25 lignes
    bon je fait un rappel mais tu semble déjà le savoir

    pour écrire un truc sur l'écran il suffit de faire peut de chose, pour écrire chaque caractère suivant ses coordonnées X et Y il faut écrire le code ascii a l'adresse "2(X+80Y)" et l'octet des couleur a l'adresse "1+2(X+80Y)" (pour l'octet des couleur tu peut commencer par choisir la valeur 7 ça correspond a un caractère gris sur fond noir) sans bien sur dépasser les valeur X et Y maximum correspondant a la taille de ton écran
    Alors pour information quand on ecrit en C

    Cela signifie que je manipule une adresse mémoire qui contient (ou va contenir) des char.
    J'ai essayé la méthode que tu me proposes mais elle ne me donne pas le résultat souhaité et c'est tout le probleme

  8. #8
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    ça veut dire que ça ne marche pas ?
    tu as utiliser un short du coup ?

    Sinon les étoiles sont des pointeurs , je rajouterai que normalement quand on écrit sur du hardware on doit utiliser le mot clé "volatile" , le compilateur peut faire certaine optimisation et donc laisser certaine valeur en registre.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2019
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    ça veut dire que ça ne marche pas ?
    tu as utiliser un short du coup ?

    Sinon les étoiles sont des pointeurs , je rajouterai que normalement quand on écrit sur du hardware on doit utiliser le mot clé "volatile" , le compilateur peut faire certaine optimisation et donc laisser certaine valeur en registre.
    Non en effet ça ne marche pas et oui j'ai utilisé un short .... qui ne marche pas mieux.

Discussions similaires

  1. Problème d'écriture dans un xml depuis Delphi
    Par MABB dans le forum Delphi .NET
    Réponses: 3
    Dernier message: 26/07/2006, 15h53
  2. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  3. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  4. Problème d'écriture dans un tableau
    Par Hokagge dans le forum MFC
    Réponses: 46
    Dernier message: 08/07/2005, 16h47
  5. problème d'écriture dans la BD
    Par billy_ze_kid dans le forum ASP
    Réponses: 6
    Dernier message: 12/06/2005, 20h30

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