Соглашения о вызовах ассемблера для Windows 10 процедур API - PullRequest
1 голос
/ 20 апреля 2020

В 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 обратно к указателю стека, чтобы оставить его в том же состоянии, в котором оно было передано мне?

Пожалуйста, будьте терпеливы со мной, потому что теперь я стою на дне очень крутая кривая обучения. Я надеюсь, что мои вопросы имеют смысл, и что я предоставил достаточно информации.

...