通过在寄存器中传递函数地址从asm文件调用C函数

时间:2013-07-08 12:49:48

标签: c gcc assembly linker

我有一个名为system_handler的函数,它在C文件 func.c 中定义。我需要通过将函数的地址传递给寄存器并调用<register>来从另一个asm程序调用函数system_handler。

到目前为止,我已经写过:

       .extern system_handler   ; Is defined in func.c
       mov system_handler, %eax
       call %eax   ; This call is making run time error in emulator 
                   ; fatal: Trying to execute code outside RAM or ROM at 0x8b1cec83

在组装asm文件时,我收到警告:

**Warning: indirect call without '*'**

使用的编译器和汇编程序:i586-gnu-{gcc/as}, Using AT&T format in asm file.

1 个答案:

答案 0 :(得分:3)

在AT&amp; T语法中,您应该使用mov $system_handler, %eax加载地址,您所做的是从内存中加载函数的第一个双字。

要修正警告,你当然应该写call *%eax,这是AT&amp; T的另一个特点。

如果您不熟悉AT&amp; T语法,可以将gccgas切换为英特尔语法。