Любое соглашение о вызове Я знаком с ручками одного float
так же, как и double
. (Не то, чтобы все вызывающие соглашения обрабатывали их одинаково, только в пределах одного соглашения о вызове нет diff).
Некоторые проходят в стек и возвращаются в x87 st (0).
Некоторые пропускают/возвращают в регистры XMM. (Связанный с этим факт: соглашение о вызове SysV не имеет регистров XMM, не содержащих вызовов, поэтому любой вызов функции означает пролитие всех значений FP, которые были в реальном времени в регистрах.)
См. Ссылки на документы ABI в теге x86.
Обратите внимание, что в 32-разрядное соглашения о вызовах, которые проходят double
с в память о колл-стек, они берут в два раза больше пространства в виде целых чисел/указателей/float
с. Таким образом, double
занимает два слота стека.
Он может также иметь требование выравнивания 8B, ведущее к заполнению. Из-за этого они все еще не являются «специальными»: любой другой объект 8B с требованием выравнивания 8B (например, структура с членом alignas(8)
) будет считаться одним и тем же.
'nasm' - это ассемблер, он не определяет соглашение о вызове. Это определено соответствующим ABI для вашей среды, о котором вы не сказали. Для linux и mac посмотрите [Документ SysV] (http://stackoverflow.com/questions/18133812/where-is-the-x86-64-abi-документированный), для просмотра окон в [msdn] (https: //msdn.microsoft.com/en-us/library/zthk2dkh.aspx). – Jester
Соглашения о вызове/ссылки ABI doc в [x86 tag wiki] (http://stackoverflow.com/tags/x86/info). О, вот что мой ответ по связанному вопросу уже говорит ... не проверял, чтобы увидеть, что связал Шут: P –
Вопрос нарушается, потому что он предполагает, что существует такая вещь, как * "соглашение о вызовах *. Нет. Ответчик должен был быть более конкретным относительно *, который * вызывал соглашение, на которое они ссылались. У каждого из них разные правила. Как только вы узнаете о вызывающем соглашении, на которое ссылаетесь, вы можете легко найти его. –