Gcc 将结构偏移属性赋予汇编程序
如何将C结构的偏移量发送到en汇编代码? 比如说 在我的C代码中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
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)));
}