【问题标题】:Accessing global variable defined in C from Asm从 Asm 访问 C 中定义的全局变量
【发布时间】:2013-06-28 13:18:21
【问题描述】:

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

【问题讨论】:

  • 不清楚您是真的想从另一个程序还是只是从同一程序中的另一个模块访问它。也不清楚您尝试了什么以及遇到了什么错误。
  • 它是另一个与 asm 二进制文件链接的模块。

标签: c gcc assembly global-variables gnu-assembler


【解决方案1】:

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

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

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


如果你想明确声明它,有一个 .extern 指令被 GAS 忽略(为了与其他一些 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 位模式下可用。

【讨论】:

  • 引用manual: ".extern is accepted in the source program—for compatibility with other assemblers—but it is ignored. as treats all undefined symbols as external."
  • 没错,但我认为它有助于增加可读性,因为您知道它是在别处定义的。
  • 重点是,它应该“正常工作”。如果 OP 有一些问题(他没有说),那一定是由于其他原因。
  • 要访问变量 foo,我们是否需要在指令中添加任何特殊字符,例如 % 或 $?
  • 不,你不需要任何特别的东西。请发布您尝试过的内容以及如果它不起作用会出现什么错误。然而,C 编译器可能会“修改”您的符号,添加前导下划线 (_) 很常见。
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多