我有一个名为“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.
答案 0 :(得分:3)
在AT&amp; T语法中,您应该使用mov $system_handler, %eax
加载地址,您所做的是从内存中加载函数的第一个双字。
要修正警告,你当然应该写call *%eax
,这是AT&amp; T的另一个特点。
如果您不熟悉AT&amp; T语法,可以将gcc
和gas
切换为英特尔语法。