Я не пробовал это на Годболте, но ты мог.
аю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
после звонка.
Что именно мне не хватает?