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] Appels systèmes et libc - Hello world


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 17
    Points
    17
    Par défaut [NASM] Appels systèmes et libc - Hello world
    bonjour,

    je me base sur 2 façons d'afficher hello world
    1) en utilisant la fonction systeme n°4: write, j'ai le main suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    _start:
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, txt
    	mov edx, len
    	int 0x80
     
    	mov eax, 1
    	mov ebx, 0
    	int 0x80


    2) en utilisant la fonction C printf, j'ai le main suivant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    _start:
    	PUSH dword car		; printf prend un pointeur
    	CALL printf
    	ADD ESP, len
     
    	;; exit
    	MOV EAX, 1
    	MOV EBX, 0
    	INT 0x80

    Ce qui m'a étonné est que dans un cas on utilise les registres et dans l'autre la pile.
    J'ai donc cherché sur le net et ai trouvé que ça revenait au même
    L'intérêt de la pile étant qu'elle ne limite pas le nombre d'arguments.

    J'ai donc voulu vérifier ça et faire la version 1 (write) en utilisant la pile
    en faisant du genre: (ordre inversé pour la pile)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    _start: 
    	push len
    	push txt
    	push 1
    	push 4
            int 0x80
     
    	mov eax, 1
    	mox ebx, 0
    	int 0x80
    Qui ne m'affiche rien (ni au shell ni sous le debugger ald), pourriez vous m'expliquer plz?

    Merci!

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    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 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Attention, il n'y a pas d'équivalence entre les deux méthodes, il s'agit de deux choses totalement différentes :

    - Dans la première, il s'agit d'un appel système direct (la routine sys_write), qui nécessite que certains registres soient initialisés;

    - Dans la seconde, il s'agit de l'appel à la fonction printf qui, elle, nécessite que l'adresse de la chaîne à afficher soit préalablement déposée sur la pile.
    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
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    héhé, c'est bien le doute que j'avais en fait!

    Pour résumer (et vérifier mes infos ):

    Un appel système se fait en initialisant des registres uniquement, de la façon suivante:

    eax = n° fonction
    ebx, ecx, edx, edi, esi = paramètres de la fonction

    Tandis qu'un appel de fonction externe (librairie quelconque) ne marche qu'en utilisant la pile.

    c'est juste?


    Merci!

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    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 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    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]

  5. #5
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Salut,

    ebx, ecx, edx, esi, edi, et ebp.

    ebp est apparu avec le noyau 2.4. Noyau actuel: 2.6.19.

    Le contenu d' eax est toujours détruit, et contient la valeur de retour. Les 6 autres registres restent inchangés.

    Voir section 5.1.3
    http://www.faqs.org/docs/Linux-HOWTO...bly-HOWTO.html

    Il y a quand même une petite exeption sur l' appel 102, qui prend ebx comme type d' appel à exécuter.

    Et bonne année

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

Discussions similaires

  1. [LV2009] Appel fonction C/C++ pour un Hello World
    Par Super2006 dans le forum LabVIEW
    Réponses: 0
    Dernier message: 24/05/2010, 12h57
  2. hello world
    Par floorfille dans le forum CORBA
    Réponses: 3
    Dernier message: 26/07/2007, 14h34
  3. [Débutant] hello world jsp tomcat
    Par RENAULT dans le forum Tomcat et TomEE
    Réponses: 24
    Dernier message: 13/05/2004, 16h29
  4. [STRUTS] hello world, bonjour le monde
    Par Celina dans le forum Struts 1
    Réponses: 3
    Dernier message: 19/04/2004, 15h41

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