Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Invité régulier
    Inscrit en
    octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 109
    Points : 7
    Points
    7

    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 éclairé
    Homme Profil pro Alex V
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    octobre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Nom : Homme Alex V
    Âge : 26
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : octobre 2007
    Messages : 630
    Points : 389
    Points
    389

    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
    Invité régulier
    Inscrit en
    octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 109
    Points : 7
    Points
    7

    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 :
    1
    2
    3
    4
    5
    __asm__
    (
         "LOCK Xchang  %eax, %ebx\n\t"
     
    )

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

    Code :
    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 472
    Points : 13 991
    Points
    13 991

    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
    Invité régulier
    Inscrit en
    octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 109
    Points : 7
    Points
    7

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 472
    Points : 13 991
    Points
    13 991

    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 :
    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 :
    1
    2
     
        F0 93         XCHG EAX,EBX

    Si tu examines le contenu du fichier de sortie :

    Code Texte :
    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 :
    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 Expert
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 39
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 508
    Points : 1 119
    Points
    1 119

    Par défaut

    Obsidian, toujours aussi patient et des réponses toujours pertinentes et précises

  8. #8
    Invité régulier
    Inscrit en
    octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 109
    Points : 7
    Points
    7

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 472
    Points : 13 991
    Points
    13 991

    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
    Invité régulier
    Inscrit en
    octobre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 109
    Points : 7
    Points
    7

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 472
    Points : 13 991
    Points
    13 991

    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 habitué
    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    octobre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : octobre 2009
    Messages : 47
    Points : 123
    Points
    123

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •