본문 바로가기

My Study/Programming&Theory

Calling Convention Process for AMD 64 Bit

머리가 멍청해 봐도봐도 까먹는 까마귀 같은 저... -_-;;


그냥 가장 흔한 인자 전달과 리턴 값 처리만 찾아서 정리했습니다.

http://www.osronline.com/ddkx/kmarch/64bitamd_7qqv.htm


매개변수 전달

파라미터 타입

 Floating Point

 처음부터 4개의 파라미터 - XMM0 ~ XMM3. 그 이후로 스택 사용!

 Integer

 처음부터 4개의 파라미터 - RCX, RDX, R8, R9. 그 이후로 스택 사용!

 Aggregates(8,16,32, or 64 bits) and __m64

 처음부터 4개의 파라미터 - RCX, RDX, R8, R9. 그 이후로 스택 사용!

 Aggregates(other)

 포인터. 처음부터 4개의 파라미터 - RCX, RDX, R8, R9. 그 이후로 스택 사용!

 __m128  포인터. 처음부터 4개의 파라미터 - RCX, RDX, R8, R9. 그 이후로 스택 사용!  


예제) 1 - 모두 정수

func1(int a, int b, int c, int d, int e);

a => RCX, b => RDX, c => R8, d => R9, e => 스택에 push.. ( [rsp+0x20] )


예제) 2 - 모두 실수

func2(float a, double b, float c, double d, float e);

a => XMM0, b =>  XMM1, c =>  XMM2, d =>  XMM3, e => 스택에 push..


예제) 3 - ints와 floats 섞음..

func3(int a, double b, int c, float d);

a => RCX, b => XMM1, c => R8, d => XMM3


예제) 4 - __m64, __m128, 그리고 aggregates

func4(__m64 a, _m128 b, struct c, float d);

a => RCX, b => RDX, c => R8, d => XMM3


리턴 값

64 bits(__m64 타입 포함) 값이 들어갈 수 있는 대부분의 리턴 값은 RAX 레지스터를 통해 반환되어 진다. 하지만 __m128, __m128i, __m128d, floats, double 같은 타입은 XMM0 레지스터를 통해 리턴되어 진다. 만약 리턴 값이 64 bits안에 속하지 않는다면 호출자는 첫번째 인자를 사용해 리턴 값을 받은 포인터를 할당해 넘겨줘야한다.

'My Study > Programming&Theory' 카테고리의 다른 글

Visual Studio 에서 %n 서식 문자 사용하기  (0) 2012.05.21
ELF 파일의 PLT, GOT  (3) 2012.04.26
Windows rand() 랜덤 비율  (2) 2012.02.14
ARM 명령어 공부  (6) 2012.01.27
BlockInput Function  (3) 2012.01.20