Порядок, в котором аргументы помещаются в стек на x64

#x86-64 #abi

#x86-64 #abi

Вопрос:

В каком порядке аргументы x64 помещаются в стек:

  • в системе V ABI?
  • в Windows ABI?

Я пишу библиотеку Java FFI, которая использует динамически генерируемые заглушки, и эти заглушки зависят от этого порядка.

Я подозреваю, что он «плавает первым», но не уверен.

Комментарии:

1. Вы знаете, что аргументы также передаются в регистрах? Не только в стеке?

2. @jcoder Да, это так. Я уже обработал случай всех целочисленных аргументов в регистрах.

3.Не знаю System V ABI, но IIRC, в Windows 64 регистры с плавающей запятой передаются в xmm0 до xmm3 вместо rcx , rdx , r8 и r9 , поэтому, если аргументы есть (int, double, int, double) , они передаются в rcx , xmm1 , r8 и xmm3 соответственно. Остальное, если таковое имеется, передается в стек, как описывает @MargaretBloom в своем ответе.

Ответ №1:

Из System V ABI, раздел 3.2.3:

После назначения регистров аргументы, переданные в память, помещаются в стек в обратном (справа налево) порядке.

Windows x64 ABI очень неформальный, и он не определяет порядок параметров стека.
Однако из Википедии и здравого смысла мы можем прийти к тому же выводу, что и выше:

Дополнительные аргументы помещаются в стек (справа налево)