【问题标题】:How do I call a c macro from an assembly routine?如何从汇编例程中调用 c 宏?
【发布时间】:2015-12-13 01:02:27
【问题描述】:

我有一个宏 X 可以做一些类似的事情。

#define X(a,b,c)   \
  a.foo = b;       \
  a.bar = c;

我想从汇编例程中调用X,如下所示:

.data
pushl $eax;
call X(a, b, c);

有没有办法做到这一点?

【问题讨论】:

  • 宏不是函数
  • 对,但是我的宏初始化了一些传递给它的变量,我如何从程序集中运行这个初始化宏?
  • 宏是 C 预处理器的一部分。汇编器不是 C。所以...

标签: c assembly macros


【解决方案1】:

宏不是函数,也就是说它没有地址,所以你不能调用它。

宏由预处理器评估。使用它们只会导致简单的文本替换,因此它们只存在于源文件中,不存在于其他任何地方。

但是,您可以为宏设置一个包装函数并调用它。像这样:

#define X(a, b, c) (a).foo = (b); \
    (a).bar = (c)

void _X(struct foo *a, int b, int c)
{
    X(*a, b, c);
}

但这首先消除了对宏的需求。所以你不妨去掉宏,使用一个函数。

【讨论】:

  • 我喜欢第一句的结尾 :-) 但是请注意,宏不是在编译期间评估的,而是在编译之前(因此 preprocessor ) - 严格来讲;工具链如何实际处理这是一个不同的主题。
  • 谢谢!这是我最初的预感,但你的回答澄清了这个概念很多
  • @Alex:只是一个善意的提示:您可以通过自己进行一些研究来更快地得到答案,例如在 C 书籍中。一般来说,阅读——虽然不是现代的——是获取可能不立即相关的附加信息的好方法,但是当你以后遇到类似的问题时,你可能会记得你读过一些东西。 (真的,只是一个友好的提示)
猜你喜欢
  • 2013-04-16
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2013-09-21
  • 2021-12-05
  • 2017-01-19
  • 2016-09-07
相关资源
最近更新 更多