【问题标题】:give structure offset attribute to assembler将结构偏移属性赋予汇编器
【发布时间】:2011-11-24 15:35:48
【问题描述】:

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

谢谢 艾蒂安

【问题讨论】:

  • 你不能做一些类似于 ASSUME r0:CMyStruct

标签: gcc assembly struct arm


【解决方案1】:

其实是有办法的。解决方案包含一点魔法,但它是有效的。它只是工作。

在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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这样的事情怎么样:

      #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,但它应该为您指明正确的方向。

      【讨论】:

        猜你喜欢
        • 2019-04-10
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多