我有一个包含全局变量 foo 的 C 文件。我如何访问foo来自另一个汇编程序。
我使用 i586-elf-as (GNU 汇编器)和 i586-elf-gcc (gnu 编译器)进行构建。
您可以只使用交易品种名称;as
将所有未定义的符号视为外部符号。
检查编译器输出(gcc -S
)和/或文档来查明 C 变量名称是否有前导_
前置或不前置。 (int myglobal
变成汇编_myglobal
在许多非 ELF 平台上,但仍然myglobal
在 Linux/ELF 上。)
当然,如果您使用 C++ 编译器,C++ 名称重整就会发生,除了extern "C"
变量。
如果你想明确声明它,有一个.extern
GAS 忽略的指令(为了与其他一些 Unix 汇编器兼容)。GAS 手册中的文档
.extern foo # ignored, no extra checking is done because of this
例如在 x86-64 上,lea myglobal(%rip), %rsi
or mov $myglobal, %esi
以 AT&T 语法将地址存入寄存器。
Or mov myglobal(%rip), %eax
从中加载。或者mov global, %eax
使用 32 位绝对地址以 32 位模式从中加载,因为 RIP 相对寻址仅在 64 位模式下可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)