머리가 멍청해 봐도봐도 까먹는 까마귀 같은 저... -_-;;
그냥 가장 흔한 인자 전달과 리턴 값 처리만 찾아서 정리했습니다.
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 |