当我在 masm 中使用 Invoke 指令时,是否可以自动保存 cpu 寄存器?
3 回答
看看我在那里发布的例子:汇编语言中的选择排序
目标 PROC 中的 USES 指令就是您要查找的内容。
使用 EAX ESI EDI 将在 PROC 进入时自动保存这些寄存器并在退出时恢复它们(即使您有多个 RET 点,即使不推荐使用多个 ret 点)。IOW,它将在 PROC 进入时生成 PUSH,并在每个 RET 之前生成一致匹配(倒序)的 POP。这个想法是,由于这是汇编,您可以完全控制和负责您修改并希望保留的那些寄存器。
与其他地方的建议相反,声明 stdcall 不会在 MASM 中自动为您保留任何内容。它只是确定调用者(为 INVOKE 生成的代码)或被调用者(在 PROC 中生成的代码)是否弹出参数。
“stdcall”调用约定保证函数不会破坏任何寄存器,但 eax、edx、ecx。如果你想保存 edx 和 ecx - 写一个宏。
不确定你的意思,因为你的标签是 masm32 我会假设 Windows x86。
完全可能的是推送 API 调用所需的所有参数,然后您只需调用所需的函数。我的意思是,当你在 Windows 的程序集中进行程序集时,你不需要使用寄存器来“调用”API,你必须推送参数然后调用(或调用)API。
例如,这个:
push 0
push DWORD PTR SS:[EBP+8]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0CF0000h
push offset AppName
push offset ClassName
push 0h
call CreateWindowExA
正好等于这个(实际上只是参数的值不同):
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
你的问题就是这个意思吗?