如何以可维护和可读的方式在ARM程序集中重用C结构?

Mar*_*Thé 9 c assembly struct arm

访问struct字段时,我一直在手动向地址添加偏移量以访问字段.这非常繁琐,难以阅读和维护头痛.

有没有更好的方法来访问C结构域?

例如,我正在考虑这样的语法:

example.h文件: typedef struct { int a; int b; } MyStruct;

例子: ldr r1, [r2, #MyStruct.b] // r2 contains an address to a MyStruct

Var*_*der 6

真的没有干净和便携的方式.我见过的大多数项目都有一些构建步骤,可以生成struct offsets的头文件.它有点像这样:

1)创建一个定义偏移量的C文件

#include "mystruct.h"

#define DECLARE(SYM,VAL) \
__asm("__AS_DEFINE__ " SYM "\t%0" : : "n" ((unsigned long)(VAL)))

void foo(void)
{
    // mystruct.h
    DECLARE("MYSTRUCT_B",  offsetof(struct mystruct, b));
}
Run Code Online (Sandbox Code Playgroud)

2)使用标志编译该文件以生成程序集(Clang或GCC上的-S).这将创建一个包含一堆定义行的汇编文件,例如:

    __AS_DEFINE__ MYSTRUCT_B    #4
Run Code Online (Sandbox Code Playgroud)

3)使用一些shell技巧将它们变成汇编代码的头文件.

grep '__AS_DEFINE__' offsets.s | sed 's/#//g' | sed 's/__AS_DEFINE__/#define/g' > build/include/offsets.h
Run Code Online (Sandbox Code Playgroud)

这会生成一个看起来像这样的文件,并且可以包含在程序集源中.

    #define MYSTRUCT_B  4
Run Code Online (Sandbox Code Playgroud)

然后,您可以直接使用它.

#include "offsets.h"

    ldr r1, [r2, #MYSTRUCT_B]
Run Code Online (Sandbox Code Playgroud)