есть прога под виндой собраная VC но не в этом суть наскоко я помню вариаций у fastcall нет? или есть? тоесть параметры ecx, eax, edx остальные через стек идут а в этой программке есть другие вариации esi, eax, дальше через стек eax, ecx дальше через стек встречаються и другие причем они от функции к функции прыгают вопрос где это задаеться или как это выбирает компилер или это не fastcall а что то другое?
файл скомпилированый под VC и параметры гуляют от функции к функции при этом функции не от классов тоесть это не функции классов где первый параметр всегда ecx - this
реализации фасткалл отличаются между компилерами непереносимо. кроме того, оптимизатор может изменить структуру кода и очень. ов позволяет редактировать способы передачи и возврата и еще кое что. в том числе и создавать свои способы (pragma aux), что позволяет использовать его для связи объектников в разных идеологиях
Это назвается whole program optimization. Даёт отмашку компилятору использовать любые подходящие способы для передачи аргументов. http://msdn.microsoft.com/en-us/magazine/cc301698.aspx
В копилку фастколлов: TopSpeed c/c++ for Dos передавал 3 параметра через ax, bx, dx. Ultra c/c++ for os-9000 передает только 1-й параметр через eax, остальные через стек.
__fastcall Microsoft specific argument-passing order: The first two DWORD or smaller arguments are passed in ECX and EDX registers; all other arguments are passed right to left. Дело не в том, чем прога собрана, а в том, чем компилирована. У Microsoft (VC) только через регстры ecx и edx, других вариантов нет, есть только вариации с короткими и длинными аргументами, если первый или второй аргумент длинный, то он идет через стек, а его место в регистре занимает короткий аргумент, если он есть.
вот как раз таки у майкрософта (VC) и получаеться что по другому сделано я незнаю как оно там сомтимизировало функции но есть и по два регистра в паре остальное через стек есть и по три четыре регистара если аргументов 3 или 4 так что возможно что это не fastcall а просто оптимизация VC которая предпочла выбрать на свое усмотрение как передать параметры
у gnu gcc 3.4.5 при использовании __fastcall параметры передаются также, как и в msvs 2008. проверял. Причем, в gcc параметры передаются в одних и тех же регистрах (ecx - первый, edx - второй. дальше - в стеке) независимо от уровня оптимизации.
А насчет именования функций. допусим, функция Код (Text): int __fastcall test(int a, int b); и в gcc 3.4.5 и в msvs 2008 будет называтся одинаково: Код (Text): @test@8