2010-11-16 42 views

回答

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 

那是你的意思你的问题?

1

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

+0

有什么办法可以强制eax自动保存,然后在INVOKE期间自动恢复? – Jumbo 2010-11-18 06:53:47

+0

@Jumbo你可以编写宏来保存它,但是当你恢复它时,你将失去函数返回值。 – Abyx 2010-11-18 07:52:39

+0

事实上,stdcall不保证MASM中的任何内容。它最多可能暗示函数应该以这种方式表现。要使寄存器自动保存/恢复,必须在PROC定义中使用USES指令。看到我的回复。 – filofel 2010-11-22 07:00:30

2

看一下例子我张贴有:selection sort in assembly language

目标PROC用途指令是你在找什么。
用途EAX ESI EDI将在PROC输入时自动保存这些寄存器,并在退出时恢复它们(即使您有多个RET点,并且即使不建议使用多个ret点也是如此)。 IOW,它将在PROC输入时生成PUSH,并在每个RET之前始终匹配(反向排序)POP。我们的想法是,由于这是装配,因此您可以完全控制和修改要修改的寄存器
与其他地方的建议相反,声明stdcall不会自动为您在MASM中保留任何内容。它只是确定调用者(为INVOKE生成的代码)还是被调用者(在PROC中生成的代码)是否持久性参数。

+0

这个问题是关于'invoke',而不是'proc'。或者你的意思是你可以使用'使用'与'invoke'? – Abyx 2010-11-22 07:10:52

+0

INVOKE的唯一用途是调用一个带有调用约定,参数等的PROC。 – filofel 2010-11-23 07:51:33

+0

INVOKE是呼叫的HLL包装器,处理调用约定,parms等。INVOKE和PROC扩展是同一枚硬币的两面。例如,根据proc类型,调用者(在返回时,由INVOKE生成)或被调用者(在每个RET之前的proc内部)将删除参数。有没有其他方法可以自动保存/恢复MASM中的regs,但是这一个。否则,在调用和返回POPPOP之前,通过PUSHing手动执行每次调用。 – filofel 2010-11-23 07:59:18