0

我有一个名为的函数system_handler,它在func.c. 我需要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}, 在 asm 文件中使用 AT&T 格式。

4

1 回答 1

3

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

要修复警告,您当然应该编写call *%eax,这是 AT&T 的另一个特点。

如果您不熟悉 AT&T 语法,您可以同时切换gccgas到 intel 语法。

于 2013-07-08T13:01:27.827 回答