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 :

Générer une instruction inexistante en assembleur


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Points : 36
    Points
    36
    Par défaut Générer une instruction inexistante en assembleur
    BONJOUR 0 TOUS

    voila pour une raison ou pour une autre je voudrais inclure du code assembleur dans du code C, Je n'ais pas la plus petite idée de comment l'on peut faire cela ???

    RQ
    JE TRAVAILLE SOUS WINDOWS C'est très importante

    Ndm : Discussion déplacée depuis le forum C

  2. #2
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Je crois que tu trouveras de quoi faire ici : http://beuss.developpez.com/tutoriels/pcasm/

    Cdt
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Salut,

    Je crois que tu trouveras de quoi faire ici : http://beuss.developpez.com/tutoriels/pcasm/

    Cdt
    merci beaucoup
    pour cela je continue à exposer le travaille dont je suis censé de faire
    en fait , je chercher à changer la routine qui se déclenche lors d'une interruption de type instruction inexistante pour faire ça

    tout d'abord je dois penser à un code opération inexistante :o

    j'ai pensé écrire ce bloc dans mon programme C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    __asm__
    (
         "LOCK Xchang  %eax, %ebx\n\t"
     
    )

    lors de la compilation il m'affiche cette erreur :euh:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: no such instruction " Xchang  %eax, %ebx"

    je ne sais pas est ce que je dois entre contente de trouver une instruction inexistante ou c'est totalement faux ce que j'ai fais!

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    L'instruction exacte est « XCHG » et pas « XChang ».

    Si tu as saisi « XChang » exprès pour insérer une instruction qui n'existe pas, ça ne fonctionnera pas : c'est l'assembleur utilisé par ton compilateur qui va traduire tes mnémoniques en codes opération. Si le mnémonique n'existe pas, l'assemblage échouera avant de produire un quelconque fichier exécutable.

    Si tu veux introduire artificiellement une instruction inexistante pour que ton CPU déclenche une exception., il faut choisir un code opération inexistant et l'insérer manuellement avec « db » (qui sert en principe à définir un octet de données).

    Enfin, sache que ces instructions ne fonctionnent que sur x86. L'assembleur n'est pas un langage universel mais est propre à chaque famille de processeurs. Si tu passes sur machine à base de ARM, par exemple, il faudra choisir d'autres valeurs.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    L'instruction exacte est « XCHG » et pas « XChang ».

    Si tu as saisi « XChang » exprès pour insérer une instruction qui n'existe pas, ça ne fonctionnera pas : c'est l'assembleur utilisé par ton compilateur qui va traduire tes mnémoniques en codes opération. Si le mnémonique n'existe pas, l'assemblage échouera avant de produire un quelconque fichier exécutable.

    Si tu veux introduire artificiellement une instruction inexistante pour que ton CPU déclenche une exception., il faut choisir un code opération inexistant et l'insérer manuellement avec « db » (qui sert en principe à définir un octet de données).

    Enfin, sache que ces instructions ne fonctionnent que sur x86. L'assembleur n'est pas un langage universel mais est propre à chaque famille de processeurs. Si tu passes sur machine à base de ARM, par exemple, il faudra choisir d'autres valeurs.
    je n'ai pas compris votre remarque en ce qui concerne "db" j'ai meme utiliser GOOGLE MAIS j'ai pas abouti à une comprehension
    pouvez_vous m'expliquez avec un exemple?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    L'exercice que tu cherches à effectuer n'est pas très difficile, mais comme il sort complètement de la normale, il est essentiel que tu comprennes d'abord comment fonctionne un micro-processeur et ce que fait réellement un assembleur.

    • Le micro-processeur ne peut interagir avec son environnement qu'en lisant ou en écrivant des octets en mémoire ;
    • Ces octets peuvent contenir aussi bien des données qu'un programme, ou avoir des valeurs indéfinies ;
    • Un programme en langage machine est donc une suite de valeurs qui correspondent chacune à une opération que le processeur sait effectuer. On parle donc de code opération. Ces codes peuvent être eux-mêmes suivis en mémoire par les données qui leur sont associées. Le micro-processeur les lira à leur tour ;
    • Une fois l'opération effectuée (et les données associées lues), le micro-processeur passe à l'octet qui les suit immédiatement, et considère son contenu comme une nouvelle instruction. Il répète alors le même procédé.


    Pour pouvoir programmer dans des conditions humainement acceptables, et pouvoir gérer en même temps les différents modes d'adressage applicables à une même opération, on a associé des « mnémoniques » à chaque opération. Ce sont des mots-clés, formés par la contraction du nom de l'opération, censés être facilement mémorisables. Ce sont ces mnémoniques qui forment les instructions que tu vas utiliser dans ton programme.

    Par exemple, lorsque tu écris :


    … lors de la compilation, ton assembleur produira ceci en sortie :

    Code Asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        93            XCHG EAX,EBX

    « 93 » est donc la valeur en hexadécimal qui correspond à l'ordre d'échange des contenus de EAX et EBX. Tu peux également ajouter « LOCK » si tu le souhaites :


    … ce qui donne :

    Code Asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        F0 93         XCHG EAX,EBX

    Si tu examines le contenu du fichier de sortie :

    Code Texte : Sélectionner tout - Visualiser dans une fenêtre à part
    0000000: f0 93                                    ..

    … on s'aperçoit qu'il ne contient que ce que l'on a compilé, et cela correspond exactement aux codes des opérations demandées.

    « DB », maintenant, signifie « Data Byte » et sert à insérer un octet de données au milieu de ton programme. Il existe également « dw » , « dd » et « dq » pour « Data Word » (16 bits), « Data Double Word » (32 bits) et « Data Quad Word » (64 bits). Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        F0 93         XCHG EAX,EBX
        54            DB 54h
    … dans ce dernier exemple, on voit bien que les codes générés sont ceux des codes opérations correspondants dans le cas d'une instruction ordinaire, mais que c'est la donnée explicitement spécifiée par le programmeur qui est insérée à l'endroit de db.


    Tout cela pour dire, donc, que si tu veux insérer une instruction qui n'existe pas afin de déclencher volontairement une exception, il faut que :

    • Tu trouves (sur le Net, par exemple) la table de correspondance entre les codes-opérations et les instructions du x86 ;
    • Tu en choisisses un qui n'est pas alloué ;
    • Tu insères manuellement ce code dans ton programme en te servant de db.



    Je te laisse volontairement trouver le reste seule.
    Bon courage.

  7. #7
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Obsidian, toujours aussi patient et des réponses toujours pertinentes et précises

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Points : 36
    Points
    36
    Par défaut
    bonjour

    je voulais savoir est ce que je peux déclencher une instruction inexistante en c genre équivalente en assembleur à " loxk Xchg eax ebx"

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par sali2801 Voir le message
    bonjour

    je voulais savoir est ce que je peux déclencher une instruction inexistante en c genre équivalente en assembleur à " loxk Xchg eax ebx"
    ?

    Tu viens de recevoir une réponse (commentaire #6).

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    ?

    Tu viens de recevoir une réponse (commentaire #6).
    non mais cette fois sans se servir de l'assembleur purement en C

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Première chose : l'assembleur n'est pas « un langage comme un autre », comme si tu comparais par exemple le Pascal et le C. C'est le jeu d'instructions de ton micro-processeur. Ça veut dire notamment que ton programme en C sera d'abord compilé vers l'assembleur avant de produire un exécutable en langage machine.

    Ensuite, si tu poses la question, c'est que tu n'as pas compris les explications que l'on t'a données dans cette discussion : relis les commentaires #4 et #6.

    Si tu tapes des instructions inexistantes en C, comme dans tout autre langage, c'est l'interpréteur ou le compilateur qui te renverra littéralement l'erreur « Syntax Error ». Et c'est vrai également en assembleur (d'où l'insertion manuelle de faux codes opérations pour déclencher l'exception attendue).

    À dire vrai, l'exception en question est le moyen qu'utilise le micro-processeur pour te dire qu'il ne comprend pas ce qu'il lit, de la même façon qu'un logiciel comme un interpréteur ou un compilo cesse le traitement en te renvoyant un message d'erreur. Ce n'est pas une façon universelle de signaler une instruction incorrecte en programmation.

    Si ce principe te pose toujours problème, essaie de prendre le problème à l'envers : quel comportement le micro-processeur devrait adopter face à un code opération invalide ?

  12. #12
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut Générer une exception "instruction inexistante" en assembleur
    Apparemment la discusion n'est pas fermée, alors je complète pour ceux que ça intéressent:

    Pour des raisons de test (des systèmes d'exploitation, compilateurs, etc.) Intel à prévu le coup:
    C'est l'instruction UD2.

    Cette intruction génère systématiquement une exception "Illegal Op-code" lorsqu'elle est exécutée.
    Elle est exécutables dans tous les modes (réel, protégé, 64, etc) et n'est pas privilègiée. Apparemment elle existe sur tous les processeurs Intel depuis le 80386.

    Seulement je ne sais pas si le mnémonique UD2 est reconnu par tous les programmes assembleurs (Delphi la reconnaît dans les blocs Asm). Mais on peut toujours utiliser "db" pour insérer son code "machine" qui est :

    Référence:
    Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2

Discussions similaires

  1. Signification de "LOCAL" dans une instruction assembleur
    Par b3nj4m1 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 24/05/2013, 16h06
  2. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  3. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44

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