如何将变量传递给外部汇编函数
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:将片段和弹出窗口的点击事件中生成的变量传递给活动的方法