2013-06-18 17 views
11

Poniżej znajduje się lista rejestru kodu obciążenia:GCC rolki montaż: ograniczenia rejestrów Intel 86_64

eax
b ebx
C ecx
d EDX
S ESI
D edi
I stała wartość (0 do 31)
q, r dynamicznie przydzielony rejestr (patrz poniżej)
g eax, ebx, ecx, edx lub variabl e pamięci
EAX i EDX połączono w 64-bitowej liczby całkowitej (zastosować długie long)

Jest to jednak ograniczenia rejestrów dla procesorów i386. Moje pytanie brzmi: gdzie mogę znaleźć ograniczenia rejestru systemu Intel x86_64, takie jak:

? % r10
? % r8
? % rdx

i tak dalej.

Odpowiedz

9

Ograniczenia specyficzne dla maszyny mają sekcję gcc manual - brzydkie szczegóły można znaleźć w config/i386/constraints.md.

pewne ograniczenia mają różne znaczenia, za x86-64 np q jest %eax, %ebx, %ecx, %edx w trybie 32-bitowym; w trybie 64-bitowym jest to dowolny rejestr całkowitoliczbowy ogólnego przeznaczenia - i zasadniczo taki sam jak ograniczenie więzów r. Konkretne rejestry nazwy takie jak a teraz odnieść się do %rax, d do %rdx itp

Istnieją jednak żadne szczególne ograniczenia lub nazwy %r8 .. %r15. Istnieje doskonały samouczek na temat wbudowanego składania i używania ograniczeń w języku x86-64: here.

+0

Dzięki bardzo. I Google to przez długi czas, ale nic nie dostaję. Nawet nie mogę znaleźć czegoś, co wskazywałoby, że nie istnieje. –

7

GCC nie przewiduje takiego ograniczenia dla rejestrów jak r10, r8

Jednakże, można użyć funkcji o nazwie Local Reg Vars

Na przykład

#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;         \ 
}) 
Powiązane problemy