본문 바로가기

프로그래밍

x86 호출 방식에 대한...

요즘 함수의 call 방식에 대한 여러 자료를 보고 있다. 엄밀히 말하면, x86_64에 대한 지원을 하기 위해서이다.
일전에 게시한 게시물 중에 함수 invoke에 대한 자료의 연장이라고 할수 있다.

이는, x86에서는 함수의 인자를 모두 stack에 저장하여 호출하는 방식이라, 보다 간편하게 구현이 가능
하였으나, x86_64에서는 이 부분이 많이 바뀌어 이를 구현하는데 만만치 않음을 실감하고 있다.

일반적인 상황이라면 클라이언트가 x86 기반으로 운영되는 상황이라, 서버도 x86으로 구현하는 상황에서는
문제가 되지 않지만 개발자의 욕심이라는게 또 그렇지만은 않은지라..

더 더욱, 나는 x86_64 기반의 리눅스를 사용하고 있어 x86으로만 구현된 함수의 찜찜함 때문이랄까~

정리하자면,
   x86은 모든 함수가 stack을 통해 전달되어 지고,
            반환값은 정수의 경우는 eax를 통해, 실수인 경우만 별도의 reg에 저장되어 오지만

   x86_64인 경우는
           Microsoft x86_64 인 경우
                 정수는 RCX, RDX, R8, R9 reg를 통해, 실수인 경우는 XMM0. XMM1, XMM2, XMM3 을 통해

           AMD x86_64 인 경우
                 정수는 RDI, RSI, RDX, RCX, R8 와 R9를 통해, 실수인 경우  XMM0, XMM1, XMM2, XMM3,
                 XMM4, XMM5, XMM6 그리고, XMM7를 통해

           전달되며 그 외의 인자는 stack을 통해 전달되도록 되어 있다.
           반환값은 x86과 마찬가지로 rax와, 실수인 경우는 별도의 reg로 저장된다.

http://en.wikipedia.org/wiki/X86_calling_conventions

어떻게 구현하는게 효율적일지 상당한 고민을 하고 있다.. 일단, 인자의 자료형이 실수인지 정수인지에
따라서 전달 방식이 x86에 비해 복잡해졌다는게 가장 큰 고민이라면 고민이 될것이다~

강제로, reg를 사용못하게 할수는 있지만 그래도, 실수는 reg를 사용한다는게.. ㅠ.ㅠ

어떠한 구현 방법이 좋을지~??