Nasm - функции Winapi, которые не выдают свои параметры - PullRequest
1 голос
/ 19 сентября 2019

Я писал программу на Nasm и обнаружил, что хотя функции winapi, такие как CreateProcessA или GetModuleFileNameA, извлекают свои аргументы из стека после завершения, printf этого не делает.

Есть ли причина для этого?И еще важнее: есть ли другие функции winapi, которые не выталкивают элементы из стека?Потому что моя программа работает неправильно, и я хочу быть уверен, что ни одна из них не вызвана не всплывающими значениями.

1 Ответ

5 голосов
/ 19 сентября 2019

99% процентов экспортируемых функций Windows используют соглашение о вызовах stdcall .В 32-битном x86 это создает меньший, более эффективный код, потому что вызываемый восстанавливает стек.

Функции, которые принимают переменное число аргументов, не могут использовать stdcall, потому что только вызывающая сторона знает, сколько существует аргументов и, следовательно, вызывающая сторона имеетдля восстановления стека.

printf - это не функция Windows, это функция библиотеки C, и большая часть библиотеки C использует соглашение о вызовах cdecl *1009*, когда вызывающая сторона восстанавливает стек.Предоставляемые Windows функции печати, такие как wsprintf, также являются cdecl.Можно предположить, что любая функция API, заканчивающаяся ... в качестве последнего параметра, использует cdecl.

...