2009-11-23 5 views
7

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

+2

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

+0

@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

+0

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. –

Antwort

0

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.

+0

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. –

1

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.

+0

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.) –

+0

Es gibt auch mehr GPRs. – Joey

3

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.

9

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

+1 zum Lesen dieser 1000 Seite;) – Rev

0

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.

+0

Die x87 FPU ist genauso wie in x86-64 in x86 verfügbar. Sie können es wie gewohnt verwenden. –

+0

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

+0

hmm ... Dann muss ich missverstehen, was veraltet bedeutet :-). Was heißt das? –

0

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.

2

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

8

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 wird RAX erweitert und so weiter)
  • 8 neue 64-Bit-Allzweckregister (R8 durch R15)
  • 8 neue 128-b es SSE-Register (XMM8 durch XMM15)

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 ist 0xffffffffffffffff. 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 bis 0xfffffff. Im 64-Bit-Modus wird der lineare Adressraum von 0x0 zu 0x00007ffffffff und von 0xffff800000000000 zu 0xffffffffffffffff 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 Codierung 40+rw und 40+rd. Das 4x Byte wurde das REX 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

+1: Vollständigste Antwort – greyfade

1

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.

Verwandte Themen