2015-11-04 201 views
0

我在想,像設置一個函數的堆棧指針,然後執行,直到它返回。有沒有辦法將函數作爲參數傳遞給程序集?

編輯:我使用nasm和nlink。

Edit2:我使用x86處理器。

Edit3:好的,所以我想寫一個過濾器函數,它會過濾一個字符串,使用另一個函數來決定一個char是否可以接受。我想它的形式如下:

;params: string in r1, function in r2 
Filter: 
    ;do stuff 
    ret 

IsCharGood: 
    ;decide if char is good 
    ret 

main: 
    mov  r1, theString 
    mov  r2, IsCharGood 
    call Filter 

編輯4:已解決,請參閱下面的答案。

+1

根據你的標題:是的,這是平凡的可能。請用一個例子來說明你想達到的目標以及你到達那裏的問題。 –

回答

1

好了,所以這是比較簡單的:

aFunction: 
    ;do stuff here 
    ret 

callFunctionInEax: 
    call eax 
    ret 

main: 
    mov  eax, aFunction 
    call callFunctionInEax 
    ret 
+0

正常的調用約定是將堆棧上的args傳遞給32位,或將寄存器中的args傳遞給64位。但是,這是有效的。 –

2

裝配中沒有「功能」,這是更高層次的概念。

你不說你正在使用哪個處理器,但是如果處理器有指令跳轉到常規寄存器中的地址,那當然是最簡單的方法。例如ARM可以做到這一點,並so can x86

當然,如何將參數傳遞給子例程取決於組裝中的程序員。只要您可以生成呼叫,您就可以傳入寄存器或堆棧中,無關緊要。攻擊堆棧指針本身看起來很尷尬和奇怪。

+0

謝謝你的回答!現在我只需要找到我的子程序的地址。也許我可以使用Ollydbg,我不確定。 –

+0

@ zsolt-z大多數彙編程序都支持符號。所以用'lea r2,IsCharGood'替換'mov r2,IsCharGood',你在r2中得到了IsCharGood的地址。 – zx485

相關問題