我有一个包含全局变量foo的C文件。我如何从另一个程序集中访问 foo 。
我正在使用i586-elf-as(GNU汇编程序)和i586-elf-gcc(gnu编译器)进行构建。
答案 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), %rsi
或mov $myglobal, %esi
上以AT& T语法将地址输入寄存器。
或mov myglobal(%rip), %eax
从中加载。或mov global, %eax
使用32位绝对地址以32位模式从中加载,因为RIP相对寻址仅在64位模式下可用。