【发布时间】:2021-12-13 08:27:17
【问题描述】:
比如我有如下结构,
struct thread {
char *pName;
... // number of members between may be different for different configurations
int member;
...
};
对于不同的配置,pName和member之间可能存在不同的成员,所以member的偏移量对于不同的配置是不一样的。
而且我想在汇编代码中使用member的偏移量,但又不想根据不同的配置硬编码。我曾尝试定义以下 C 风格的宏,但 GCC 汇编器无法识别,
#define OFFSET (&(((struct thread*)0)->member))
还有其他方法吗?
【问题讨论】:
-
你需要已经知道ABI才能手动编写asm;汇编程序无法从 C 源文件中即时获取它。您可以编写一个 C 程序来打印结构偏移量的
.equ定义,您的.S文件可以是.include或#include。 -
如果有不同的配置,只需要传递成员本身的地址,来自C代码。那么汇编代码就不需要知道包含
struct了。 -
在 C 中,您可以使用
stddef.h中定义的offsetof宏找到成员的偏移量。没有办法直接在汇编中做同样的事情,因为汇编器没有“结构”的概念。 -
@WeatherVane 这是一种方式。但在我的情况下,我实际上想将结构的基地址传递给程序集,并根据它们的偏移量访问多个成员。正如您所建议的,需要传入太多参数。这不是一个好主意。