Ich habe hier einige zusätzliche Aspekte:
Betrachten Sie die Operation "a = b / c" x86 würde dies als implementieren
mov eax,b
xor edx,edx
div dword ptr c
mov a,eax
Als zusätzlichen Bonus der Div-Anweisung enthält edx den Rest.
Ein RISC-Prozessor würde erfordern, zuerst die Adressen von b und c zu laden, b und c aus dem Speicher in Register zu laden, die Division durchzuführen und die Adresse von a zu laden und dann das Ergebnis zu speichern. Dst, src-Syntax:
mov r5,addr b
mov r5,[r5]
mov r6,addr c
mov r6,[r6]
div r7,r5,r6
mov r5,addr a
mov [r5],r7
Hier wird es normalerweise keinen Rest geben.
Wenn Variablen über Zeiger geladen werden sollen, können beide Sequenzen länger werden, obwohl dies für das RISC weniger wahrscheinlich ist, da möglicherweise ein oder mehrere Zeiger bereits in ein anderes Register geladen sind. x86 hat weniger Register, sodass die Wahrscheinlichkeit, dass sich der Zeiger in einem von ihnen befindet, geringer ist.
Vor-und Nachteile:
Die RISC-Befehle können mit umgebendem Code gemischt werden, um die Befehlsplanung zu verbessern. Dies ist bei x86 weniger möglich, da dies stattdessen (je nach Reihenfolge mehr oder weniger gut) in der CPU selbst funktioniert. Die obige RISC-Sequenz ist in einer 32-Bit-Architektur typischerweise 28 Byte lang (7 Befehle mit jeweils 32 Bit / 4 Byte Breite). Dies führt dazu, dass der Off-Chip-Speicher beim Abrufen der Anweisungen (sieben Abrufe) mehr funktioniert. Die dichtere x86-Sequenz enthält weniger Anweisungen, und obwohl ihre Breite variiert, sehen Sie dort wahrscheinlich auch durchschnittlich 4 Bytes / Anweisung. Selbst wenn Sie Anweisungs-Caches haben, um dies zu beschleunigen, bedeutet sieben Abrufe, dass Sie im Vergleich zum x86 an anderer Stelle ein Defizit von drei haben, das Sie ausgleichen müssen.
Die x86-Architektur mit weniger Registern zum Speichern / Wiederherstellen bedeutet, dass wahrscheinlich Thread-Switches durchgeführt und Interrupts schneller als bei RISC verarbeitet werden. Mehr Register zum Speichern und Wiederherstellen erfordern mehr temporären RAM-Stapelspeicher für Interrupts und mehr permanenten Stapelspeicher zum Speichern von Thread-Zuständen. Diese Aspekte sollten x86 zu einem besseren Kandidaten für die Ausführung von reinem RTOS machen.
Persönlicher finde ich es schwieriger, RISC-Assemblys als x86 zu schreiben. Ich löse dieses Problem, indem ich die RISC-Routine in C schreibe, den generierten Code kompiliere und ändere. Dies ist vom Standpunkt der Codeproduktion effizienter und vom Standpunkt der Ausführung wahrscheinlich weniger effizient. Alle diese 32 Register, um den Überblick zu behalten. Bei x86 ist es umgekehrt: 6-8 Register mit "echten" Namen machen das Problem leichter handhabbar und geben mehr Vertrauen, dass der erzeugte Code wie erwartet funktioniert.
Hässlich? Das liegt im Auge des Betrachters. Ich bevorzuge "anders".