当我在masm中使用Invoke指令时,是否可以自动保存cpu寄存器?INVOKE MASM自动保存寄存器?
回答
不确定你的意思,因为你的标签是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
那是你的意思你的问题?
“stdcall”调用约定保证函数不会破坏任何寄存器,但eax,edx,ecx。如果你想保存edx和ecx - 写一个宏。
看一下例子我张贴有:selection sort in assembly language
目标PROC用途指令是你在找什么。
用途EAX ESI EDI将在PROC输入时自动保存这些寄存器,并在退出时恢复它们(即使您有多个RET点,并且即使不建议使用多个ret点也是如此)。 IOW,它将在PROC输入时生成PUSH,并在每个RET之前始终匹配(反向排序)POP。我们的想法是,由于这是装配,因此您可以完全控制和修改要修改的寄存器和。
与其他地方的建议相反,声明stdcall不会自动为您在MASM中保留任何内容。它只是确定调用者(为INVOKE生成的代码)还是被调用者(在PROC中生成的代码)是否持久性参数。
这个问题是关于'invoke',而不是'proc'。或者你的意思是你可以使用'使用'与'invoke'? – Abyx 2010-11-22 07:10:52
INVOKE的唯一用途是调用一个带有调用约定,参数等的PROC。 – filofel 2010-11-23 07:51:33
INVOKE是呼叫的HLL包装器,处理调用约定,parms等。INVOKE和PROC扩展是同一枚硬币的两面。例如,根据proc类型,调用者(在返回时,由INVOKE生成)或被调用者(在每个RET之前的proc内部)将删除参数。有没有其他方法可以自动保存/恢复MASM中的regs,但是这一个。否则,在调用和返回POPPOP之前,通过PUSHing手动执行每次调用。 – filofel 2010-11-23 07:59:18
- 1. MIPS寄存器保存
- 2. MASM大会将8位寄存器移动到16位寄存器(即mov cx,ch)
- 3. intel 80386在哪里保存寄存器?
- 4. 保存xmm寄存器的值
- 5. 如何保存寄存器VIM
- 6. ARMv8 AArch64 SVC保存寄存器
- 7. 谁会自动写入vim寄存器?
- 8. XOR寄存器,寄存器(汇编)
- 9. 解释GDB寄存器(SSE寄存器)
- 10. 由于EAX寄存器中的句柄值太差,MASM ReadFile失败
- 11. MIPS汇编语言 - 临时寄存器vs保存的寄存器
- 12. Verilog:将值保存在寄存器中(分配给相同的寄存器)
- 13. MASM使用寄存器作为mod运算符
- 14. 用MASM输出寄存器到控制台
- 15. 确实gcc保存被调用者保存寄存器
- 16. 从DX:AX寄存器移动到单个32位寄存器
- 17. 寄存器JS
- 18. 与寄存器
- 19. 的寄存器
- 20. 寄存器
- 21. Masm invoke createfile不起作用
- 22. XMM寄存器存储
- 23. 汇编保持寄存器值?
- 24. 如何在LLVM中保留寄存器?
- 25. GDB寄存器与处理器寄存器不同吗?
- 26. XMM寄存器值
- 27. 寄存器读取
- 28. 寄存器工作
- 29. MPLAB Trace寄存器
- 30. 确定寄存器
有什么办法可以强制eax自动保存,然后在INVOKE期间自动恢复? – Jumbo 2010-11-18 06:53:47
@Jumbo你可以编写宏来保存它,但是当你恢复它时,你将失去函数返回值。 – Abyx 2010-11-18 07:52:39
事实上,stdcall不保证MASM中的任何内容。它最多可能暗示函数应该以这种方式表现。要使寄存器自动保存/恢复,必须在PROC定义中使用USES指令。看到我的回复。 – filofel 2010-11-22 07:00:30