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

x86 32-bits / 64-bits Assembleur Discussion :

[Linux] Mode graphique et interruption BIOS


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 288
    Points
    7 288
    Par défaut [Linux] Mode graphique et interruption BIOS
    Bonjour, je suis débutant en assembler x86 (j'ai programmé en assembler 8051 mais c'étais il y a quelques années), et je voudrais créer une fonction en assembler appellable dans un fichier .c, et faisant appel à l'interruption 10h du BIOS; je travaille avec nasm et gcc, sur un pentium MMX et une mandrake 9.2.

    Mon problème est le suivant: je crée ces deux fichiers:
    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
     
               ;mode_video.asm
     
                GLOBAL modevid
     
                modevid:
                        PUSH EAX
                        PUSH EBX
                        PUSH EBP
     
                        MOV EBP, ESP
                        MOV EBX, [EBP+8]
     
                        XOR AH,AH
                        MOV AL,BL
                        INT 10h
     
                        MOV ESP,EBP
                        POP EBP
                        POP EBX
                        POP EAX
     
                        RET
    et pour le fichier .c:
    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
     
    /*
     * graph.c
     */
     
    #include<stdio.h>
     
    extern void modevid(int *);
     
    int main()
    {
    int valeur= 0x13;
     
    modevid(&valeur);
     
    return 0;
    ]
    je compile ensuite le .asm avec:
    nasm -f elf mode_video.asm -o mode_video.o

    puis le fichier .c avec le .o précédant:
    gcc graph.c mode_video.o

    puis je lance l'éxécutable et j'obtiens une segmentation fault.
    Que faire?

    Merci pour votre aide!
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Le problème doit venir de l'instruction
    En effet, lors de l'appel de la fonction externe, le programme appelant empile l'adresse du paramètre puis au minimum EIP; ensuite, la fonction elle-même empile EAX, EBX puis EBP. Ce qui fait que le paramètre de la fonction doit se trouver sur la pile à minimum [EBP+16].
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 288
    Points
    7 288
    Par défaut
    visiblement, j'ai toujours la segmentation fault...
    J'ai essayé en ne sauvegardant rien et en passant directement le paramètre 13h dans AL mais toujours pareil...
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Je crois que tu ne peux pas appeler les int de cette facon sous linux en passant par gcc. Soit tu fais un apel systeme ou alors tu passe par une librairie en c prévu a cet effet.

    Je te rassure ca ne marche pas plus sous windows.Je crois que ss windows il faut utiliser int86(...) (a verifier)

  5. #5
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Heu, j'ai un dfoute, mais il me semble que des que l'on rentre en pmode, on n'a plus acces aux int BIOS.... Donc sous Linux, il faut imperativement passer par l'int 80 qui est a Linux ce qu'est l'int 21 a DOS....

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    DOS s'est pas arrêté à l'int 21, z'étaient déjà gourmand à l'époque. ^^ En effet, je doute que Linux recrée l'IDT avec les int bios.

  7. #7
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    En fait, j'ai purement un problème Linux :
    avec comme compilateur turbocpp ce code marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        asm{
          mov ax,$0x13
          int 10h
       }
    }
    Sous Linux code équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
        asm("mov $0x13,%ax");
        asm("int $0x10");
    }
    donne erreur de segmentation.
    effectivement en commentant la ligne int $0x10 l'erreur n'apparait plus. donc c'est sur que la faut est l'appel de int.

    Si quelqu'un a une idée de comment résoudre ce problème ...
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  8. #8
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Il faut utiliser un émulateur comme DosBox ou utiliser une API moderne. Sous Windows. Sous Windows tes programmes DOS marchent grâce à NTVDM.
    :wq

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/09/2009, 17h27
  2. Interruptions BIOS sous LINUX ?
    Par dermouche2002 dans le forum Linux
    Réponses: 1
    Dernier message: 07/01/2008, 14h45
  3. [FreePascal] Linux et le mode graphique
    Par ILIAS Raphaël dans le forum Free Pascal
    Réponses: 3
    Dernier message: 03/07/2005, 17h27
  4. [FreePascal] Mode graphique sous Linux
    Par boullery dans le forum Free Pascal
    Réponses: 2
    Dernier message: 16/03/2005, 14h20
  5. Contrôler linux depuis XP (mode graphique)
    Par Bweb dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 27/02/2005, 10h52

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