Question

Je voudrais apprendre l'instruction x86 Set architecture. Je ne signifie pas l'apprentissage un ensemble pour x86. Je veux comprendre le code machine bébé.

La raison en est que je voudrais écrire un assembleur pour x86. Ensuite, je veux écrire un compilateur qui compile à cette assemblée.

Je sais qu'il ya manuels Intel et manuels AMD qui couvrent le x86 jeu d'instructions. Mais ceux-ci sont très grandes et denses.

Je me demande s'il y a une approche plus accessible (peut-être tutoriel) pour apprendre l'architecture de jeu d'instructions x86.

Était-ce utile?

La solution

À un certain moment, vous devrez faire face à un peu de complexité. Le jeu d'instructions x86 est grande.

Mais vous pouvez faire des choses beaucoup plus simple en lisant la documentation pour un CPU plus. Intel et AMD semblent ajouter des dizaines de nouvelles instructions à chaque sous-modèle. Essayez de lire le manuel Intel pour la 80386, qui est sensiblement plus petite et couvre encore beaucoup de ce que vous allez utiliser.

Je connais un bon (vieux) livre, mais il est en français. Il est appelé « du 80386 Programmation » par J.-M. et M. Trio. Je ne suis pas sûr qu'il est encore édité aujourd'hui (j'ai acheté le mien il y a près de 20 ans).

Autres conseils

Eh bien, je ne suis pas d'accord avec vous. La complexité des x86 est mal compris et donc exagéré. Je ne dis pas que ce n'est pas complexe. Il est sûrement mais c'est le cas seulement si vous souhaitez écrire un compilateur à part entière ou Assembleur. Si vous voulez juste apprendre l'Assemblée. Ce n'est pas complexe.

Permet de briser l'architecture x86-64 pour prouver mon point.


Registres:

x86-64 spécifie quelques registres. Combien exactement? Permet de les énumérer

  • 16 registres à usage général (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP + R8, R9, R10, R11, R12, R13, R14, R15)
  • 6 registres de Segement (CS, DS, SS, ES, FS, GS)
  • 64 bits RFlags & RIP 64 bits
  • 8 80 bits registres à virgule flottante (x87) (FPR0-FPR7) alias aux registres MMX 64 bits (MM0-MM7)
  • 16 registres de presse étendue de 128 bits (XMM0-XMM7 + XMM8-XMM16)
  • certains registres spéciaux / divers tels que des registres de commande (CR0 à 4), un registre de débogage (DR0 à 3, ainsi que 6 et 7), des registres de test (TR4 à 7), des registres de descripteurs (GDTR, LDTR IDTR), et un registre de tâche (TR) dont nous avons besoin de prendre soin à peine.

texte alt http: // www. viva64.com/content/articles/64-bit-development/amd64_em64t/01-big.png


modes d'adressage:

Comment faire référence à tout emplacement de mémoire?

Source: http://en.wikipedia.org/wiki/X86#Addressing_modes

Modes d'adressage pour la taille d'adresse 32 bits sur 32 bits ou 64 bits des processeurs x86 peuvent être résumées par cette formule:

text alt

Modes d'adressage pour le code 64 bits sur 64 bits des processeurs x86 peuvent être résumées par ces formules:

text alt

et

RIP + [déplacement]


Modes de fonctionnement:

Ce sont les modes dans lesquels il peut fonctionner:

  1. Mode réel
  2. Mode protégé
    • mode virtuel 8086
  3. Mode longue

Jeu d'instructions:

Vous entendez des gens dire son grand jeu d'instructions. Eh bien, il y a autour de 500-600 instructions. Mais certains d'entre eux sont mêmes instructions avec très peu de variations comme CMPS / CMPSB / CMPSW / CMPSD / CMPSQ. Si vous groupez eux comme ce nombre se résume à 400 instructions.

Pensez-vous que son très grand? Ensuite, j'ai quelques questions. Combien de fonctions ne une bibliothèque standard C a? combien de fonctions ne bibliothèque POSIX a? Qu'en est-NET et Java? Combien de classes et méthodes ont-ils? Avons-nous de connaître toutes les fonctions / méthodes / classes? Quelle approche ne nous prenons pour l'apprentissage de ces bibliothèques?

Il suffit d'apprendre quelques-uns de chacun. À peu près passer par tous. Obtenez le sentiment de leur existence et la référence lorsque vous avez besoin.

On peut logiquement diviser ces instructions dans les catégories suivantes:

  1. Instructions d'usage universel
    • Manipulation des données de base (déplacement et copie)
    • Transfert de contrôle (Sauts, Appels, Interruptions)
    • Arithmétique et instructions logiques (ajouter, sous et, XOR etc ..)
    • String & Bit Instructions Oriented
    • Appels système
  2. Instructions système
  3. x87 à virgule flottante Instructions
  4. 64 bits Instructions médias (MMX)
  5. 128 bits Media (SSE) Instructions

Thats it !! C'est tout ce que vous devez savoir. Maintenant, dites-moi franchement. Est-ce que complexe?

Il suffit de faire tout bon livre sur le langage assembleur couvrant architecture x86. Je suggère personnellement « Assemblée Langue PROGRAMMATg dans GNU / Linux pour IA32 Architectures » par Rajat Moona parce que son court et au point. Ne pas perdre beaucoup de temps. Mais il ne couvre pas X86-64.

Après familiarisée avec IA32 pour x86-64 lire http : //csapp.cs.cmu.edu/public/1e/public/docs/asm64-handout.pdf

Je dirais que sauter à l'eau profonde et à partir de là.

Commencez par écrire une application simple (C / ++). Ensuite, utilisez le débogueur épique appelé OllyDbg ( http://www.ollydbg.de/ ). Déboguer votre application et voir comment le compilateur mis en œuvre votre code. Vérifiez boucles. Vérifiez les appels de fonction. Vérifiez les appels API. Vérifiez la manipulation de la mémoire.

En faisant cela, vous aurez une idée réelle de la façon de faire les choses.

J'ai l'application de débogage de cette façon et Aréopage. Vous dites que vous voulez comprendre le code de la machine et il n'y a pas de meilleure façon à mon avis.

Vous pouvez également vérifier avec quelque chose appelé « crackme » (google). Cela vous mettra dans un défi pour tester vos compétences. Une fois que vous êtes en contrôle, vous verrez que tout ce que vous voulez savoir est juste une question de creuser les instructions choisir la configuration manuelle. obtenir le point? vous mettre au défi avec des objectifs spécifiques.

Bonne chance. Il est pas facile mais très possible.

Si vous voulez juste comprendre les chiffres et certaines des complexités telles que octets Mod R / M et les autres bizarreries derrière, vous pouvez essayer de mettre en œuvre d'un simple émulateur 8086. (Juste le CPU). Je l'ai trouvé pour être une expérience amusante et intéressante.

http://www.ousob.com/ng/iapx86/ est un vraiment bonne référence utilisé lors de l'écriture je un émulateur et donne une liste très belle opcodes avec la version du processeur qui est apparu, et l'opcode hexagonale pour chaque variation de l'opcode.

Je pense que vous n'êtes pas réaliste. Vous sed:

  

Je sais qu'il ya Intel   manuels et manuels AMD qui couvrent la   instruction x86 définie. Mais ceux-ci sont   très grand et dense.

...

  

Je voudrais   apprendre tout cela. Peut-être que je devrais   commencer par ce qui est plus simple et   plus facile à apprendre.

Avez-vous demandé votre auto pourquoi il y a de grandes et denses? La réponse est simple! Si nous cherchons simplement des produits Intel x86

  
      
  • Il y a: 8086, 8088, 80186, 80188 et 80286 16 processeurs bits.
  •   
  • Il y a: 80386 et 80486 avec la construction coprocesseur à virgule flottante 32   CPU bits.
  •   
  • Il y a: Pentium et Pentium MMX
  •   
  • Il y a: Pentium Pro, Pentium II et Pentium III
  •   
  • Il y a: Pentium 4 Pentium M, Pentium 5, Pentium 6, Celleron,   Prescott
  •   
  • Il y a: Intel Core 2, Intel Core i7
  •   
  • Il y a: Intel Atom
  •   
  • Il y a: Sandy Bridge

  •   
  • Il y a 16, 32 et 64 architectures de bit

  •   
  • Il y a plusieurs mathématiques différentes avec des unités à virgule flottante.
  •   
  • Il y a plusieurs extensions Streaming SIMD.
  •   
  • Il existe plusieurs modèles protégés de CPU.
  •   

Il y a ...

Il y a 32 ans de R & D sur les architectures x86. Et je did'n mentionne AMD, VIA et ainsi de suite!

Non, il n'y a pas moyen plus rapide!

Les anciennes versions du manuel MSNA avait une belle référence concise, tout en étant vieux CPU auxquelles ils se réfèrent ne sont si récentes. Voici une copie au hasard j'ai trouvé. Listes opcodes (disposés de sorte que les modèles sont faciles à voir), et décrit le mode d'adressage encodages:

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

J'ai écrit un générateur de code de la machine d'exécution (ciblant 486 ou mieux) en utilisant fondamentalement juste cette information, il devrait y avoir assez là pour vous aider à démarrer ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top