有没有办法将函数作为参数传递给程序集?

问题描述:

我在想,像设置一个函数的堆栈指针,然后执行,直到它返回。有没有办法将函数作为参数传递给程序集?

编辑:我使用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

根据你的标题:是的,这是平凡的可能。请用一个例子来说明你想达到的目标以及你到达那里的问题。 –

好了,所以这是比较简单的:

aFunction: 
    ;do stuff here 
    ret 

callFunctionInEax: 
    call eax 
    ret 

main: 
    mov  eax, aFunction 
    call callFunctionInEax 
    ret 
+0

正常的调用约定是将堆栈上的args传递给32位,或将寄存器中的args传递给64位。但是,这是有效的。 –

装配中没有“功能”,这是更高层次的概念。

你不说你正在使用哪个处理器,但是如果处理器有指令跳转到常规寄存器中的地址,那当然是最简单的方法。例如ARM可以做到这一点,并so can x86

当然,如何将参数传递给子例程取决于组装中的程序员。只要您可以生成呼叫,您就可以传入寄存器或堆栈中,无关紧要。攻击堆栈指针本身看起来很尴尬和奇怪。

+0

谢谢你的回答!现在我只需要找到我的子程序的地址。也许我可以使用Ollydbg,我不确定。 –

+0

@ zsolt-z大多数汇编程序都支持符号。所以用'lea r2,IsCharGood'替换'mov r2,IsCharGood',你在r2中得到了IsCharGood的地址。 – zx485