Ich muss mich mit den Stacks auf dieser Architektur herumschlagen und bin wirklich ein n00b hier. Irgendwelche Hinweise zum Lesen von Themen / Google-Suchen, die ich tun kann. Ich suche, wie diese Architekturen sich grundlegend voneinander unterscheiden. etwas mehr als der Wikipedia-Artikel zu diesem Thema Ссылка
In x86 gibt es 8 32-Bit-Register, in x64 sind die Register jeweils 64 Bits und es gibt 8 weitere. Die 128-Bit SSE-Register sind 128 Bits in beiden, aber auf x86 sind es 8 von ihnen, während in x64 16 von ihnen sind. Auch einige Anweisungen wurden in x64 geschnitten.
Im x64-Modus können Sie die Register immer noch als 32-Bit verwenden, indem Sie ihren 32-Bit-Namen (beginnend mit einem 'e') anstelle ihres 64-Bit-Namens (beginnend mit einem 'r') verwenden das gleiche.
Oder wenn Sie etwas sehr schweres Lesen wollen (wie 1000 Seiten ...)
Ссылка Ich habe ein paar hundert Seiten dieser Handbücher durchgelesen und viel, sehr gutes Zeug gelernt.
Alle Antworten hier erwähnen die Änderungen im Registersatz, die ich hier zur Vollständigkeit auflisten werde:
EAX
wird auf RAX
usw. erweitert) R8
bis R15
) XMM8
bis XMM15
) Es gibt auch Änderungen in den Adressierungsmodi:
0x0
und ihr Limit ist 0xffffffffffffffff
. FS und GS können eine Basis über 32 Bits haben. 0x0
bis 0xfffffff
. Im 64-Bit-Modus wird der lineare Adressraum von 0x0
nach 0x00007ffffffff
und von 0xffff800000000000
nach 0xffffffffffffffff
aufgeteilt. Im Grunde gibt es nur 48 Bit Adresse, und die Adresse ist vorzeichenerweitert auf 64 Bit. Verschiedene Anweisungen wurden entfernt:
INC
Anweisungen mit der Codierung 40+rw
und 40+rd
. Das 4x
Byte wurde zum REX
Präfix. LDS
, LDS
, LSS
. Es gibt mehr Unterschiede, an die ich mich einfach von ganz oben erinnern kann. Ich füge sie hinzu, wenn ich an etwas mehr denken kann.
Ich glaube, dass der Wikipedia-Artikel, den Sie verlinkt haben, eine angemessene Menge an einleitenden Informationen enthält. Wenn Sie sich für die spezifischen Details der Unterschiede im Long-Modus interessieren, können Sie eine der offiziellen Referenzen konsultieren: Intel® 64 und Intel® 64 / IA-32 Architekturen Software-Entwicklerhandbücher .
Äh, stapeln? Meinst du das Physische (E / RSP-Stack)? Wenn ja, dann ist meine Antwort relevant:
Auf x86 verwendet fast jeder C-Compiler den aufrufenden Standard cdecl
. Ich kann mich nicht an die Details erinnern, aber es war konsistent zwischen Compilern und Betriebssystemen. Im Grunde werden Argumente auf den Stack geschoben (von rechts nach links) und dann wird der Rückgabewert in eax eingegeben und der Aufrufer ist für die Bereinigung verantwortlich.
Aber auf x86-64 ist alles ziemlich vermasselt. Die Windows-Aufrufkonvention unterscheidet sich von Linux (die meisten Nicht-Linux-Unix-ähnlichen Betriebssysteme haben sich an den ursprünglichen C-Aufrufstandard gehalten, was jedoch zu mehr Verschrobenheit führt). Ich kann mich nicht erinnern, wie sie sich unterscheiden, aber sie tun es. Schlagen Sie "verschiedene Aufrufkonventionen x86-64" in Google nach und Sie werden die Details davon finden.
siehe: Ссылка
Für Anfänger ist die Größe eines Zeigers 8 Bytes statt 4.
Register können auch 64-Bit-Werte enthalten.
Auch auf OS-Ebene gibt es oft viele Unterschiede. Beispielsweise unter Windows haben Sie Dinge wie Dateisystemumleitung und Registrierung Umleitung (WOW64) beim Ausführen von 32-Bit-Anwendungen auf einem 64-Bit-Windows-Betriebssystem.
Eine Sache, die die Leute nicht erwähnt haben, ist die Adressierung, im 32 Bit geschützten Modus haben die Segmentregister eine Bedeutung und die SS DS und CS können jeweils einen anderen Offset haben. Im geschützten 64-Bit-Modus kann das nicht passieren. Die einzigen Register, die einen Offset haben können (aber keine Begrenzung), sind FS und GS. Das bedeutet, dass im ds: [ebx] und cs: [ebx] im 32-Bit-Modus ein anderer Wert verwendet werden kann, der eine gewisse Gemeinheit erlaubt. Aber normalerweise machen dies Betriebssysteme nicht.
Eine andere Sache, die hier nicht erwähnt wurde, ist, dass wenn Sie ein 32-Bit-Register im 64-Bit-Modus modifizieren, es die obere Hälfte löscht, aber nur, wenn Sie die 32-Bit modifizieren. z.B. mov eax, 0 führt dazu, dass rax 0 ist, während mov ax, 0 die obere Hälfte nicht berührt. Es ist also ein bisschen schwierig, wenn man sich die Montage anschaut.
Was den Stack angeht, ist es mehr eine Frage des Betriebssystems als der CPU. Die Windows-ABI für x64 unterscheidet sich von der von allen anderen (Linux, Mac ...). Wahrscheinlich müssen Sie sich genauer mit "Aufrufkonventionen" und ABIs (binäre Anwendungsschnittstelle) beschäftigen. Auf x64 muss der RSP jedoch beim Eintritt in eine Funktion 16 Byte ausgerichtet sein, weshalb Sie oft Dummy-rsp-Dekremente sehen. Dies stellt sicher, dass 16-Byte-Werte auf dem Stapel immer ausgerichtet sind. Aber auf CPU-Ebene ist es egal, RSP dekrementiert, Push ist immer noch "sp- = word_size; ram [sp] = value". Oh, und auf x64 RSP hat kein Limit, auf x32 können Sie der CPU sagen, dass der Stack-Pointer nicht unter eine bestimmte Adresse gehen kann, so dass Stack-Zugriff auf niedrigere Adressen einen Fehler verursacht.
Ich bin mir nicht sicher, was Sie genau fragen. Vielleicht würde eine spezifischere Frage eine spezifischere Antwort erlauben.
Alle Register in der CPU von x86 sind 32-bit, wofür 64-Bit sein 64-Bit ist:)
Wenn Sie mit Zeiger arithematisch arbeiten, dann wird sizeof () unterschiedliche Ergebnisse ausgeben, und dies würde auch eine Inkrementierungsoperation sein.
Ich denke, Sie können detaillierte Informationen über die zwei Architekturen auf der Intel-Website erhalten und sogar den Befehlssatz, der neue Anweisungen hervorhebt, die mit 64-Bit-Prozessoren hinzugefügt werden.
Zusätzlich zu der Tatsache, dass die Allzweckregister nun 64-Bit statt 32 sind, gibt es auch neue Register: r8, r9, r10, r11, r12, r13, r14 und r15. Die Tatsache, dass es mehr Register gibt, führt auch dazu, dass die meisten Compiler Pass-by-Register-Aufrufkonventionen für Funktionsaufrufe verwenden (außer solchen mit Varargs), während in x86 die meisten Compiler alle Argumente an den Stack übergeben.
Die x87 FPU ist ebenfalls veraltet und bevorzugt SSE.
Obwohl ich nicht glaube, dass dies speziell eine x86- oder x64-Antwort ist, kann es relevant sein.
Unter Linux ist der Stack unter x86 entweder 4k oder 8k, während er unter x64 16k ist.