전에 글에서 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개 이상일 경우 스택과 같이 사용한다.