Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在寄存器中传递函数地址从asm文件调用C函数_C_Gcc_Assembly_X86_Linker - Fatal编程技术网

通过在寄存器中传递函数地址从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指令传递什么呢?我试着只传递变量名和括号内的变量名,但这两个都不起作用?只传递变量名。你说的“没用”是什么意思?你把地址传对了吗?在任何情况下,这都是一个不同的问题,您可能希望创建一个关于该问题的新条目,提供所有详细信息。