2010-11-16 106 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