|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Inscription : octobre 2010 Messages : 83 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() Alex VEtudiant administrateur systèmes et réseaux Inscription : octobre 2007 Messages : 609 ![]() |
Salut,
Je crois que tu trouveras de quoi faire ici : http://beuss.developpez.com/tutoriels/pcasm/ Cdt
__________________
UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :
|
|
|
00
|
|
|
#3 | |||
|
Inscription : octobre 2010 Messages : 83 ![]() |
Citation:
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 :
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 |
|||
|
|
00
|
|
|
#4 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
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. |
|
|
10
|
|
|
#5 | |
|
Inscription : octobre 2010 Messages : 83 ![]() |
Citation:
pouvez_vous m'expliquez avec un exemple? |
|
|
|
00
|
|
|
#6 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
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.
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 : « 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 : Si tu examines le contenu du fichier de sortie : … 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 : … 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 :
Je te laisse volontairement trouver le reste seule. Bon courage. |
|
|
10
|
|
|
#7 |
|
Membre expérimenté
![]() ![]() François conception mécanique Inscription : janvier 2005 Messages : 330 ![]() |
Obsidian, toujours aussi patient et des réponses toujours pertinentes et précises
|
|
|
10
|
|
|
#8 |
|
Inscription : octobre 2010 Messages : 83 ![]() |
bonjour
je voulais savoir est ce que je peux déclencher une instruction inexistante en c genre équivalente en assembleur à " loxk Xchg eax ebx" |
|
|
00
|
|
|
#9 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
|
|
|
00
|
|
|
#10 |
|
Inscription : octobre 2010 Messages : 83 ![]() |
|
|
|
00
|
|
|
#11 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
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 ? |
|
|
00
|
|
|
#12 |
|
Membre du Club
![]() Rédacteur technique (retraité) Inscription : octobre 2009 Messages : 21 ![]() |
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 |
|
|
10
|
Copyright © 2000-2013 - www.developpez.com