當我在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. 如何保存寄存器VIM
- 2. ARMv8 AArch64 SVC保存寄存器
- 3. intel 80386在哪裏保存寄存器?
- 4. 保存xmm寄存器的值
- 5. 誰會自動寫入vim寄存器?
- 6. XOR寄存器,寄存器(彙編)
- 7. 由於EAX寄存器中的句柄值太差,MASM ReadFile失敗
- 8. 從DX:AX寄存器移動到單個32位寄存器
- 9. 寄存器JS
- 10. XMM寄存器存儲
- 11. 彙編保持寄存器值?
- 12. 如何在LLVM中保留寄存器?
- 13. Masm invoke createfile不起作用
- 14. ERLANG - wxGrid寄存器
- 15. 寄存器讀取
- 16. 寄存器值8086
- 17. 通用寄存器
- 18. Directx 11寄存器
- 19. Modbus TCP寄存器
- 20. MIPS $ gp寄存器
- 21. 確定寄存器
- 22. 內存數據寄存器(MDR)與內存緩衝寄存器(MBR)
- 23. X86操作碼將xmm寄存器移動到通用寄存器
- 24. 自動保存Personal.xls
- 25. 使用FPU和MMX寄存器作爲「通用寄存器」
- 26. 在CPU寄存器中分配寄存器變量的標準?
- 27. 32位寄存器作爲8位寄存器
- 28. MIPS中的浮點寄存器是哪些數字寄存器?
- 29. MIPS:將寄存器地址複製到另一個寄存器
- 30. 在C++中實現寄存器/取消寄存器模式
有什麼辦法可以強制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