2009-01-17 5 views

Répondre

14

Les plus grandes choses à garder à l'esprit sont:

  • Peu registres à usage général, et ceux que vous ne disposez sont pas pures GP - de nombreuses instructions vous obligent à utiliser certains registres dans un but précis. Les instructions x86 sont deux-opcode plutôt que trois-opcode, ce qui peut rendre certaines opérations plus complexes. C'est-à-dire, au lieu d'ajouter r0, r1, r2 (r0 = r1 + r2), vous ajoutez eax, ebx (eax + = ebx).
  • segments en mode protégé (tout code 32 bits en dehors de DOS, efficace) de rendre votre système d'adressage mémoire extrêmement non évidente, ce qui peut vous mordre dans le cul quand vous commencez.
  • Vous allez être à la recherche des drapeaux mis/effacés par des instructions tout le temps. Apprenez à aimer les manuels d'Intel.
  • Edit, une chose que j'oublié: L'utilisation de registres partiels (par exemple ah pour accéder aux 8 bits de poids fort des plus bas de 16 bits du registre eax) peut faire des manipulations de suivi à vos registres très difficiles. Soyez prudent et commentez libéralement jusqu'à ce que vous obtenez des choses.

À part cela, x86 est plutôt simple. Lorsque vous apprenez à abuser des instructions comme 'lea' et 'test', vous apprenez à l'aimer. Aussi, protip: Intel vous enverra des copies des manuels de jeu d'instructions gratuitement, ne même pas à payer pour l'expédition. Regardez autour de leur site pour l'e-mail d'exécution et demandez les livres par SKU.

+0

Vous pouvez commander le CD [ici] (https://secure.hibbertgroup.com/intel/spm?programId=1). La copie papier, malheureusement, n'est plus offerte. – new123456

+1

Le jeu d'instructions x86 est mieux compris par l'archéologie, je trouve - si vous avez vu ce qu'un 8080 a, comment cela informe vaguement le design d'un 8088, et enfin comment le 386 a ajouté des choses, tout est logique. Sinon, les règles semblent un peu arbitraires. – ijw

5

x86 dispose d'un ensemble très limité de registres disponibles par rapport à la plupart des autres architectures. Cela ne rend pas vraiment le langage d'assemblage plus difficile à apprendre, mais il est parfois plus difficile d'implémenter le code dans la pratique. En outre, en raison de l'histoire x86 de forte rétrocompatibilité, le jeu d'instructions n'est pas terriblement symétrique (certainement pré-RISC) et il peut y avoir beaucoup d'exceptions à la règle et les cas de coin à faire attention.

+0

Oui, mais ce n'est pas si limité par rapport à MIPS. :) – BobbyShaftoe

+3

@BobbyShaftoe, êtes-vous un programmeur d'assemblage? MIPS a 32 registres à usage général et x86 en a 8 pour autant que je sache. – mmcdole

1

x86 ont des instructions plus complexes que MIPS. Il y a donc probablement une seule instruction pour les séquences communes dans MIPS (notamment l'adressage mémoire). Le manque de nombreux registres est certainement un inconvénient, mais dans les deux architectures, il y a des conventions qui limitent à peu près le nombre de ce que vous pouvez utiliser librement jusqu'à 4-5. Juste plus prononcé en x86. x86 a plus d'exceptions pour l'utilisation du registre que MIPS que vous devez garder à l'esprit mais rien ne vaut la peine de se plaindre constamment. Parlant d'expérience, l'une ou l'autre langue a à peu près la même difficulté à apprendre, y compris les conventions. Peut-être que x86 est un peu plus facile, compte tenu des ressources en ligne abondantes et de sa popularité.

La partie difficile dans x86 est la génération de binaire, en raison de ses instructions de longueur variable et plusieurs modes d'adressage. Le plus souvent, vous n'avez jamais besoin de le faire de toute façon.

Je peux certainement vous recommander d'apprendre une architecture d'instruction plus complexe que MIPS.

Et, ce qui est important, ne soyez pas une partie de la guerre religieuse entre V.S. RISC CISC ...

1

J'ai appris x86 et x86_64 à écrire un assembleur moi-même. Si vous n'écrivez pas vous-même un assembleur, une partie de ce que je dirai est à peu près inutile. Je ne connais pas MIPS moi-même.

x86 l'adressage indirect est une opération complexe. Dans une instruction unique, vous pouvez faire ces:

mov reg, [reg+offset] 
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8. 

Leur encodage instruction est complexe à cause de cela, mais il est cohérent pour toutes les instructions qui code cette façon. Vous pourriez vouloir lire ceci de sandpile.org. Si vous voulez en savoir plus sur l'encodage, vous pouvez toujours me poser des questions à ce sujet. Une autre instruction codant des détails ennuyeux liés sont les préfixes. Ils changent beaucoup la signification de l'instruction. Par exemple, 0x66 (si je me souviens bien) et certaines instructions deviennent pour les GPR 16 bits au lieu des Gbit 32 bits.

32bit RBP (dans l'ordre): EAX, CEx, EDX, EBX, esp, ebp, esi, edi

64bit GPRS: rax, RCX, RDX, rbx, rsp, RBP, rsi, rdi, r8 Notez que le nombre de registres à usage général est faible, ce qui forcera la plupart des logiciels à l'utiliser plus ou moins de la manière d'une machine à pile. Un détail douloureux. rsp est utilisé pour la pile (pop, push -instructions), et rbp tend à être également réservé. x86_64 a plus de registres, mais il faudra du temps pour que les gens l'adoptent, même si tous les consommateurs avaient un processeur capable de l'adopter.

Il existe deux jeux d'instructions différents pour l'arithmétique en virgule flottante. XMM étant le plus récent. En x86_64 il y a 16 registres 128 bits disponibles et en x86 il n'y en a que 8. L'ancien jeu d'instructions gère les registres en tant que pile. Vous n'avez tout simplement pas d'échange, de pincement ou de pourriture, alors travailler avec est un véritable casse-tête.

En utilisation, x86 a tendance à se réduire en une machine RISC. Certaines de ces instructions complexes ne donnent aucun avantage ou sont même plus lentes sur les machines plus récentes. Vous ferez avec la compréhension des instructions 30-150 en fonction de ce que vous lisez ou écrivez. Vous pouvez également ignorer complètement certaines anciennes instructions et AL/HL -stuff. Gardez à l'esprit toutes ces origines de fouillis derrière 1978, ce qui est assez surprenant, il n'est pas pire, 31 ans à partir de cela et 24 ans à compter de la première introduction de IA-32. Beaucoup de choses changent leur pertinence à ce moment-là.

Les sauts directs et les appels semblent être relatifs à partir de l'instruction suivante dans x86. Par conséquent:

jmp nowhere # or call, jz, jg whatever... 
nowhere: 
    nop 

Finit codé en 'JMP imm: 0, NOP'. Le registre-indirect jmp qui fait des sauts absolus. Il est bon aussi de remarquer qu'il n'y a pas de sauts conditionnels indirects, ça m'a dérangé aussi.

Ce n'est pas tout ce que vous devriez savoir, mais la première chose qui vient à l'esprit de votre question. Mais peut-être que vous pouvez vous entendre avec eux pour le moment.

Questions connexes