Question:
J'ai besoin d'une correction rapide sur cette énigme d'opcode x86
Jonas' River
2014-02-13 03:26:10 UTC
view on stackexchange narkive permalink

J'essaie de comprendre comment encoder l'instruction MOV DS, AX , mais je suis confus par la table d'opcode comme suit:

enter image description here

  1. MOV DS est-il un octet ou MOV est-il un octet, DS le deuxième et AX le troisième?

  2. Le tableau impliquant que la valeur binaire du préfixe de registre source DS est 011? Si tel est le cas, comment pourrais-je l'encoder dans le cadre de l'instruction entière?

Je ne peux pas comprendre comment les tableaux ont un sens par la façon dont ils sont répertoriés; ils devraient être plus précis! Quelqu'un peut-il corriger cela?

Je veux juste déplacer la valeur du registre AX vers le segment de données, DS. Aucun site n'explique parfaitement comment l'encodage des registres dans les opcodes fonctionne exactement, ou la relocalisation.

Toutes les tables proviennent de http://ref.x86asm.net, et c'est très vague, peu clair, non spécifique et non détaillé.

Je voudrais savoir s'il existe des didacticiels 100% détaillés et parfaitement expliqués sur le fonctionnement du codage de chaque octet, des valeurs de chaque registre, de la troncature d'adresse, du décalage, etc. binaire, et comment l'encoder correctement.

Un répondre:
Igor Skochinsky
2014-02-13 04:13:39 UTC
view on stackexchange narkive permalink

Ce site est bien si vous connaissez le fonctionnement de l'encodage, mais si vous venez de commencer, je l'ignorerais pour le moment.

Le meilleur point de départ est probablement celui d'Intel Architectures Manuels de développement de logiciels. Jetez un œil au CHAPITRE 2 FORMAT D'INSTRUCTION dans le Volume 2, ainsi que les annexes, en particulier l'ANNEXE B FORMATS D'INSTRUCTION ET ENCODAGES et l'APPENDICE A CARTE OPCODE. Ils décrivent comment décoder les instructions en détail.

Une fois que vous serez un peu familiarisé avec certaines parties des encodages d'instructions, les notations dans les pages de liste d'instructions commenceront à avoir un sens. Par exemple, vérifions celle dont vous avez besoin.

Sur la page MOV , trouvez la variante dont vous avez besoin. Celui-ci lui ressemble:

  Hex Mnemonic Encoding Description8E / r MOV Sreg, r / m16 ** RM Déplacez r / m16 vers le registre de segment.  

En recherchant 'RM' dans le tableau suivant, nous obtenons:

  Op / En Opérande 1 Opérande 2 Opérande 3 Opérande 4RM ModRM: reg (w) ModRM: r / m (r) NA NA 

Et ainsi nous pouvons commencer à assembler l'opcode.

Le premier octet est fixé à 8E.

Le deuxième octet est l'octet ModRM. Il se compose de trois champs: mod , reg et r / m . Assemblons-le à l'aide de cette jolie table de Sandpile.

Tout d'abord, le champ mod . Puisque notre deuxième opérande est un registre et non une référence mémoire, cela correspond à mod=11.

À partir de la ligne de codage RM , nous voyons que reg encode le premier opérande, dans notre cas DS . En regardant dans le tableau, nous pouvons voir que DS est encodé comme 011.

Et enfin le r / m champ codant l'opérande 2, c'est-à-dire AX . Il est encodé sous la forme 000 .

Donc, notre octet ModRM est 11: 011: 000 , ou D8 . Cela fait de l'opcode complet 8E D8 . Vous pouvez le vérifier avec votre désassembleur préféré, par ex. XED:

  >xed.exe -d 8E D88ED8ICLASS: MOV CATÉGORIE: DATAXFER EXTENSION: BASE IFORM: MOV_SEG_GPR16 ISA_SET: I86SHORT: mov ds, ax  

( BTW, la notation / r dans la ligne de codage nous indique que le champ reg de l'octet ModRM code un registre et n'est pas une extension d'opcode. aurait une notation / <digit> où est la valeur du champ reg ).

Je veux apprendre le codage, pas le décodage! Pourriez-vous être un peu plus précis? Je suis désolé, mais j'apprends seulement avec de grands détails bien expliqués!
L'encodage et le décodage sont très étroitement liés. Vous ne saurez pas comment encoder les instructions si vous ne savez pas comment le processeur les décode.
@Jonas'River le décodage a été présenté comme une preuve d'exactitude. Igor, bonne explication! Il pourrait être plus facile d'expliquer que nous recherchons la valeur d'octet dans la section inférieure du tableau avec la ligne correspondant à AX sous "adresse effective" et la colonne sous DS dans la moitié supérieure du tableau. Ou ai-je mal lu?


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...