데이터를 레지스터에 저장한다고 할 때 register 키워드를 사용하게 된다.
C언어로 레지스터 사용을 요청하는데, 실제로 그 명령이 레지스터로 갈 지, 스택 메모리로 갈 지는 컴파일러의 마음이다.
register <자료형> <변수명 >
👉 가능하면 이 변수는 레지스터로 넣어줘
register uint64_t *num asm ("rax") = (uint64_t *) num_;`
__attribute__((always_inline))
static __inline int64_t syscall (uint64_t num_, uint64_t a1_, uint64_t a2_,
uint64_t a3_, uint64_t a4_, uint64_t a5_, uint64_t a6_) {
int64_t ret;
register uint64_t *num asm ("rax") = (uint64_t *) num_;
register uint64_t *a1 asm ("rdi") = (uint64_t *) a1_;
register uint64_t *a2 asm ("rsi") = (uint64_t *) a2_;
register uint64_t *a3 asm ("rdx") = (uint64_t *) a3_;
register uint64_t *a4 asm ("r10") = (uint64_t *) a4_;
register uint64_t *a5 asm ("r8") = (uint64_t *) a5_;
register uint64_t *a6 asm ("r9") = (uint64_t *) a6_;
// 실제 넣는 과정
__asm __volatile(
"mov %1, %%rax\\n"
"mov %2, %%rdi\\n"
"mov %3, %%rsi\\n"
"mov %4, %%rdx\\n"
"mov %5, %%r10\\n"
"mov %6, %%r8\\n"
"mov %7, %%r9\\n"
"syscall\\n"
: "=a" (ret)
: "g" (num), "g" (a1), "g" (a2), "g" (a3), "g" (a4), "g" (a5), "g" (a6)
: "cc", "memory");
return ret;
}
num을 rax 레지스터에, a1을 rdi 레지스터에... 넣는 과정