我有一个包含全局变量 foo 的 C 文件。我如何从另一个程序集访问 foo 。
我正在使用 i586-elf-as(GNU 汇编器)和 i586-elf-gcc(gnu 编译器)进行构建。
最佳答案
您可以只使用符号名称; as
将所有 undefined symbol 视为外部符号。
检查编译器输出 ( 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 位模式下可用。关于c - 从 Asm 访问 C 中定义的全局变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17365638/