2011-11-24 61 views
2

如何將C結構的偏移量發送至彙編代碼? 例如將結構偏移屬性賦予彙編程序

在我的C代碼,我有

typedef struct 
{ 
    unsigned int a; 
    unsigned int b; 
} CMyStruct; 

我發送到ASM功能的CMyStruct結構的指針 讓想我的指針到R0

要訪問和b屬性我需要這樣做。

ldr  r1, [r0, #0] // read a 
ldr  r2, [r0, #4] // read b 

反正有沒有指定#0和#4作爲contant值? 喜歡的東西

ldr  r1, [r0, CMyStruct.a] // read a 
ldr  r2, [r0, CMyStruct.b] // read b 

感謝的 艾蒂安

+0

難道你不能做像ASSUME r0:CMyStruct – Cyclonecode

回答

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)/[email protected] 

最後,您將得到asm_defines.h,您可以在您的.S文件。

#define offsetof_KERNEL_error #16 
#define offsetof_KERNEL_pool #4 
#define sizeof_KERNEL #120 
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,但它應該指向你在正確的方向。