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

Je suis un peu confus au sujet des ensembles d'instructions. Il y a pouce, bras et Pouce 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 des instructions Thumb 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. Donc, ARMv7M supporte-t-il en fait les instructions Thumb 2 et pas seulement le pouce?

Encore une chose. Je peux dire que Le pouce (32 bits) est le même que les instructions ARM qui sont allso 32 bits?

25

2 réponses

OH, ARM et leur nom stupide...

C'est une idée fausse commune, 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: bras et Pouce. Ils sont tous deux "32 bits" en ce sens qu'ils fonctionnent sur des données jusqu'à 32 bits dans des registres 32 bits avec des adresses 32 bits. En fait, là où ils se chevauchent, ils représentent le exactement les mêmes instructions - c'est seulement l'instruction encoding qui diffère, et le CPU a effectivement deux frontaux de décodage différents à son pipeline qu'il peut basculer entre. Pour plus de clarté, je vais maintenant délibérément éviter les Termes " 32 bits "et" 16 bits"...

Les instructions ARM ont des encodages de 4 octets de largeur fixe qui nécessitent un alignement de 4 octets. Les instructions de pouce ont des encodages de longueur variable (2 ou 4 octets, maintenant appelés "étroits" et "larges") nécessitant un alignement de 2 octets - la plupart des instructions ont des encodages de 2 octets, mais bl et blx ont toujours eu des encodages de 4 octets*. Le bit vraiment confus est venu dans ARMv6T2, qui a introduit la "technologie Thumb-2". Thumb-2 englobait non seulement l'ajout d'une charge plus d'instructions au pouce (principalement avec des encodages de 4 octets) pour l'amener presque à la parité avec ARM, mais aussi 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'une toute nouvelle syntaxe d'assemblage (UAL, " Unified Langage d'assemblage") qui a remplacé les syntaxes ARM et Thumb séparées précédentes et a permis d'écrire du code une fois 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 de la "technologie 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 instruction.

Ainsi, les nouveaux encodages de 4 octets (et ceux ajoutés plus tard dans les révisions ARMv7) sont toujours Instructions Thumb - l'aspect "Thumb-2" d'entre eux est qu'ils peuvent avoir encodages de 4 octets, et qu'ils peuvent (principalement) être exécutés conditionnellement via it (et, je suppose, que leurs menmonics ne sont définis

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

45
répondu Notlikethat 2015-02-26 10:08:08

En plus de la réponse de Notlikethat , et comme cela fait allusion, 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 ne prend en charge qu'un seul jeu d'instructions - A64.

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

Beaucoup / la plupart des instructions A64 peuvent fonctionner sur les 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 du jeu d'instructions T32.

10
répondu unixsmurf 2017-05-23 12:17:42