Имея такую простую 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?).
stdcall
соглашение о вызовах (исключения включаютwsprintf()
и т. Д., Которые вместо этого должны использоватьcdecl
). Вstdcall
вызываемый, а не вызывающий, является отвечает за очистку стека вызовов. Итак, в этом случае при вызовеMessageBoxA
вы должны поместить 16 байтов в стек для его 4 параметров, а затемMessageBoxA
вытолкнет эти 16 байтов из стека, когда он вернется.@16
указывает, что параметры занимают 16 байтов. - person Remy Lebeau   schedule 23.02.2021