通过在寄存器中传递函数地址从asm文件调用C函数
我有一个名为通过在寄存器中传递函数地址从asm文件调用C函数,c,gcc,assembly,x86,linker,C,Gcc,Assembly,X86,Linker,我有一个名为system\u handler的函数,它是在func.c中定义的。我需要通过将函数的地址传递到寄存器并调用寄存器,从另一个汇编程序调用system\u handler 到目前为止,我写了以下内容: .extern system_handler ; Is defined in func.c mov system_handler, %eax call %eax ; This call is making run time error i
system\u handler
的函数,它是在func.c
中定义的。我需要通过将函数的地址传递到寄存器并调用寄存器,从另一个汇编程序调用system\u 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格式。在AT&T语法中,您应该使用mov$system\u处理程序,%eax
加载地址,您所做的是从内存加载函数的第一个dword
要修复该警告,您当然应该编写call*%eax
,这是AT&T的另一个特性
如果您不熟悉AT&T语法,您可以将
gcc
和gas
切换为英特尔语法。在AT&T语法中,您应该使用mov$system\u处理程序,%eax
加载地址,您所做的是从内存加载函数的第一个dword
要修复该警告,您当然应该编写call*%eax
,这是AT&T的另一个特性
如果您不熟悉AT&T语法,可以将
gcc
和gas
切换为英特尔语法。我可以将相同的$用于外部变量吗。在变量名前面使用$时出错。lgdt-var;无错误lgdt$var;错误:不支持的指令'lgdt',这是因为lgdt
实际上需要一个有效地址(内存引用),而不是立即数。好的,那么我应该为lgdt指令传递什么呢?我试着只传递变量名和括号内的变量名,但这两个都不起作用?只传递变量名。你说的“没用”是什么意思?你把地址传对了吗?在任何情况下,这是一个不同的问题,您可能希望创建一个关于它的新条目,提供所有详细信息。我是否可以对外部变量使用相同的$。在变量名前面使用$时出错。lgdt-var;无错误lgdt$var;错误:不支持的指令'lgdt',这是因为lgdt
实际上需要一个有效地址(内存引用),而不是立即数。好的,那么我应该为lgdt指令传递什么呢?我试着只传递变量名和括号内的变量名,但这两个都不起作用?只传递变量名。你说的“没用”是什么意思?你把地址传对了吗?在任何情况下,这都是一个不同的问题,您可能希望创建一个关于该问题的新条目,提供所有详细信息。