Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 32-bits / 64-bits
x86 32-bits / 64-bits Architectures x86 32/64 bits et leurs outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/12/2012, 16h41   #1
sali2801
 
Inscription : octobre 2010
Messages : 83
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 83
Points : -4
Points : -4
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
sali2801 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h18   #2
darkwall_37
Membre éclairé
 
Homme Alex V
Etudiant administrateur systèmes et réseaux
Inscription : octobre 2007
Messages : 609
Détails du profil
Informations personnelles :
Nom : Homme Alex V
Âge : 24
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : octobre 2007
Messages : 609
Points : 378
Points : 378
Salut,

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

Cdt
__________________
UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :
darkwall_37 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 20h29   #3
sali2801
 
Inscription : octobre 2010
Messages : 83
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 83
Points : -4
Points : -4
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!
sali2801 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 22h28   #4
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2012, 16h19   #5
sali2801
 
Inscription : octobre 2010
Messages : 83
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 83
Points : -4
Points : -4
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?
sali2801 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 19h22   #6
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/12/2012, 05h28   #7
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Obsidian, toujours aussi patient et des réponses toujours pertinentes et précises
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2012, 23h41   #8
sali2801
 
Inscription : octobre 2010
Messages : 83
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 83
Points : -4
Points : -4
bonjour

je voulais savoir est ce que je peux déclencher une instruction inexistante en c genre équivalente en assembleur à " loxk Xchg eax ebx"
sali2801 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 01h34   #9
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
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).
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 23h47   #10
sali2801
 
Inscription : octobre 2010
Messages : 83
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 83
Points : -4
Points : -4
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
sali2801 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 00h35   #11
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
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 ?
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2013, 18h34   #12
DomDA91
Membre du Club
 
Homme
Rédacteur technique (retraité)
Inscription : octobre 2009
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 70
Localisation : France

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

Informations forums :
Inscription : octobre 2009
Messages : 21
Points : 46
Points : 46
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
DomDA91 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h00.


 
 
 
 
Partenaires

Hébergement Web