LINUX.ORG.RU

x86[-64] Си ABI


0

1

Правильно ли я понимаю, что на x86 в Си, при использовании соглашений вызова stdcall и cdecl, агрегированные типы данных размером до 64 бит возвращаются в EAX+EDX, то есть это, фактически, unsigned long long, а размером более 64 бит - через первый(неявный) параметр-указатель на предварительно выделенное место(скажем, на стеке) под выходное значение, который и возвращается.

И, особенно, что интересует - правильно ли, что на x86-64 такие возвращаемые значения передаются аналогично x86, за исключением такой детали(незначительной), что значение до 64 бит передается в RAX(а больше - аналогично x86).

Что еще интересует - значения агрегированных типов со строго заданным alignment при передаче параметров в функцию на стеке тоже выравниваются в соответствии с ним?

Я тут пишу продвинутый FFI для CL, который, кроме прочего, маршалит агрегированные типы данных:

http://github.com/Lovesan/virgil

И вот я решил в нем добавить by-value передачу значений таких типов в функции, соответственно возникли вышеописанные вопросы.

Ответ на: комментарий от mv

нашел там про возврат значения, не нашел про то, выравниваются ли параметры на стеке(каждый отдельно. т.е. понятно что вся их куча выровнена по 16, там, байтам. я имею ввиду - безопасно ли стаскивать со стека, например, 16байтный параметр с помощью MOVAPS(или MOVDQA), если его тип определен как __align(16) )

Love5an
() автор топика

ты еще что-то дельное пишешь. респект

namezys ★★★★
()
Ответ на: комментарий от Love5an

выравниваются ли параметры на стеке

The size of each argument gets rounded up to eightbytes (therefore the stack will always be eightbyte aligned). The basic types are assigned their natural classes.

Стр. 17-18.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.