2013-06-18 6 views
11

Hier ist die Liste von Registerladecodes:GCC inline assembly: registrieren Einschränkungen auf Intel x86_64

a eax
b ebx
c ECX
d EDX
S esi
D EDI-
I konstanter Wert (0 bis 31)
q, r dynamisch zugeordnetes Register (siehe unten)
g eax, ebx, ecx, edx oder varabl e im Speicher
A EAX und EDX in eine 64-Bit-Ganzzahl kombiniert

(lange longs benutzen), aber dies ist für die Intel i386 Einschränkungen registrieren. Meine Frage ist, wo finde ich die Register-Einschränkungen von Intel x86_64-System, wie:

? % r10
? % r8
? % rdx

und so weiter.

Antwort

9

Die maschinenspezifischen Einschränkungen haben einen Abschnitt in der gcc manual - die hässlichen Details sind in config/i386/constraints.md gefunden.

einige Einschränkungen haben unterschiedliche Bedeutungen für x86-64, z.B. q ist %eax, %ebx, %ecx, %edx in 32-Bit-Modus; Im 64-Bit-Modus ist es ein Allzweck-Ganzzahlregister - und im Wesentlichen dasselbe wie die r-Einschränkung. Spezielle Register Namen wie a jetzt beziehen sich auf %rax, d-%rdx usw.

Es gibt jedoch keine speziellen Einschränkungen oder Namen für %r8 .. %r15. Es gibt ein hervorragendes (x86-64 spezifisches) Tutorial zur Inline-Assemblierung und Verwendung von Constraints here.

+0

Vielen Dank. Ich Google das für lange Zeit, aber nichts bekommen. Ich kann sogar nichts finden, was darauf hinweist, dass es nicht existiert. –

7

GCC bietet keine solche Einschränkung für die Register wie r10, r8

aber Sie können Local Reg Vars

Zum Beispiel genannt, eine Funktion verwenden,

#define syscall4(number, _1, _2, _3, _4) \ 
({           \ 
    int64_t ret;       \ 
    register int64_t r10 asm("r10") = _4; \ 
    __asm__ volatile      \ 
    (          \ 
     "syscall\n\t"      \ 
     : "=a"(ret)      \ 
     : "a"(number),     \ 
      "D"(_1),      \ 
      "S"(_2),      \ 
      "d"(_3),      \ 
      "r"(r10)      \ 
     : "memory", "rcx", "r11"   \ 
    );          \ 
    ret;         \ 
})