INVOKE MASM自动保存寄存器?

时间:2010-11-16 09:08:12

标签: assembly masm masm32

当我在masm中使用Invoke指令时,是否可以自动保存cpu寄存器?

3 个答案:

答案 0 :(得分:3)

查看我在那里发布的示例:selection sort in assembly language

目标PROC中的USES指令正是您所寻找的 使用EAX ESI EDI将在PROC输入时自动保存这些寄存器并在退出时恢复它们(即使您有多个RET点,即使不建议使用多个返回点)。 IOW,它将在PROC输入时生成PUSHes,并在每个RET之前始终匹配(反向顺序)POP。我们的想法是,由于这是装配,因此您可以对修改要保留的寄存器具有完全控制权和责任感。
与其他地方的建议相反,声明stdcall不会在MASM中为您自动保留任何内容。它只是确定调用者(为INVOKE生成的代码)或被调用者(在PROC中生成的代码)是否持久化。

答案 1 :(得分:1)

“stdcall”调用约定保证函数不会破坏任何寄存器,但是eax,edx,ecx。如果你想保存edx和ecx - 写一个宏。

答案 2 :(得分:0)

不确定你的意思,因为你的标签是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

这就是你对你的问题的意思吗?