2013-08-08 21 views
5

Widziałem w kilku miejscach, że konwencje wywoływania Microsoft dla platform x64 zostały zawężone do jednego: Caller czyści stos (cdecl), a parametry są przekazywane w kombinacji stosu i rejestrów (nie wchodzę w dokładne szczegóły tutaj). Zakładam, że jeśli jest to konwencja wywołująca system operacyjny, prawdopodobnie wszystkie pozostałe kompilatory kierujące do systemu Windows (np. Mingw-w64) również ją śledzą.Konwencja wywoływania na x64

Czy ta konwencja wywołująca jest prawdziwa także na innych głównych platformach (x64 Linux itp.)? Czy Linux wciąż używa wielu konwencji wywołań, czy nawet tylko jednego, ale innego? Czy GCC lub Clang pozwala na wiele konwencji połączeń na Linuksie x64?

+6

Te szczęśliwe dni wkrótce się zakończą. Microsoft dodaje konwencję wywoływania __vectorcall. Do sześciu wartości "__m128" przekazywanych przez rejestry SSE2. –

Odpowiedz

8

Właśnie znalazłem odpowiedź here i here. Zasadniczo Windows robi to w jeden sposób, wszyscy robią to w inny sposób, ale każda platforma robi to tylko w jedną stronę (w przeciwieństwie do wielu sposobów na platformę z x86)

+1

Nie wskazując palcem po obu stronach, ale można by pomyśleć, że po wszystkich konwencjach wywoływania bólu x86, uzgodnienie standardu byłoby priorytetem w przypadku x64 – Basic