如何将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
感谢的 艾蒂安
答案 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,但它应该指向正确的方向。