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

Gcc 将结构偏移属性赋予汇编程序,gcc,assembly,struct,arm,Gcc,Assembly,Struct,Arm,如何将C结构的偏移量发送到en汇编代码? 比如说 在我的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

如何将C结构的偏移量发送到en汇编代码? 比如说

在我的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
谢谢
Etienne

您可以使用代码和宏。

实际上,有一种方法。这个解决方案包含了一点魔力,但它是有效的。它只是工作

在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)/$@

像这样的怎么样:

#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)));
}
#包括/*offsetof*/
结构cmystuct
{
无符号整数a;
无符号整数b;
};
int main()
{
asm(“ldr r1,[r0,%[OffsetOfA]]]\n\t”
“ldr r2,[r0,%[OffsetOfB]]]\n\t”
:/*没有产出*/
:[OffsetOfA]“i”(offsetof(struct cmystuct,a)),[OffsetOfB]“i”(offsetof(struct cmystuct,b));
}

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

您不能执行类似于假设r0:cmystuct的操作吗
#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)));
}