Программа MessageBox на сборке x86

Имея такую ​​простую MessageBox программу:

NULL          EQU 0                             ; Constants
MB_DEFBUTTON1 EQU 0
MB_DEFBUTTON2 EQU 100h
IDNO          EQU 7
MB_YESNO      EQU 4

extern _MessageBoxA@16                          ; Import external symbols
extern _ExitProcess@4                           ; Windows API functions, decorated

global Start                                    ; Export symbols. The entry point

section .data                                   ; Initialized data segment
 MessageBoxText    db "Do you want to exit?", 0
 MessageBoxCaption db "MessageBox 32", 0

section .text                                   ; Code segment
Start:
 push  MB_YESNO | MB_DEFBUTTON2                 ; 4th parameter. 2 constants ORed together
 push  MessageBoxCaption                        ; 3rd parameter
 push  MessageBoxText                           ; 2nd parameter
 push  NULL                                     ; 1st parameter
 call  _MessageBoxA@16

 cmp   EAX, IDNO                                ; Check the return value for "No"
 je    Start

 push  NULL

 call  _ExitProcess@4

У меня вопрос:
Разве мы не должны добавить соответствующее значение в регистр esp после вызова MessageBoxA для восстановления стека в его предыдущее состояние? Если да, то при вызове push MessageBoxCaption, сколько нужно добавить в регистр esp (4?).


person Daros911    schedule 22.02.2021    source источник
comment
В x86 почти каждый Win32 API использует stdcall соглашение о вызовах (исключения включают wsprintf() и т. Д., Которые вместо этого должны использовать cdecl). В stdcall вызываемый, а не вызывающий, является отвечает за очистку стека вызовов. Итак, в этом случае при вызове MessageBoxA вы должны поместить 16 байтов в стек для его 4 параметров, а затем MessageBoxA вытолкнет эти 16 байтов из стека, когда он вернется. @16 указывает, что параметры занимают 16 байтов.   -  person Remy Lebeau    schedule 23.02.2021