4

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

4

1 回答 1

3

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

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

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


如果你想明确声明它,有一个.externGAS 忽略的指令(为了与其他一些 Unix 汇编程序兼容)。 GAS 手册中的文档

.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 位模式下可用。

于 2013-06-28T13:22:39.217 回答