64bit 체제에서는 어떻게 인자전달을 할까?
전에 글에서 16비트 체제에선 ax,bx,cx,dx,si,di,bp,sp로 썼다는 것을 봤을 것이다.
32비트 체제로 넘어가서는 앞에 e(extend)를 넣어주어 eax,ebx,ecx,edx,esi,edi,ebp,esp로 사용한다.
그리고 64비트 체제에서는 앞에 r을 붙여 rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp로 사용한다.
Ι................Ι................Ι................Ι................Ι................Ι................Ι................Ι................Ι
(<- 8비트 ->) -> EX ) AL,BL,CL,DL,SIL,DIL,BPL,SPL
(<------16 비트 ------>) -> EX ) AX, BX, CX, DX, SI, DI, BP, SP
(<---------------- 32비트 ---------------->) -> EX ) EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
(<------------------------------------- 64비트 -------------------------------------->)
L> RAX, RBX, RCX, RDX, RSI, RDI, RBP,RSP
64 비트 체제 전에는 그냥 파라미터를 전달했지만, 64비트 체제에서는 레지스터리를 통해서 파라미터를 전달한다.
64비트 체제에서는 리눅스와 윈도우의 파라미터 전달 방식이 나뉘어 집니다.
리눅스에서는 파라미터를 전달할 때 6개 레지스터를 사용한다.
RDI : 첫번째 인자
RSI : 두번째 인자
RDX : 세번째 인자
RCX : 네번째 인자
R8 : 다섯번째 인자 -> 추가된 범용 레지스터
R9 : 여섯번째 인자 -> 추가된 범용 레지스터
인자가 7개 이상일 경우부터는 스택을 같이 사용한다.
윈도우는 리눅스와 달리 레지스터를 4개까지 사용한다.
RCX : 첫번째 인자
RDX : 두번째 인자
R8 : 세번째 인자 -> 추가된 범용 레지스터
R9 : 네번째 인자 -> 추가된 범용 레지스터
리눅스와 마찬가지로 5개 이상일 경우 스택과 같이 사용한다.