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 :

[GAS] Int 0x80 sous Linux


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 74
    Points : 53
    Points
    53
    Par défaut [GAS] Int 0x80 sous Linux
    Bonjour tout le monde
    Je suis un nouveau en assembleur , et je travaille sur l'OS Linux, hier, j'ai tourné mon premier programme "hello world", et voici la partie du code qui m’intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    movl $4, %eax
    movl $1, %ebx
    movl $message, %ecx
    movl $11; %edx
    int $0x80
    On dit que l'instruction $0x80 est un appel au système, mais je n'ai pas bien saisi comment cette instruction fonctionne, est ce que c'est elle qui est le responsable de l'affichage de mon message : "hello world" sur l'écran ? Si oui, comment peut-elle le faire ?
    le message contient 11 caractères, est ce que cette instruction ( je parle toujours de $0x80) marche comme une boucle pour lire le message caractère par caractère ?
    cette question vient du remarque que je fais à propos des quatre lignes précédentes, j'explique :
    l'instruction qui nous permet de lire une donnée s'est fixé par les deux registres "eax" et "ebx", mais celle-ci s'est fixé une fois pour toute, même si l'instruction de la ligne 4 place juste le premier octet du message "hello world" dans le registre "ecx", je pense que nous avons besoin de faire une boucle pour lire tout le contenu du message "hello world", j'espère que mon problème est bien claire pour tout le monde.
    une aide s'il vous plaît
    merci d'avance.

  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 : 39

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    int 80 est une interruption, c'est une sorte d'appel de sous programme (comme l'instruction call) chaque numéros d'interruption correspond a un sous programme (256 maximum)

    l'interruption 80 regroupe plusieurs fonctions, on choisie la fonction avec le registre eax, l'usage des autres registres varient suivant la fonction choisie (des détails ici: http://www.lxhp.in-berlin.de/lhpsysc0.html)

    ici la fonction utilisé est la fonction d'écriture, linux considère l'écran comme un fichier (comme beaucoup d'autres chose) et le numéros du ficher correspondant a l'écran est le 1

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 74
    Points : 53
    Points
    53
    Par défaut
    alors comment peut on afficher un message sur l'écran sous linux ?

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

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    je ne comrend pas le sens de votre question, souhaitez vous comprendre comment appeler correctement la fonction ou comment elle fonctionne?

    si c'est le fonctionnement interne de la fonction, je ne saurait répondre correctement, je dirait que ça depend beaucoup de la façon dont est organisé le système, et cela varie d'une distribution a une autre

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par jamalkamal Voir le message
    On dit que l'instruction $0x80 est un appel au système
    non. int est une instruction assembleur qui déclenche une interruption, et sous Linux l'interruption 0x80 (128 en décimal) est ce qu'on appelle la syscall gate (en français le portail à appel système)

    je n'ai pas bien saisi comment cette instruction fonctionne, est ce que c'est elle qui est le responsable de l'affichage de mon message : "hello world" sur l'écran ? Si oui, comment peut-elle le faire ?
    un appel système (syscall) est une fonction dans l'espace noyau (kernel-land), par exemple la fonction write() est disponible dans l'espace utilisateur (userland)
    typiquement, en langage C on peut écrire un programme avec une ligne write(0, "hello world", 11) et - en gros, très schématique et pour simplifier - une fois le programme compilé on se retrouvera avec du code machine du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mov eax, syscall_write
    mov ebx, 0
    mov ecx, "hello world"
    mov edx, 11
    int 0x80
    (note: c'est du pseudo-code, toujours pour simplifier la compréhension)

    l'instruction int 0x80 va donc quand elle est exécutée récupérer les différentes valeurs dans les registres eax, ebx, ecx, edx etc. et effectuer le branchement adéquat dans le noyau, et au cas où ça ne serait toujours pas clair : l'interruption 0x80, ce petit bout de code qui effectue le bon branchement, est lui aussi dans le noyau, impossible de s'en passer, on est obligé de transiter par cette syscall gate pour absolument tout

    le message contient 11 caractères, est ce que cette instruction ( je parle toujours de $0x80) marche comme une boucle pour lire le message caractère par caractère ?
    (...)
    l'instruction de la ligne 4 place juste le premier octet du message "hello world" dans le registre "ecx", je pense que nous avons besoin de faire une boucle pour lire tout le contenu du message "hello world"
    non ! on ne met pas le premier octet de la chaine hello world dans ecx, on met l'adresse du premier octet de la chaine, ce qu'on appelle un pointeur en langage C
    à partir de là on connait l'adresse du 1er octet, on connait le nombre d'octets à écrire, "y'a plus qu'à"

    y'a plus qu'à... il faut comprendre que le code du noyau est lui aussi écrit en langage C, et en plus il est disponible sur le net, on peut donc aller voir comment est foutue la fonction sys_write(), à nos risques et périls (c'est du code noyau, ça pique forcément un peu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    607                 ret = vfs_write(f.file, buf, count, &pos);
    on est alors renvoyé successivement vers vfs_write(), puis __vfs_write(), puis un pointeur de fonction un peu obscur file->f_op->write pour finalement atterrir (non sans une certaine dose de magie) du coté de pty_write(), tty_insert_flip_string(), tty_insert_flip_string_fixed_flag() et finalement memcpy() qu'il convient de ne pas confondre avec son homologue en espace utilisateur mais dont le nom est suffisamment évocateur, et qui renvoie en gros sur __builtin_memcpy()

    ...reprend sa respiration...

    cette dernière est une fonction optimisée pour le processeur et déléguée au compilateur, en gros "vas-y compilateur, donne moi la meilleure fonction memcpy() possible pour du x86", et le compilateur de générer un binaire (donc ici un noyau) avec une fonction pour copier de la mémoire en assembleur, en copiant (très probablement) la chaine non pas octet par octet (8bits) mais par coups de 4 octets (32 bits, x86 )

    donc pour répondre à ta question initiale : non, la chaine n'est pas écrite "octet par octet" techniquement, elle est copiée d'un seul coup dans un buffer pour affichage

    tout ça peut évidemment paraitre compliqué, mais ça l'est
    savoir programmer en langage C aide beaucoup pour appréhender l'assembleur sous Linux, étant donné que les appels systèmes sont très largement documentés avec leurs prototypes et des exemples dans ce langage

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 74
    Points : 53
    Points
    53
    Par défaut
    Merci infiniment mon ami BufferBob
    Je vais essayer de comprendre ce que tu m'a dis

Discussions similaires

  1. Réponses: 10
    Dernier message: 26/04/2009, 22h28
  2. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  3. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 10h46
  4. Réponses: 2
    Dernier message: 24/03/2006, 10h46
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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