2009-11-18 7 views
40

Wo finde ich die Namen der neuen Register für die Assembly auf dieser Architektur?Wie lauten die Namen der neuen X86_64-Prozessoren?

Ich beziehe mich auf Register in X86 wie EAX, ESP, EBX, etc. Aber ich würde sie in 64bit mögen.

Ich glaube nicht, dass sie die gleichen sind, als wenn ich meinen C-Code zerlege, ich bekomme r statt e.

+0

Jungs Wie kann ich sagen, was Register Parameter korreliert, wenn ein Systemaufruf zu tun. Ich habe gelesen und Dokumentation und habe keine klare Antwort gefunden. – Recursion

+0

Beachten Sie, dass die alten oberen 8 Bit-Register (ah, bh usw.) nicht mehr für alle Opcodes funktionieren. z.B. 'inc ah' ist in x64 nicht gültig, weil dieser Opcode für eines der neuen 64bit-Register wiederverwendet wurde. – Johan

+1

@Johan: Beachten Sie auch, dass mit dem Präfix REX die Register-Codes für ah bh ch dh die neuen Byte-Register wird sil dil bpl spl –

Antwort

57

Die alten 32-Bit-Register sind auf 64 Bits erweitert worden, die r Register (rax, rbx, rsp und so weiter).

Darüber hinaus gibt es einige zusätzlichen Universalregister r8 durch r15 die auch als (zum Beispiel) zugegriffen werden kann r8d, r8w und r8b (das untere 32-Bit-Doppelwort, 16-Bit-Wort, und 8-Bit-Byte beziehungsweise).

Der High-Byte der alten 16-Bit-Register ist nach wie vor zugänglich, unter vielen Umständen, wie ah, bh, und so weiter, aber dies scheint nicht für die r8 durch r15 Register der Fall zu sein. Es gibt einige neue Befehlskodierungen, speziell diejenigen mit dem REX Präfix, die nicht auf diese hohen Bytes zugreifen können, aber andere sind immer noch frei, sie zu verwenden.

Zusätzlich gibt es einige neue SSE-Register, xmm8 obwohl xmm15. Die Register eip und flags wurden ebenfalls auf und rflags erweitert. Weitere Informationen finden Sie in den Artikeln wikipedia page und MSDN.

Ob diese im asm Schlüsselwort für einen bestimmten C-Compiler unterstützt werden, konnte ich nicht sagen. Welche kleine Montag mich (und es einen Tag zu einem Jahr) in der Montage durchgeführt wird, statt C.

+0

wofür steht "R"? –

+24

@ int80, keine Ahnung. Vielleicht bedeutet "e" erweitert und "r" bedeutet _really_ erweitert :-) – paxdiablo

+1

ich weiß, dass "e" für erweiterte (von 16bit) steht. aber r? aber Ihre Antwort ist nur logisch%) –

8

X64 erweitert die 32-Bit-Register für allgemeine Zwecke wie folgt:

EAX -> RAX 
EBX -> RBX 
ECX -> RCX 
EDX -> RDX 
ESI -> RSI 
EDI -> RDI 
ESP -> RSP 
EBP -> RBP 

X64 fügt auch die folgende 64-Bit-Allzweckregister:

R8, R9, R10, R11, R12, R13, R14, R15 

Zusätzlich SSE ist Teil der X64-Spezifikation, so dass die XMM0-xmm15 Vektorregister sind ebenfalls verfügbar

Sie können einige grundlegende Informationen über die Architektur unter Wikipedia/X86-64 finden oder auf der Intel-Website gehen.

79

Die MSDN documentation enthält Informationen zu den x64-Registern.

x64 erweitert die x64 8 Allzweck- Register 64-Bit zu sein, und fügt 8 neue 64-Bit-Register. Die 64-Bit-Register haben Namen beginnend mit "r", so dass für Beispiel die 64-Bit-Erweiterung von eax Rax genannt wird. Die neuen Register sind mit den Namen r8 bis r15.Die unteren 32 Bits, 16 Bits und 8 Bits jedes Registers sind direkt in Operanden adressierbar. Dazu gehören Register, wie esi, deren untere 8 Bits zuvor nicht adressierbar waren. Die folgende Tabelle gibt die Assemblernamen für die unteren Teile von 64-Bit-Registern an.

64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits 
============================================================== 
rax    | eax   | ax   | al 
rbx    | ebx   | bx   | bl 
rcx    | ecx   | cx   | cl 
rdx    | edx   | dx   | dl 
rsi    | esi   | si   | sil 
rdi    | edi   | di   | dil 
rbp    | ebp   | bp   | bpl 
rsp    | esp   | sp   | spl 
r8    | r8d   | r8w   | r8b 
r9    | r9d   | r9w   | r9b 
r10    | r10d   | r10w   | r10b 
r11    | r11d   | r11w   | r11b 
r12    | r12d   | r12w   | r12b 
r13    | r13d   | r13w   | r13b 
r14    | r14d   | r14w   | r14b 
r15    | r15d   | r15w   | r15b 
+0

Das ist klar, aber der untere 8-Bit-Modus scheint für 'r8' ~ 'r15' auf meiner Intel x86-64 CPU ungültig zu sein, obwohl er für die anderen 8 Allzweckregister funktioniert. Auch die 'rax' ~' rdx'-Unterstützung für den Zugriff auf die 8 Bits im 'high'-Modus bedeutet Zugriff auf die höchstwertigen 8 Bits des 16-Bit-Modus unter Verwendung von' ah' ~ 'dh'. –

+0

@EricWang: Hast du versucht, 'mov ah, r8b' oder sowas zu benutzen? Sie können kein High-8-Register mit einem REX-Präfix verwenden. 'REX mov ah, 0' ist' mov spl, 0' und so weiter (die Kodierungen für 'AH/CH/DH/BH' bedeuten' spl/bpl/sil/dil', wenn ein REX-Präfix vorhanden ist (in dieser Reihenfolge) im Maschinencode) –

4

Wo finde ich die Namen der neuen Register für die Montage auf dieser Architektur.

Im Prozessor Hand "Intel 64 und IA-32 Architektur Software Developer Manual Volume 1: Grundsätzliche Architektur", z.B. version 253665-053US:

  • Suche nach "Register"
  • das erste Spiel der Index "3.4 GRUNDPROGRAMM EXECUTION REGISTER"
  • zwei Artikel unter "3.4.1.1 Allzweckregister in 64-Bit-Modus"
  • ist

auf diesem Abschnitt:

, wenn eine 64-Bit-Operandengröße angegeben wird: RAX, RBX, RCX, RD X, RDI, RSI, RBP, RSP, R8-R15 sind verfügbar. R8D-R 15D/R8-R15 repräsentieren acht neue Universalregister.

Erinnerung: 64-Bit-Modus ist der "normale" Modus in x86-64. Der andere Hauptmodus ist der "Kompatibilitätsmodus", der IA32 emuliert.

Wenn Sie suchen halten für „registrieren“ auf der TOC, werden Sie auch Abschnitte über finden Register für Floating-Point und SIMD im Handbuch verstreut „-Nummer Crushing“:

  • 8.1.2 - x87 FPU Daten Register (STX)
  • 9.9.2 - MMX Register
  • 10.2.2 - XMM-Register
  • 14.1.1 - 256-Bit breite SIMD-Register Support (HMM)

Es gibt viel mehr Kontrollregister, die verschiedene Nebenwirkungen haben und in der Regel nicht beschrieben werden können, außer Sie wollen diese Effekte (und erfordern oft Ring 0). Diese sind in "Volume 3 System Programming Guide - 2.1.6 System Register" zusammengefasst, was mehr für OS-Entwickler ist.

Ein guter empirischer Ansatz ist info all-registers in GDB auszuführen: How to print register values in gdb?

Verwandte Themen