将结构偏移属性赋予汇编程序

时间:2011-11-24 15:35:49

标签: gcc assembly struct arm

如何将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

感谢的 艾蒂安

3 个答案:

答案 0 :(得分:3)

实际上有一种方法。解决方案包含一些魔力,但它的工作原理。它只是有效。

在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);
}

在Makefile中:

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

答案 1 :(得分:0)

您可以使用GCC extended inline assembly代码并使用offsetof宏。

答案 2 :(得分:0)

这样的事情怎么样:

#include <stddef.h>     /* offsetof */

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

int main()
{
   asm("ldr r1, [r0, %[OffsetOfA]] \n\t"
       "ldr r2, [r0, %[OffsetOfB]] \n\t" 
   : /* no outputs */
   : [OffsetOfA] "i" (offsetof(struct CMyStruct, a)), [OffsetOfB] "i" (offsetof(struct CMyStruct, b)));
}

显然这不太对,因为你不想硬编码r0 / r1 / r2,但它应该指向正确的方向。