如何将参数从 C 主函数传递给汇编函数?我知道我的自定义函数必须看起来像:
void function(char *somedata) __attribute__((cdecl));
现在我将如何somedata
在程序集文件中使用。我的操作系统是 Linux Ubuntu,我的处理器是 x86。
我对此有点菜鸟,但希望这个例子能让你上路。我已经对其进行了测试并且可以正常工作,您可能遇到的唯一问题是软件不可用。我正在使用 nasm 进行组装。
extern void myFunc(char * somedata);
void main(){
myFunc("Hello World");
}
section .text
global myFunc
extern printf
myFunc:
push ebp
mov ebp, esp
push dword [ebp+8]
call printf
mov esp, ebp
pop ebp
ret
nasm -f elf myFunc.asm
gcc main.c myFunc.o -o main
您需要安装 nasm(汇编程序)(ubuntu 是:sudo apt-get install nasm)
在 c 代码中基本上发生的事情会调用带有消息的 myFunc。在 myFunc.asm 中,我们得到字符串第一个字符的地址(在 [ebp+8] 中,请参阅此处获取信息(http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html参见 9.1.2,它在一定程度上描述了 c 调用约定。)然后我们将它传递给 printf 函数(通过将其压入堆栈)。 printf 在 c 标准库中,默认情况下 gcc 会自动链接到我们的代码中,除非我们说不至。
我们必须在程序集文件中导出 myFunc 并在 main.c 文件中将 myFunc 声明为外部函数。在 myFunc.asm 中,我们还从 stdlib 导入 printf 函数,以便我们可以尽可能简单地输出消息。
希望这会有所帮助。