【问题标题】:GCC Inline assembler access arguments?GCC内联汇编程序访问参数?
【发布时间】:2013-01-12 23:00:11
【问题描述】:

我需要从 C 函数访问参数

void printk(char* msg);

并将其存储到 ESI 中。但是我做不到

mov $msg, %esi

mov $_msg, %esi

两者都返回链接器错误(说符号 msg 或 _msg 未定义。我很确定我可以通过从堆栈中读取来访问 msg,但在我的汇编代码中访问符号 msg 会更容易。是这个甚至可能在 GCC 中?

【问题讨论】:

  • 你能显示更多上下文吗?
  • 我的意思是真的没什么。我只是尝试使用内联汇编将参数消息移动到 ESI 中,使用 asm("mov $msg, %esi");编译器说 msg 是未定义的。
  • 我认为你不能在 gcc 内联汇编中做到这一点。现在写一个答案。

标签: gcc gnu-assembler


【解决方案1】:

您不能在 GCC 内联汇编中引用类似的变量。我想你想要这样的东西:

 asm("mov %[msg], %%esi",
     : /* no outputs */
     : [msg] "r" (msg)
     : "esi");

【讨论】:

  • 谢谢,这是我所需要的,我来自 NASM 背景,所以 GAS 对我来说是新的。
  • 是的,gcc 风格的内联汇编语法可能很糟糕。也许吧。
  • 根据您的 ABI,您可能会发现“m”输入约束会生成更好的代码。
  • 更好的是"rm" 允许编译器使用寄存器或内存,以与参数恰好位于的位置更好匹配...
  • 酷 - 我不知道这是允许的。好建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多