Я не пробовал это на Годболте, но ты мог.

аюIDA Pro Book, На странице 86, обсуждая соглашения о вызовах, автор показывает пример соглашения о вызовах cdecl, которое устраняет необходимость для вызывающей стороны очищать аргументы из стека. Я воспроизводю фрагмент кода ниже:

; demo_cdecl(1, 2, 3, 4); //programmer calls demo_cdecl
mov [esp+12], 4 ; move parameter z to fourth position on stack
mov [esp+8], 3 ; move parameter y to third position on stack
mov [esp+4], 2 ; move parameter x to second position on stack
mov [esp], 1 ; move parameter w to top of stack
call demo_cdecl ; call the function

Автор продолжает говорить, что

в приведенном выше примере компилятор предварительно выделил место для хранения аргументов demo_cdecl в верхней части стека во время пролога функции.

Я собираюсь предположить, что естьsub esp, 0x10 в верхней части фрагмента кода. В противном случае вы просто повредите стек.

Позже он говорит, что вызывающей стороне не нужно настраивать стек, когда завершается вызов demo_cdecl. Но, безусловно, должен бытьadd esp, 0x10 после звонка.

Что именно мне не хватает?

Ответы на вопрос(2)

Ваш ответ на вопрос