Ich muss mit den Stapeln auf dieser Architektur rumspielen 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 http://en.wikipedia.org/wiki/X64Wie unterscheidet sich die x64-Architektur von x86
Antwort
Alle Register in der CPU von x86 32-Bit, wo, wie für 64-Bit seines 64-Bit :)
Wenn Sie Zeiger arithematic mit dann sizeof() wird verschiedene Ergebnisse ergeben, und dies würde eine Inkrementierungsoperation sein.
Ich glaube, Sie können detaillierte Informationen über die zwei Architecuturen auf Intel-Website erhalten und auch die Instruktions-Set Hervorhebung neue Anweisungen hinzufügen mit 64-Bit-Prozessoren.
Tatsächlich haben Sie in x86 32-Bit-, 16-Bit- und 8-Bit-Allzweckregister. Außerdem haben Sie 8 64-Bit-MMX-Register und 8 128-Bit-SSE-Register. In x64 haben Sie all das Plus: Alle 32-Bit-Register können auf 64 Bit erweitert werden, Sie haben 8 weitere GPRs und 8 weitere SSE-Register. –
Für den Anfang von der Größe eines Zeigers ist 8 Bytes anstelle von 4.
Register können als auch 64-Bit-Werte halten.
Auch auf OS-Ebene gibt es oft viele Unterschiede. Beispielsweise unter Windows haben Sie Dinge wie Dateisystemumleitung und Registrierungsumleitung (WOW64) beim Ausführen von 32-Bit-Anwendungen auf einem 64-Bit-Windows-Betriebssystem.
Grundsätzlich ist die Wortgröße 8 Bytes statt 4 Bytes. Dies führt zu vielen Unterschieden. x64-Assembly unterscheidet sich etwas von der x86-Assembly (verschiedene Registernamen usw.) –
Es gibt auch mehr GPRs. – Joey
Ich glaube, der Wikipedia-Artikel, den Sie verlinkt haben, bietet eine angemessene Menge einleitender Informationen. Wenn Sie an den spezifischen Details der Unterschiede im Long-Modus interessiert sind, können Sie eine der offiziellen Referenzen konsultieren: Intel® 64 and IA-32 Architectures Software Developer's Manuals.
In x86 gibt es 8 32-Bit-Register, in x64 sind die Register jeweils 64 Bits und es gibt 8 weitere von ihnen. Die 128-Bit-SSE-Register sind 128 Bits in beiden, aber auf x86 gibt 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 Bits verwenden, indem Sie ihren 32-Bit-Namen (beginnend mit einem 'e') anstelle ihres 64-Bit-Namens (beginnend mit einem 'r') verwenden meistens gleich.
http://en.wikipedia.org/wiki/X86#x86_registers
Oder wenn Sie ein paar wirklich schwere Lesung (wie 1000s Seiten ...)
http://www.intel.com/products/processor/manuals/index.htm ich durch ein paar hundert Seiten dieser Handbücher gelesen und viel gelernt, wirklich gute Sachen .
+1 zum Lesen dieser 1000 Seite;) – Rev
Zusätzlich zu der Tatsache, dass die allgemeinen Register sind jetzt 64-Bit statt 32, 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 (mit Ausnahme von 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.
Die x87 FPU ist genauso wie in x86-64 in x86 verfügbar. Sie können es wie gewohnt verwenden. –
Es ist verfügbar, sicher, aber als veraltet markiert. Von AMD: "Trotz der langen Laufzeit in der x86-Architektur ist die x87-Arithmetik im 64-Bit-Modus veraltet." http://developer.amd.com/documentation/articles/pages/62720069.aspx – asveikau
hmm ... Dann muss ich missverstehen, was veraltet bedeutet :-). Was heißt das? –
Während ich glaube nicht, dass dies speziell eine x86 vs x64 Antwort ist, kann es relevant sein.
Unter Linux, unter x86 ist der Stack entweder 4k oder 8k, während unter x64 16k ist.
Um, Stapel? Meinst du das Physische (E/RSP-Stack)?Wenn ja, dann ist meine Antwort relevant:
Auf x86 verwendet fast jeder C-Compiler den cdecl
Aufruf-Standard. Ich kann mich nicht an die Details erinnern, aber es war konsistent zwischen Compilern und Betriebssystemen. Im Grunde werden Argumente auf den Stapel geschoben (von rechts nach links) und dann wird der Rückgabewert in eax eingegeben und der Aufrufer ist für die Bereinigung verantwortlich.
Auf x86-64 obwohl, alles ist 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.
sehen: http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention
Alle hier Antworten die Änderungen in der Registersatz erwähnen, die ich hier der Vollständigkeit halber Liste werden:
- Alle bestehenden 32-Bit-Universalregister erweitert werden 64 Bits (
EAX
wirdRAX
erweitert und so weiter) - 8 neue 64-Bit-Allzweckregister (
R8
durchR15
) - 8 neue 128-b es SSE-Register (
XMM8
durchXMM15
)
Darüber hinaus gibt es in Adressierungsmodi Änderungen:
- CS, DS, ES und SS flach sind. Das heißt, ihre Basis ist
0x0
und ihr Limit ist0xffffffffffffffff
. FS und GS können eine Basis über 32 Bits haben. - Deskriptoren in GDT, LDT und IDT haben sich geändert. Sie haben 8 Byte im 64-Bit-Modus
- Ein nicht zusammenhängender Adressraum. Im 32-Bit-Modus beträgt der lineare Adressraum
0x0
bis0xfffffff
. Im 64-Bit-Modus wird der lineare Adressraum von0x0
zu0x00007ffffffff
und von0xffff800000000000
zu0xffffffffffffffff
aufgeteilt. Im Grunde gibt es nur 48 Bits der Adresse, und die Adresse ist vorzeichenerweitert auf 64 Bits. - Ein neuer Paging-Modus.
Verschiedene Anweisungen wurden entfernt:
- Ein Byte
INC
Anweisungen mit Codierung40+rw
und40+rd
. Das4x
Byte wurde dasREX
Präfix. - Anweisungen zum Laden der Segment-Register, die jetzt flach sind:
LDS
,LDS
,LSS
.
Es gibt mehr Unterschiede, die ich einfach aus der Spitze meines Kopfes erinnern kann. Ich füge sie hinzu, wenn ich an etwas mehr denken kann.
+1: Vollständigste Antwort – greyfade
Eine Sache, die Leute nicht erwähnt haben, ist die Adressierung, im 32-Bit-geschützten Modus haben die Segmentregister Sinn 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. In der Regel tun Betriebssysteme dies jedoch nicht.
Eine andere Sache, die Leute hier nicht erwähnt haben, ist, dass wenn Sie ein 32-Bit-Register im 64-Bit-Modus ändern, wird die obere Hälfte gelöscht, aber nur wenn Sie die 32-Bit ändern. 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.
Für den Stapel 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.
- 1. Warum unterscheidet sich {} + [] von ({} + [])?
- 2. Wie unterscheidet sich Hashtable
- 3. Wie unterscheidet sich die Dichte von ggplot2 von der Dichtefunktion?
- 4. Wie unterscheidet sich mpi_file_write von mpi_file_write_all?
- 5. GCC: Wie unterscheidet sich März von Mtune?
- 6. Wie unterscheidet sich Gitlab von Github?
- 7. Wie unterscheidet sich das Armspeichermodell von ia64?
- 8. Wie unterscheidet sich ArrayListMultimap von LinkedListMultimap?
- 9. Wie unterscheidet sich << von +?
- 10. Wie unterscheidet sich MegaStore von BigTable?
- 11. Wie unterscheidet sich Gurke von JUnit?
- 12. Wie unterscheidet sich die Zeitzone EST von EST5EDT?
- 13. Wie unterscheidet sich die Belastung in Ruby von require?
- 14. Wie unterscheidet sich die MSMQ-Bindung in WCF von WsHttp?
- 15. Farbe von NavBar unterscheidet sich von Hintergrundfarbe
- 16. Winforms ComboBox Höhe unterscheidet sich von ItemHeight
- 17. ProgressDialog Nachrichtentext unterscheidet sich von AlertDialog
- 18. Unterscheidet sich die Netzwerkbandbreite auf Azure-Websites von virtuellen Maschinen?
- 19. Warum unterscheidet sich die Skalierung von Steuerungen zwischen PCs?
- 20. Perl Mantisse unterscheidet sich von anderen Doppel
- 21. Identischer Code unterscheidet sich von verschiedenen Quellen
- 22. Warum unterscheidet sich die Kameraansicht in optix von OpenGL?
- 23. Warum git AuthorDate unterscheidet sich von CommitDate?
- 24. Tomcat JVM-Version unterscheidet sich von JAVA_HOME
- 25. Wie unterscheidet sich das traditionelle Gerätetreiberprogramm?
- 26. Wie unterscheidet sich Dispatcher vom Hintergrund-Thread?
- 27. Gradle: Wie unterscheidet sich die Reihenfolge der Abhängigkeiten?
- 28. Subprozess pid unterscheidet sich von ps output
- 29. Warum unterscheidet sich std :: uint32_t von uint32_t?
- 30. php curl - Ergebnis unterscheidet sich von Browser
Was müssen Sie genau wissen? Es gibt viele Unterschiede, von denen einige nur relevant sind, wenn Sie einen Bootloader schreiben, einige, die relevant sind, wenn Sie ein Betriebssystem oder einen Treiber schreiben, und einige, die relevant sind, wenn Sie Ihren Code beschleunigen möchten, oder du schreibst eine Funktion in Assembly – jalf
@jalf Er hat bereits angedeutet, dass er etwas funky mit Stapeln machen will, das nicht von C entlarvt wird. Für seinen speziellen Fall ist das vielleicht legitim und vielleicht nicht, aber in einem breiteren Kontext - warum so eine Anti-Lern-Haltung? Er versucht, seine Fähigkeiten in einem Bereich zu erhöhen. Wenn er eine neue höhere Sprache lernen würde, würdest du sagen: "Bah, das ist so ein Nischenbereich, willst du das nicht wirklich machen?" – asveikau
Ich würde jalf Kredit dafür geben, dass ich die Frage in die Richtung lenken wollte, die Scott J braucht, und nicht, um die Frage zu entmutigen. –