ARM-Befehlsgröße vs. Befehlscodierung

Ich kann den Unterschied zwischen "Befehlsgröße" und "Befehlscodierung" nicht verstehen, insbesondere bei ARM- und Thumb-ISAs, wie hier erläutert :

Können wir sagen, dass die Befehlsgröße 32 Bit beträgt, die Codierung jedoch 16 Bit für Thumb-1 ISA und 32 Bit für Thumb-2 beträgt?

Bezieht sich „Codierung“ auf den vom Assembler generierten Binärcode oder auf die interne MCU-Architektur und ist für den Softwareentwickler nicht sichtbar?

ARM-Anweisungsgröße

"Instruction Encoding" ist ein Verweis auf die spezifische Definition dessen, welcher Opcode was tut; In anderen Kontexten könnte es als "Befehlssatz" bezeichnet werden, und wie Sie sehen, gibt es in der breiten ARM-Familie mehrere.

Antworten (2)

Aus meiner Sicht sind sie beide "miteinander verbunden". Die alten CPU-Befehlssätze hatten alle die gleiche Größe, jetzt ist die Befehlsgröße mit diesem Thumb-Modus variabel, wobei einige der Bits (Codierung) des Befehls auch seine Größe bestimmen. Es wird in dem von Ihnen bereitgestellten Link erklärt: Die CPU ruft die erste Hälfte (16 Bit) der Anweisung ab und verzweigt dann, ob es sich um eine 32-Bit-Anweisung handelt, sie ruft die zweite Hälfte (zusätzliche 16 Bit) davon ab, wenn es sich nur um eine 16-Bit-Anweisung handelt führt sie aus ohne die zweite Hälfte zu holen.

Bei dieser Art von Befehlen ist auch der Programmierspeicher im Vergleich zu Befehlen mit fester Größe kleiner.

Daumen ist 16-Bit-Anweisungen.

thumb2 sind Erweiterungen von thumb. Die ersten 16 Bits werden dekodiert und als Erweiterung von thumb2 angesehen, dann werden zusätzliche 16 Bits an Anweisungen verwendet. Sie sind alle 32-Bit. Diese müssen nicht 32-Bit-ausgerichtet sein, zusammen mit Daumen müssen sie 16-Bit-ausgerichtet sein.

Kodierung bedeutet den Maschinencode. siehe Beispiele unten

arm-Anweisungen Sowohl die traditionellen aarch32-arm-Anweisungen als auch die aarch64-Bit-Anweisungen sind 32-Bit-Anweisungen und müssen 32-Bit-ausgerichtet sein. Sie sind völlig inkompatible Befehlssätze zueinander.

Die 32-Bit-Arm-Anweisungen und die 32-Bit-Daumen2-Erweiterungen sind nicht kompatibel. Die Funktionen von jedem sind nicht vollständig kompatibel, es kann, wie wir unten sehen, ein xor mit drei Registern geben, aber die Codierung ist nicht dieselbe. Der vereinheitlichte Befehlssatz (Assemblersprache) macht dies komplizierter und nicht weniger.


Thumb-Anweisungen sind alle 16-Bit (ja, sogar bl, das sind zwei unabhängige Anweisungen).

thumb2-Erweiterungen waren früher undefinierte Daumenbefehle. Sie bestehen alle aus insgesamt 32 Bits, betrachten sie jedoch als Befehle mit zwei Halbwörtern variabler Länge. Müssen nicht an 32-Bit-Grenzen ausgerichtet werden.

armv6-m fügte die ersten paar-drei Dutzend thumb2-Erweiterungen hinzu.

armv7-m (und armv7) hat über 100 weitere hinzugefügt.

armv8-m nicht zu verwechseln mit armv8 fügen Sicherheitsfunktionen hinzu, greifen aber überall von einer ganzen bis zu einer teilweisen Teilmenge der thumb/thumb2-Anweisungen zurück. Welche Anweisungen unterstützt werden, ist kernspezifisch.

armv7 und älter sind die traditionellen Armanweisungen.

armv8 64-Bit-Anweisungen sind 32 Bit, verwenden aber die 64-Bit-Register.

Die armv8-Prozessoren mit 64-Bit-Befehlen haben einen 32-Bit-armv7-Kompatibilitätsmodus aarch32 und unterstützen die armv7-Befehlssätze.

Die Befehle aarch64 (32 Bit) und aarch32 (32 Bit) sind nicht miteinander kompatibel, Arm hat die Befehlssätze überarbeitet.

armv4t ist der Ort, an dem arm (Advanced Risk Machines) von Acorn abgelöst hat. thumb-Anweisungen wurden mit armv4t eingeführt, was im Grunde das arm7tdmi ist, auch arm wird in diesem Kern unterstützt.

armv5t unterstützte auch den Daumen-Befehlssatz sowie Arm. denke arm9

armv6 unterstützt Arm und Daumen, aber nicht thumb2. denke arm11

armv6-m ist für Mikrocontroller der cortex-m0 erste Satz von hier hinzugefügten thumb2-Erweiterungen. unterstützt nicht nur den Armdaumen mit Daumen2-Verlängerungen

Armv7 ist der Anfang des Cortex-a, Stützarm und Daumen mit Daumen2-Verlängerungen.

armv7-m vollständige Ergänzung von thumb2-Verlängerungen hier hinzugefügt, kein Armstützdaumen mit nur thumb2-Verlängerungen. Kortex-m3,m4,m7

In armv8 beginnt der 64-Bit-Befehlssatz, unterstützt im Allgemeinen traditionelles Arm, die neuen aarch64-Bit-Befehle (beide sind 32-Bit) und durch aarch32 thumb mit thumb2-Erweiterungen. Es gibt angeblich nur 32-Bit-armv8s, die nur den aarch32-Teil und nicht den aarch64-Teil enthalten. habe diese nicht weiterverfolgt, um zu sehen, ob sie existieren.

armv8-m die neuen Sicherheitsmikrocontroller. eine ganze oder eine Teilmenge von thumb und eine ganze oder eine Teilmenge von thumb2-Erweiterungen, hängt vom Kern ab. siehe cortex-m22,m23,m32 einige Zahlen wie diese.

Armanweisungen wurden auf fast allen Ebenen von arm1 bis armv7 hinzugefügt.

dann gibt es die Gleitkomma-Befehlssätze, die sich im Laufe der Zeit verändert haben, einige sind nur unterschiedliche Syntaxen für dieselben Befehle, andere nicht.

Die Codierung ist der Maschinencode und für den Softwareentwickler sehr gut sichtbar, wenn er/sie dies wünscht. Viele Leute schauen nie hin, obwohl sie es manchmal tun sollten, sollten sich aber bewusst sein, dass sie es können und wie es geht.

zum Beispiel für diese Funktion

unsigned int fun ( unsigned int a, unsigned int b, unsigned int c )
{
    return (b^c);
}

dies sind verschiedene mögliche Implementierungen in den verschiedenen Befehlssätzen.

traditioneller Arm armv7 und älter, 32-Bit-Anweisungen

00000000 <fun>:
   0:   e0210002    eor r0, r1, r2
   4:   e12fff1e    bx  lr

traditioneller Daumen (hat kein Drei-Register-XOR, kein Platz), 16-Bit-Anweisungen (am kompatibelsten, funktioniert auf den meisten Kernen)

00000000 <fun>:
   0:   4051        eors    r1, r2
   2:   0008        movs    r0, r1
   4:   4770        bx  lr

thumb2-Erweiterung, 32 Bit, zunächst als 16 Bit decodiert, daher variable Länge (eor ist thumb2-Erweiterung, bx lr ist thumb)

00000000 <fun>:
   0:   ea81 0002   eor.w   r0, r1, r2
   4:   4770        bx  lr

aarch64, 64-Bit-Befehlssatz, 32-Bit-Befehle, nicht kompatibel mit dem vorherigen Arm-Befehlssatz.

0000000000000000 <fun>:
   0:   4a020020    eor w0, w1, w2
   4:   d65f03c0    ret
Ich vermute, dass sich hier irgendwo die richtige Antwort versteckt, aber obwohl ich der Ablehnung nicht ganz zustimme, muss die Organisation, die klare Darstellung der tatsächlichen Antwort und die allgemeine Lesbarkeit verbessert werden, bevor sie als gute Antwort angesehen werden kann.
die Antworten wurden vor den Code am Ende geschrieben und sind es immer noch. neu geschrieben.
Nein, sind sie nicht. Sie haben eine breit angelegte Umfrage, achten aber herzlich wenig auf die konkret gestellten Fragen Eine gute Antwort hebt die Antworten auf die eigentlichen Fragen hervor, ergänzt sie vielleicht um zusätzliche Informationen, verbirgt die Antworten aber nicht in dem Maße, wie Sie sie haben. Die Gesamtqualität ist hier sehr niedrig.
du kannst es gerne umschreiben die fragen sind thumb 16 bit ich habe ja geantwortet, sind thumb2 32 bit, antworte ja. was bedeutet codieren. beantwortet und Beispiele gezeigt. bitte poste deine antwort
Codierung für den Programmierer nicht sichtbar, nicht wahr, aber der Programmierer muss wissen, wie er sie finden/sehen kann.
ziemlich genau die Fragezeichen aus dem OP abgedeckt. Was habe ich verpasst?