2013-06-18 2 views
11

여기 레지스터 로딩 코드 목록이다 :GCC 인라인 어셈블리 : 인텔 x86_64의 상 제약을 등록

EAX
ㄴ EBX
C ECX
D EDX
S ESI
D 에디
은 상수 값 (0 ~ 31)
q, r 동적 할당 레지스터 (아래 참조)
g eax, ebx, ecx, edx 또는 variabl 메모리
에서 E는 EAX와 64 비트 정수로 결합 EDX는

을 (긴 걷고 사용) 그러나 인텔 I386에 대한 제약 조건을 등록한다. 내 질문은 어디에 같은 인텔 x86_64 시스템의 등록 제한을 찾을 수 있습니다 :

? % r10
? % r8
? % rdx

등등.

답변

9

기계 특정 제약 조건은 gcc manual에 섹션이 있습니다. 추한 세부 사항은 config/i386/constraints.md에 있습니다.

일부 제약은 q%eax, %ebx, %ecx, 32 비트 모드 %edx이며, 예를 들어, - 64 서로 다른 의미를 갖는다; 64 비트 모드에서는 일반적인 용도의 정수 레지스터이며 본질적으로 r 제약 조건과 동일합니다. a 같은 특정 레지스터 이름은 지금 %raxd, %rdx에 참조 등

있다, 그러나, %r8 ... %r15에 대한 특별한 제약이나 이름. 인라인 어셈블리 및 제약 조건 사용에 대한 우수 (x86-64 관련) 자습서가 here입니다.

+0

정말 감사합니다, 당신은 기능을 사용할 수 있습니다, 그러나, r10 같은 레지스터에 대한 r8

을 같은 제약 조건을 제공 예를 들어 Local Reg Vars

호출되지 않습니다. 나는 오랜 시간 동안 구글은 아무것도 얻지 못한다. 나는 그것이 존재하지 않는다는 것을 지적하는 어떤 것을 발견 할 수 없다. –

7

GCC는

#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;         \ 
})