将结构体偏移属性赋予汇编器

2024-04-06

如何将 C 结构体的偏移量发送到汇编代码? 例如

在我的 C 代码中

typedef struct
{
  unsigned int a;
  unsigned int b;
} CMyStruct;

我向 ASM 函数发送一个 CMyStruct 结构的指针 假设我的指针指向 R0

要访问 a 和 b 属性,我需要这样做。

ldr      r1, [r0, #0] // read a
ldr      r2, [r0, #4] // read b

是否有办法不将 #0 和 #4 指定为常量值? 就像是

ldr      r1, [r0, CMyStruct.a] // read a
ldr      r2, [r0, CMyStruct.b] // read b

谢谢 艾蒂安


其实有办法的。该解决方案包含一点魔力,但它确实有效。这只是作品。

在c文件中:

#define DEFINE(sym, val) asm volatile("\n-> " #sym " %0 " #val "\n" : : "i" (val))
#define OFFSETOF(s, m) \
    DEFINE(offsetof_##s##_##m, offsetof(s, m));

#define SIZEOF(s) \
    DEFINE(sizeof_##s, sizeof(s));

void foo()
{
    OFFSETOF(KERNEL, error);
    OFFSETOF(KERNEL, pool);
    SIZEOF(KERNEL);
}

在生成文件中:

asm_defines.h: asm_defines.c
    $(GCC) $(FLAGS_CC) -S $< -o - | awk '($$1 == "->") { print "#define " $$2 " " $$3 }' > $(BUILD_DIR)/$@

最后您将获得 asm_defines.h,您可以将其包含在 .S 文件中。

#define offsetof_KERNEL_error #16
#define offsetof_KERNEL_pool #4
#define sizeof_KERNEL #120
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将结构体偏移属性赋予汇编器 的相关文章

随机推荐