web-dev-qa-db-fra.com

Quelle est la différence entre les encodages d'instructions ARM, Thumb et Thumb 2?

Je suis un peu confus au sujet des jeux d'instructions. Il y a Thumb, ARM and Thumb 2. D'après ce que j'ai lu, les instructions Thumb sont toutes en 16 bits mais à l'intérieur du manuel d'utilisation ARMv7M (page vi) il y a Thumb Instructions 16 bits et Thumb 32 bits mentionnées.

Maintenant, je dois surmonter cette confusion. On dit que Thumb 2 prend en charge les instructions 16 bits et 32 ​​bits. ARMv7M prend-il donc en charge les instructions Thumb 2 et pas seulement Thumb?

Encore une chose. Puis-je dire que Thumb (32 bits) est le même que les instructions ARM qui sont également 32 bits?

31
71GA

Oh, ARM et leur nom idiot ...

C'est une idée fausse courante, mais officiellement, il n'y a pas de "jeu d'instructions Thumb-2".

Ignorant ARMv8 (où tout est renommé et AArch64 complique les choses), de ARMv4T à ARMv7-A il y a deux jeux d'instructions: ARM et Thumb. Ils sont tous les deux "32 -bit "dans le sens où ils fonctionnent sur des données allant jusqu'à 32 bits dans des registres de 32 bits avec des adresses 32 bits. En fait, lorsqu'ils se chevauchent, ils représentent exactement les mêmes instructions - ce ne sont que les instruction encoding qui diffère, et le processeur n'a en fait que deux frontaux de décodage différents vers son pipeline, qu'il peut basculer. Pour plus de clarté, je vais maintenant délibérément éviter les termes "32 bits" et " 16 bits "...

Les instructions ARM ont des codages de 4 octets de largeur fixe qui nécessitent un alignement de 4 octets. Les instructions du pouce ont des encodages de longueur variable (2 ou 4 octets, maintenant appelés "étroits" et "larges") nécessitant un alignement sur 2 octets - la plupart des instructions ont des encodages sur 2 octets, mais bl et blx a toujours eu des encodages sur 4 octets*. Le bit vraiment déroutant est venu dans ARMv6T2, qui a introduit la "technologie Thumb-2". Thumb-2 comprenait non seulement l'ajout d'une charge d'instructions supplémentaires à Thumb (principalement avec des encodages à 4 octets) pour l'amener presque à la parité avec ARM, mais également l'extension de l'état d'exécution pour permettre l'exécution conditionnelle de la plupart des instructions Thumb, et enfin l'introduction d'un toute nouvelle syntaxe d'assemblage (UAL, "Unified Assembly Language") qui a remplacé les précédentes syntaxes séparées ARM et Thumb) et a permis d'écrire une fois le code et de l'assembler à l'un ou l'autre jeu d'instructions sans modification.

Les architectures Cortex-M implémentent uniquement le jeu d'instructions Thumb - ARMv7-M (Cortex-M3/M4/M7) prend en charge la plupart des "technologies Thumb-2", y compris l'exécution conditionnelle et les encodages pour les instructions VFP, tandis que ARMv6-M (Cortex- M0/M0 +) utilise uniquement Thumb-2 sous la forme d'une poignée d'instructions système de 4 octets.

Ainsi, les nouveaux encodages à 4 octets (et ceux ajoutés plus tard dans les révisions ARMv7) sont toujours instructions Thumb - l'aspect "Thumb-2" d'eux est qu'ils peut avoir des codages à 4 octets, et qu'ils peuvent (la plupart du temps) être exécutés conditionnellement via it (et, je suppose, que leurs menmonics ne sont définis qu'en UAL).

* Avant ARMv6T2, c'était en fait un détail d'implémentation compliqué de savoir si bl (ou blx) était exécuté comme une instruction de 4 octets ou comme une paire d'instructions de 2 octets. La définition architecturale était la dernière, mais comme ils ne pouvaient être exécutés que par deux en séquence, il n'y avait pas grand-chose à perdre (à part la possibilité de prendre une interruption à mi-parcours) en les fusionnant en une seule instruction pour des raisons de performance. ARMv6T2 vient de redéfinir les choses en termes d'exécution fusionnée d'une seule instruction

53
Notlikethat

En plus de la réponse de Notlikethat , et comme il le suggère, ARMv8 introduit une nouvelle terminologie pour essayer de réduire la confusion (bien sûr, en ajoutant encore plus de nouvelle terminologie):

Il existe un état d'exécution 32 bits (AArch32) et un état d'exécution 64 bits (AArch64).

L'état d'exécution 32 bits prend en charge deux jeux d'instructions différents: T32 ("Thumb") et A32 ("ARM"). L'état d'exécution 64 bits prend en charge un seul jeu d'instructions - A64.

Toutes les instructions A64, comme toutes les A32, sont de taille 32 bits (4 octets), nécessitant un alignement de 4 octets.

Beaucoup/la plupart des instructions A64 peuvent fonctionner à la fois sur des registres 32 bits et 64 bits (ou sans doute des vues 32 bits ou 64 bits du même registre 64 bits sous-jacent).

Tous les processeurs ARMv8 (comme tous les processeurs ARMv7) prennent en charge les instructions Thumb-2 dans le jeu d'instructions T32.

13
unixsmurf