如何将变量传递给外部汇编函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将变量传递给外部汇编函数相关的知识,希望对你有一定的参考价值。

如何将变量从C程序传递到汇编函数。

示例:

main.c:

void main() {
  unsigned int passthis = 42
  extern asm_function();
  asm_function(passthis)
}

main.asm:

bits 32
global start
section .text
asm_function:
  ...

如何在passthis中访问asm_function

编辑:可能应该提到我没有使用操作系统,而是使用i686-elf交叉编译器进行编译,并将其用作内核。

答案

如果使用默认的GCC选项将C编译为32位代码(不是Linux内核使用的-mregparm=3,则在函数输入时,第一个参数位于返回地址上方的堆栈上(在[esp+4]) ),但是在您push进行任何操作或移动ESP之后,偏移量都会发生变化。

您可以在设置传统的堆栈指针后使用[ebp+8](即使在ESP起作用的情况下,该指针在函数中也不会改变)。>>

例如,int asm_function(int)可以实现为:

;bits 32              ; unneeded, nasm -felf32 implies this.
global asm_function   ; include asm_function in ELF .o symbol table for linking
section .text
asm_function:
    push ebp
    mov ebp, esp
    mov eax, [ebp+8]  ; return the first argument
    mov esp, ebp
    pop ebp
    ret

对于此后的每个参数,只需简单地添加另一个4(即对于第二个参数,请使用[ebp+12])。如您所见,将EBP设置为框架指针会增加一些微小功能的开销。

某些非ELF系统/ ABI在C符号名称前加一个下划线,因此您应该声明asm_function_asm_function,以使代码在这些ABI中大致相同,如下所示:

global _asm_function
global asm_function  ; make both names of the function global
section .text
_asm_function:
asm_function:        ; make both symbols point to the same place
    push ebp
    mov ebp, esp
    mov eax, [ebp+8]
    mov esp, ebp
    pop ebp
    ret
另一答案

x86可能有一些不同的调用约定。它取决于许多因素,例如Windows vs. linux,以及您使用的编译器环境(32位还是64位等)。

以上是关于如何将变量传递给外部汇编函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

如何将变量从活动传递到片段不能解决以前的所有问题

Android:将片段和弹出窗口的点击事件中生成的变量传递给活动的方法

Actionscript 3 ExternalInterface,将变量传递给javascript?

将变量传递给现代中继中的片段容器

将变量传递给外部解析引用