Скомпилированный код сборки x86 gcc: поведение fastcall
Я работаю над некоторыми x86
задачи анализа программы сборки, и я пытаюсь выяснить поведение fastcall.
Хотя на 32-bit x86
платформа, стек определяется для передачи параметров функции в вызывающем преобразовании. Тем не менее, я заметил, что многие вызовы функций действительно используют два регистра, eax
а также edx
передать первые два параметра функции.
Например, вот (упрощенный) пример, найденный в libgcrypt 1.6.1
:
mov 0x24(%esp), %eax
...
mov 0x1c(%esp), %edx
call mul_n
...
mul_n:
...
mov %eax, 0x20(%esp)
mov %edx, 0x24(%esp)
Как видите, зарегистрируйтесь eax
а также edx
используются для передачи параметров. Мое наблюдение заключается в том, что эти два регистра всегда используются для передачи первых двух параметров.
Обратите внимание, что я использую gcc
скомпилировать код. Тем не менее, я могу только найти fastcall
определение Microsoft
компилятор, который использует регистр ecx
(не eax
!) и edx
передать параметры.
Итак, вот мой вопрос: есть ли четкое определение такого gcc
оптимизация? Я просто не могу найти информативные источники...