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 :

[NASM/Linux 32b] Interruption BIOS sous linux.


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut [NASM/Linux 32b] Interruption BIOS sous linux.
    Bonjour à tous,

    J'aimerai savoir s'il est possible d'utiliser les interruptions BIOS sous linux, en effet à chaque tentative j'ai droit à un segfault.

    Exemple de code qui ne fonctionne pas :

    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
     
    %include "asm_io.inc"
    segment .data
    ;les données initialisées sont placées dans ce segment de données.
     
    segment .bss
    ;les données non initialisées sont placées dans le segment de données bss.
     
    segment .text
        global main
      main:
        enter 0,0
        pusha
     
    ;le code est placé ici
        xor EAX,EAX
        xor EBX,EBX
        xor ECX,ECX
        xor EDX,EDX
     
        mov AH,0x2
        int 0x1a
     
        call dump_regs 0
        popa
        mov EAX,0
        leave
        ret
    Selon cette page : http://www.gladir.com/LEXIQUE/INTR/int1af02.htm , certains registres devraient être modifié afin de contenir les données relative à l'heure RTC CMOS.
    Je sais bien qu'il existe des appels systèmes qui font ca mais j'aimerai savoir si on peu "taper plus bas".

    Merci d'avance.

    Bonne journée.

  2. #2
    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
    linux est en mode protégé, aucune interruption BIOS ne peut être appelée depuis le mode protégé, impossible, ce sont deux mode bien differents, et incompatibles.

    en plus de ça, il ne permet presque rien en assembleur.
    les manoeuvres sous linux sont super fatigantes lorsqu'il s'agit de coder en assembleur.

    je te conseille de passer aux compatibles DOS, eux permettent bien plus de choses, dont l'emulation du mode reel (mode du bios).

    linux, c mal.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Forcément ca explique tout.

    Merci beaucoup !

    Bonne soirée.

    Edit :

    J'ai une seconde question, comment obtenir à partir d'une source en assembleur le code ASM correspondant "pure et dur" sans en tête etc, j'aimerai en faite créer un tout petit quelque chose m'affichant par exemple un texte que je placerai sur le secteur d'amorce d'une clef usb, ainsi lorsque je demanderai au pc de booter sur la clef le programme se lancera et affichera un hello world par exemple.

    Auriez vous une piste de recherche ?

    Edit2 :

    J'ai trouvé ce message : http://www.developpez.net/forums/d38...r-boot-loader/ , ca correspond à ce que je cherche cependant certaine partie du code me sont incompréhensible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    jmp $
    times 510-($-$$) db 0
    Que signifie cette portion de code ?

    Merci encore.

  4. #4
    Membre averti

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    signifie qu'on saute à cette instruction. C'est une boucle infinie qui ne fait rien. Autre façon d'écrire la chose :
    signifie qu'on va écrire (510 - (adresse courante - adresse de début) octets à la valeur 0. Adresse courante - adresse de début, c'est la taille de ton programme jusqu'ici. Ce code complète les 510 premiers octets de ton programme avec des zéros.
    J'ai ça pour les secteurs d'amorçage :
    http://esauvage.developpez.com/tutor...e=page_6#LVI.3

    Bonne journée.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Merci beaucoup, cependant j'ai pas saisie à quoi sert cette boucle infini ; et si boucle infini il y a alors comment se fait il que la ligne commençant par "times" soit exécuté ?

  6. #6
    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
    l'opérateur times permet de reiterer % fois une directive.

    par exemple:

    times 432 dd % ;définir 432 dwords qui ont pour valeur 1,2,3,...431,432
    ce n'est pas executé, c'est compilé.

    l'effet est de reserver des données.

    pour l'instruction jmp $, elle est là pour signifier la fin.

    sur les OS, cette instruction devient un système de gestion d'alimentation (mis een veille, shutdown, etc...) mais pouir faire simple, on fait une simple boucle infinie. de toute façon, ce qui importe dans le cas de ce programm, c'est de verifier le bon chargement du secteur de boot, pour passer à la suite.

  7. #7
    Membre averti

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Points : 341
    Points
    341
    Par défaut
    Le processeur passe seul à l'instruction suivante. Il passe toujours à l'instruction suivante, tant qu'il est sous tension. Donc une fois le programme exécuté, il continue, et comme on n'a plus rien d'écrit, il exécute ce qu'il trouve en mémoire, ce qui peut être à peu près n'importe quoi. Il va considérer nos 0 comme des instructions, puis le nombre magique itou. Un jmp sur lui-même fera toujours exécuter la même instruction au processeur : ça fait peut-être rien, mais ça évite de faire n'importe quoi. Il me semble que GRUB utilise ceci pour terminer le traitement de ses erreurs bloquantes.

    Un secteur d'amorçage doit faire 512 octets, ni plus, ni moins. C'est le "stage1" de GRUB, par exemple. Les 2 derniers octets doivent être 0x55AA, c'est obligatoire. Compilé, on doit arriver à un fichier binaire de 512 octets. C'est dur, à viser juste. En conséquence, on triche un peu : on complète l'espace qui manque entre la dernière instruction et le nombre magique par n'importe quoi (ici 0). Donc tout à fait, ce n'est pas exécuté, et d'ailleurs, il n'y a rien à exécuter.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Merci beaucoup je comprends mieux, c'est ni plus ni moins pour empêcher d'aller plus loin en mémoire, et le times c'est pour compléter par 0 la place restante et ensuite de placer le magic number.

    Merci beaucoup encore une fois.

    Bonne journée.

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

Discussions similaires

  1. Interruptions BIOS sous LINUX ?
    Par dermouche2002 dans le forum Linux
    Réponses: 1
    Dernier message: 07/01/2008, 14h45
  2. [Installation] Serveur SVN sous linux, stockage du dépôt sous Windows
    Par gk14fire dans le forum Subversion
    Réponses: 1
    Dernier message: 20/12/2006, 07h26
  3. C/C++ : Interruption réentrante sous Linux
    Par lambdacrash dans le forum Administration système
    Réponses: 1
    Dernier message: 18/11/2006, 17h09
  4. Pourquoi surfer sous linux est plus lent sous suse
    Par spiwis dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 12/12/2005, 12h21

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