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