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

Assembleur Discussion :

[Débutant] Les opcodes sur les différents processeurs [FAQ]


Sujet :

Assembleur

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 60
    Points
    60
    Par défaut [Débutant] Les opcodes sur les différents processeurs
    Bonjour ,

    J'ai juste un ene question simple,est ce que le code en hexa des instructions jnz , jz,jne etc bref les saut conditionnels sont les memes partout ? c'est a dire sur tous les processeurs ? J'ai l'impression que non mais je trouve que ca serait pas logique ...

    Merci les boss

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    L'opcode n'est évidement pas le même sur tous les processeurs. Par contre, il est identique pour tous les x86.

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 60
    Points
    60
    Par défaut
    Est ce que mmon processeur un AMD Athlon XP 1800+ fait il partie de cette famille des x86 ?

    Et une autre ptite question, pourtant c'est bizarre car en désassemblant différent prog avec mon PC donc avec un Athlon,les instructions JZ et JE etc n'ont pas le meme code Hexa selon le programme !

    Merci

  4. #4
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Bonjour !

    Explications :
    - Ton AMD fait partie des x86.
    - Pour l'opcode des instructions de saut, c'est normal qu'il soit différent :

    Une partie des 16 bits de l'instruction est réservée au véritable opcode de l'instruction (qui est toujours le même) et d'autres parties sont pour les opérandes.
    Donc pour un jmp, il y a le numéro de l'instruction et l'adresse du saut.
    D'ailleur en général un jump prend 3 octets (s'il est far).

    Salut !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 60
    Points
    60
    Par défaut
    Ou puis je trouver la liste des instructions correspondant aux x86 avec le code hexa qui correspond a chacun ? vous avez des liens ? Genre:

    jmp ---> 74
    jz ------> 75 etc ...

    Et pis est ce que dans une instruction ,les 4 premiers caracteres dans le code en Hexa représentent toujours le code de l'opérateur ? (opérateur pour moi c'est jnz , jmp etc ...)

    Merci

  6. #6
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    On peut pas vraiment dire jmp = 75 jc = 24 etc...

    Car par exemple :
    0100 1011 0111 1100

    Les 7 bits de poids fort peuvent représenter le code machine de l'instruction et les autres les opérandes (je dis ça, ce n'est qu'un exemple, je ne sais pas exactement)...

    Si tu veux les docs Intel :
    -Architecture basique
    -Instruction Set ( Ca doit être ça que tu veux... )
    -Programmation système

    Bonne Chance...

    J'espère que ça t'aidera.
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Hello,

    Les opcodes sont documentés dans les manuels intels

    http://www.intel.com/design/Pentium4...tation.htm#man

    Il existe un plus petit fichier nommé "x86eas.hlp" trouvable facilement sur le net qui regroupe exclusivement les instructions et leurs opcodes.

    Les instructions ont différentes tailles d'opcodes, et les JCC (jmp conditionnels) sont différents suivant leur type (short ou NEAR), ainsi que les JMP (SHORT, NEAR ou FAR).

    certaines instructions n'ont qu'un octet d'opcode (NOP, RET, etc.) d'autres peuvent dépasser les 10 octets...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par loverdose
    Ou puis je trouver la liste des instructions correspondant aux x86 avec le code hexa qui correspond a chacun ? vous avez des liens ? Genre:

    jmp ---> 74
    jz ------> 75 etc ...
    Il suffit d'aller sur le site des constructeurs Intel ou AMD.

    Sinon, en cherchant sur Google avec les mots
    complete pentium instruction
    tu trouveras de nombreux sites proposant ce qu'il te faut, dont par exemple
    http://www.beeship.com/beewiki.asp?t...%20Set%20Table

    Citation Envoyé par loverdose
    Et pis est ce que dans une instruction ,les 4 premiers caracteres dans le code en Hexa représentent toujours le code de l'opérateur ? (opérateur pour moi c'est jnz , jmp etc ...)

    Merci
    Tu verras dans les listing des instructions que la longueur du code hexa varie, donc les 4 premiers caracteres... ne signifie rien du tout.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    La taille d'une instruction varie énormément, et il est assez complexe de recencer tous les cas :

    • L'instruction peut avoir un préfixe. Celui-ci ne change pas l'opération, mais peut modifier :
      [list:a2a2dde23f]
    • La taille de ses opérandes, 16 ou 32 bits (mov eax, ebx / mov ax, bx)
    • La taille des variables d'adressage, 16 ou 3E bits : (mov eax, [esi+ebp] / mov eax, [si+bp])
    • Répeter l'instruction (valide qu'avec certaines instruction : REP MOVSX)
    [*]L'opcode décrit le type de l'opération et la taille et le type des opérandes.
    • Opcode sur un seul octet : par exemple 90h (NOP)
    • Opcode sur deux octers : par exemple 0F 0A (Attention, 0F est l'octet de poid faible)
    [*]Parfois, il y a une logique décelable dans le codage des opcodes : les bits de poids faibles peuvent désigner le sens : (mov eax, [edi] ou mov [edi], eax) ainsi que la taille : (mov al, bl ou mov eax, ebx) ainsi que d'autres propriétés. Ainsi, en ayant seulement les 5 premiers bits d'un opcode, on peut déjà savoir de quelle opération il s'agit.[*]Lorsque l'instruction a des opérandes de type r/m, c'est à dire que l'instruction est désignée pour opérer avec la mémoire et/ou des registres, l'opcode est suivi d'un octet appellé le mod r/m
    • Adressage entre deux registres (add eax, ebx)
    • Adressage entre un registre et la mémoire, en désignant l'adresse explicitement : addressage direct (add eax, [1000h])
    • Adressage entre un registre, et un emplacement mémoire désigné par d'autres registres : adressage indirect (add eax, [eax + ebx*4 + 10])

    l'encodage du mod r/m est pas vraiment intuitif, et peut être sur un ou deux octets.[*]Lorsque l'adressage désigné par le mod r/m est direct, (adresse explicite) l'adresse suit directement le mod r/m.[*] Lorsque le mod r/m désigne un adressage indirect, il peut également dire, si on dont effectuer un déplacement (add eax, [eax + 40], le + 40 est un déplacement) et si se déplacement est codé sur 8, 16 ou 32 bits. Dans ce cas, le déplacement suit aussi le mod r/m[*] Lorsque l'instruction n'agit que sur une seule opérande (inc eax) le mod r/m dispose de trois bits supplémentaires inutilisés puisqu'ils n'y a pas de deuxième opérande à définir. Ils servent comme extenstion de l'opcode. C'est à dire, qu'on peut avoir deux opcodes désignant des instructions différentes, et que pour savoir à quelle opération on a à faire, il faut aller chercher ces trois bits dans le mod r/m[*] Lorsque l'opcode utilise une opérande "immediate" (add eax, 10) la valeur, est encodée à la fin de l'instruction.[/list:u:a2a2dde23f]

    Il y a encore quelques exotismes, et instructions utilisant des paramètres bizares. Mais globallement, une même instruction est codée parreille sur tout les x86. (tous les processeurs pc < 64 bits) Par contre, une instruction avec des paramètres différents, est évidement codée différement, mais il ne me semble pas que c'était la question. Moins évident du premier abord : une opération peut avoir une taille variable. En effet, une addition d'un registre et d'un nombre (add eax, 10 ; codé sur 6 octets) ne va pas générer une instruction de la même taille qu'un addition de deux registres ( add eax, ebx ; codé sur 2 octets)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Quelque chose d'autre a été dit, qui mérite tout de même une remarque : Je pense que si, effectivement, avec les 4 premiers caractères hexa (les deux premiers octets) d'une instruction, on peut effectivement savoir de quelle opération il s'agit. Effectivement, pour les opérations les plus courantes, les deux premiers octets suffiront. Ils ne seront par contre pas indispensable. Pour une addition (add eax, eax) seul le premier octet, soit les deux premiers caractères hexa, suffiront à savoir qu'il s'agit d'une addition.

    En revanche, il est important de noter que pour chaque opération, ou chaque mnémonique (ADD est une mnémonique) il peut y avoir plusieures opcodes déjà, et donc, plusieurs deux premiers octets possibles.

    Il existe quelques instruction qui pourtant ne peuvent pas être déterminée avec certitude, rien qu'avec les deux premiers octets. Certaines instructions SIMD (Single Instruction Multiple Data) comme les instructions mmx, sse, ou sse2 peuvent il me semble avoir des opcodes plus gros. Dans les instruction un peu plus courante, il existe des instructions codées sur deux octets (voir précdént, opérations 0F xx par exemple) qui ont une extenstion d'opcode dans le mod r/m. Il faut donc aller chercher dans les trosi bits du troisième octet pour avoir la véritable opération. Enfin, parfois, il y a un prefixe d'instruction, pour modifier la taille d'adressage ou d'opérande, ou faire une répéttition. Ce qui veut dire qu'il faut regarder les octets d'après pour connaitre l'opération.

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 60
    Points
    60
    Par défaut
    Bonjour a tous et tout d"abord merci de vos liens et de vos réponses, j'ai tout enregistré et je lirais tout ca petit a petit car c'est assez gros quand meme.

    D'apres tout ce que vous me dites,j'ai une question maintenant qui me turlupine, puisque les instructions n'ont pas les meme codes selon le processeur, cela veut dire que y aura certains programmes qui vont marcher sur certain type de processeur et certains autres non ? Si c'est le cas je trouve que c'est un gros bordela alors et je comprendrais pas pourquoi personne n'a créé un standard de processeur et de langage assembleur qui marcherait chez tout le monde !

    Merci et a bientot !

  12. #12
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Bonjour !

    Effectivement les instructions sont différentes pour les différents types de processeurs. :o

    Mais pour les différents types de processeurs, pas pour tous les différents processeurs.

    Ainsi, presque tous les processeurs PC sont de la famille x86 (AMD, Intel etc...).
    Il y a donc peu de risques d'incompatibilité entre PCs tant que le programme est compatible avec le système d'exploitation.

    Salut
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

Discussions similaires

  1. Réponses: 14
    Dernier message: 16/04/2018, 09h35

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