В 1970-х я порезался на ассемблере мэйнфреймов IBM 370, а в начале 1980-х у меня был оригинальный IBM P C с Microsoft Macro Assembler. В то время это было продано как отдельный продукт, и поставляется с очень полезным руководством. Сейчас я нахожусь на карантине и хочу вернуться к языку ассемблера.
Я скачал сообщество Visual Studio 2019, в которое включен MASM, и для интерактивной отладки я использую x64dbg. Мой P C является 64-битным, поэтому я использую ассемблер ML64, который поставляется вместе с VS.
Мой вопрос касается соглашения о вызовах для Windows функций API.
В наши дни все функции Windows, похоже, ориентированы на C ++, и, в моем понимании, соглашение о вызовах отражает машинный код, который генерируется C ++ для вызова этих функций. Я хочу разработать шаблон, который я смогу использовать для всех будущих вызовов, поэтому он закодирован для несуществующей функции apifun c. Эта вымышленная функция имеет пять параметров.
; command to assemble is:
; ml64 samplecall.asm /link /subsystem:windows /defaultlib:kernel32.lib /entry:Start
extrn ExitProcess: PROC
extrn apifunc: PROC ; any hypothetical api function with five parameters
.data
;
parm1 dword ? ; these could be any required data type
parm2 dword ?
parm3 dword ?
parm4 dword ?
parm5 dword ?
;
.code
Start PROC
;
sub rsp, 32 ; room on the stack for first four parameters, 8 bytes each
;
lea rcx, parm1 ; pass the first four parameters in registers
lea rdx, parm2
lea r8, parm3
lea r9, parm4
lea rax, parm5 ; address of the fifth and last parameter
push rax ; put it on the stack
call apifunc ; call the hypothetical function
;
call ExitProcess
;
Start ENDP
End:
Этот код выглядит даже отдаленно правильным? Когда управление возвращается из apifun c, есть ли у меня какие-либо указания на то, был ли он успешным, и если нет, то почему? Нужно ли мне добавлять 40 обратно к указателю стека, чтобы оставить его в том же состоянии, в котором оно было передано мне?
Пожалуйста, будьте терпеливы со мной, потому что теперь я стою на дне очень крутая кривая обучения. Я надеюсь, что мои вопросы имеют смысл, и что я предоставил достаточно информации.