【问题标题】:Is there a way to pass a function as a parameter in assembly?有没有办法在汇编中将函数作为参数传递?
【发布时间】:2015-11-04 12:47:07
【问题描述】:

我正在考虑将堆栈指针设置为一个函数,然后执行直到它返回。

编辑:我使用 nasm 和 nlink。

Edit2:我使用 x86 处理器。

Edit3:好的,所以我想编写一个过滤器函数,它会过滤一个字符串,使用另一个函数来决定一个字符是否可以接受。我想象它的形式是:

;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

Edit4:已解决,请参阅下面的答案。

【问题讨论】:

  • 根据您的标题:是的,这很可能。请举例说明您想要实现的目标以及您遇到的问题。

标签: assembly


【解决方案1】:

汇编中没有“函数”,这是一个更高层次的概念。

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

当然,如何将参数传递给子例程取决于您作为汇编程序的程序员。您可以传入寄存器或堆栈,只要您可以生成调用,这并不重要。破解堆栈指针本身看起来既尴尬又奇怪。

【讨论】:

  • 感谢您的回答!现在我只需要找出我的子程序的地址。也许我可以使用 Ollydbg,我不确定。
  • @zsolt-z 大多数汇编程序都支持符号。所以将mov r2, IsCharGood替换为lea r2, IsCharGood,你就得到了r2中IsCharGood的地址。
【解决方案2】:

好的,所以比较简单:

aFunction:
    ;do stuff here
    ret

callFunctionInEax:
    call    eax
    ret

main:
    mov     eax, aFunction
    call    callFunctionInEax
    ret

【讨论】:

  • 正常的调用约定是在 32 位的堆栈上传递 args,或者在 64 位的寄存器中传递参数。但是,是的,这行得通。
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 2017-07-10
  • 1970-01-01
  • 2015-07-08
  • 2020-11-30
  • 2020-06-24
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多