Unterschiede: 1. Andere Registerzuordnung, x64 hat nur 8 Register; 3. Andere Funktionsaufrufe; 5. Andere Stack-Frames; Zeiger, während x86 ebp als Stapelrahmenzeiger verwendet. 6. Die Rechengeschwindigkeit von x64 ist höher als die von x86.
Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.
0x01: Unterschiede in der Registerzuordnung
(1) 64-Bit hat 16 Register, 32-Bit nur 8. Aber die ersten 8 Bits von 32-Bit haben unterschiedliche Namen, nämlich e_, während die ersten acht Bits von 64-Bit r anstelle von e verwenden, was r_ ist. Die mit e beginnende Registerbenennung kann weiterhin direkt auf die unteren 32 Bits des entsprechenden Registers angewendet werden, während die übrigen Registernamen von r8 bis r15 reichen und die unteren Bits jeweils mit d, w und b bezeichnet werden
(2) 32-Bit verwendet den Stapelrahmen als Speicherort für die übergebenen Parameter, während 64-Bit Register verwendet und rdi, rsi, rdx, rcx, r8, r9 jeweils als Parameter 1–6 und rax als Rückgabewert verwendet
(3) 64-Bit hat keinen Stack-Frame-Zeiger, 32-Bit verwendet ebp als Stack-Frame-Zeiger, 64-Bit hebt diese Einstellung auf und rbp wird als allgemeines Register verwendet; unterstützt einige Formen der PC-bezogenen Adressierung, während 32-Bit nur JMP unterstützt. Diese Adressierungsmethode wird nur verwendet, wenn: pop erweitert die movq-Reihe von mov und pushq und popq Wird zum Betreiben von Quad-Worten verwendet.
Ergänzung: (1) movabsq ist keine 32-Bit-Erweiterung, es ist eine völlig neue Anweisung. Wird verwendet, um einen 64-Bit-Literalwert direkt in einem 64-Bit-Register zu speichern. Da movq nur 32-Bit-Werte speichern kann, wird eine neue Anweisung wie diese hinzugefügt
(2) 64-Bit-Assembly-Code fügt möglicherweise vor ret einen rep hinzu. Der rep hier hat nur aus Gründen der Zweckmäßigkeit keine praktische Bedeutung Der Grund für den AMD-Prozessor besteht darin, den Ort zu vermeiden, an dem jmp direkt ret erreicht, wodurch der Prozessor schneller läuft. Siehe oben);callq speichert eine 8-Bit-Rückgabeadresse auf dem Stapel
(2) Viele Funktionen haben keine Stapelrahmen mehr und nur diejenigen, die nicht alle lokalen Variablen in Registern platzieren können, weisen Platz auf dem Stapel zu( 3 ) Die Funktion kann bis zu 128 Byte Stapelspeicher erhalten. Auf diese Weise kann die Funktion Informationen auf dem Stapel speichern, ohne den Stapelzeiger zu ändern (dh der 128-Byte-Bereich unter RSP kann im Voraus verwendet werden. Dieser Bereich wird als rote Zone bezeichnet. In x86-64 ist er verfügbar
(4) Es gibt keinen Stapelrahmenzeiger mehr und die Stapelposition hängt jetzt vom Stapelzeiger ab. Die meisten Funktionen weisen zu Beginn des Aufrufs den gesamten erforderlichen Stapelspeicher zu und lassen dann den Stapelzeiger unverändert(5) Einige Register sind als vom Aufrufer gespeicherte Register konzipiert und müssen gespeichert werden, wenn ihre Werte benötigt werden ändern und anschließend wiederherstellen.
0x04: Unterschiede in der Parameterübergabe
(1) 6 Register werden zur Parameterübergabe verwendet (siehe oben); (2) Die restlichen Register werden wie zuvor übergeben (jedoch bezogen auf rsp ist ebp nein). Wird länger als Stapelrahmenzeiger verwendet und der 7. Parameter beginnt bei rsp, der 8. Parameter beginnt bei rsp+8 usw. (3) Beim Aufruf bewegt sich rsp um 8 Bits nach unten (in der Rücksprungadresse gespeichert). , die Registerparameter haben keine Auswirkung, der 7. und die folgenden Parameter sind jetzt der 7. ab RSP+8, der 8. ab RSP+16 usw.
0x05: Der Unterschied in den Stapelrahmen
In vielen Fällen wird der Stapelrahmen nicht mehr benötigt. Wenn beispielsweise keine andere Funktion aufgerufen wird und das Register ausreicht, um Parameter zu speichern, muss nur die Rücksprungadresse gespeichert werden.
Situationen, in denen ein Stapelrahmen benötigt wird:
(1) Es gibt zu viele lokale Variablen und nicht genügend Register;
(2) Einige lokale Variablen sind Arrays oder Strukturen;
(3) Die Funktion verwendet den Adressoperator, um zu berechnen Wert einer lokalen Variablenadresse;
(5) Die Funktion muss den Status einiger vom Aufrufer gespeicherter Register speichern ; Aber jetzt hat der Stapelrahmen oft eine feste Größe, die zu Beginn des Funktionsaufrufs festgelegt wird. Während des gesamten Aufrufs bleibt der obere Zeiger des Stapels unverändert, sodass der entsprechende Wert durch Hinzufügen eines Offsets bedient werden kann EBP wird nicht mehr als Stack-Frame-Zeiger benötigt. Obwohl wir oft denken, dass es keinen „Stapelrahmen“ gibt, muss jeder Funktionsaufruf eine Rücksprungadresse haben, die auf den Stapel gelegt wird. Wir können uns diese Adresse auch als „Stapelrahmen“ vorstellen, da sie auch den Status des Aufrufers speichert. 0x06: Unterschiedliche Betriebsgeschwindigkeiten Verwandte Empfehlungen: „Linux-Video-Tutorial“
Die Datenbreite der 64-Bit-CPU beträgt 64 Bit, und der 64-Bit-Befehlssatz kann 64-Bit-Datenanweisungen ausführen, was bedeutet, dass der Prozessor 64-Bit-Daten extrahieren kann zu einem Zeitpunkt, der höher als 32-Bit ist. Eine Verdoppelung der Leistung führt theoretisch zu einer Leistungssteigerung um den Faktor 1.
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen x64 und x86 unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!