从Asm访问C中定义的全局变量

时间:2013-06-28 13:18:21

标签: c gcc assembly global-variables gas

我有一个包含全局变量foo的C文件。我如何从另一个程序集中访问 foo
我正在使用i586-elf-as(GNU汇编程序)和i586-elf-gcc(gnu编译器)进行构建。

1 个答案:

答案 0 :(得分:3)

您可以使用符号名称; as将所有未定义的符号视为外部符号。

检查编译器输出(gcc -S)和/或文档,以确定C变量名是否前置_。 (int myglobal在许多非ELF平台上变为asm _myglobal,但在Linux / ELF上仍然是myglobal。)

当然,如果使用C ++编译器,则会发生C ++名称错误,但extern "C"变量除外。


如果你想明确地声明它,那么GAS会忽略一个.extern指令(用于与其他一些Unix汇编程序进行比较)。 Documentation in the GAS manual

.extern foo       # ignored, no extra checking is done because of this

例如,在x86-64,lea myglobal(%rip), %rsimov $myglobal, %esi上以AT& T语法将地址输入寄存器。

mov myglobal(%rip), %eax从中加载。或mov global, %eax使用32位绝对地址以32位模式从中加载,因为RIP相对寻址仅在64位模式下可用。