дать атрибут смещения структуры ассемблеру - PullRequest
3 голосов
/ 24 ноября 2011

как я могу отправить смещение структуры 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, [r0, CMyStruct.a] // read a
ldr      r2, [r0, CMyStruct.b] // read b

Спасибо-х Etienne

Ответы [ 3 ]

3 голосов
/ 27 июня 2014

Есть способ, на самом деле.Решение содержит немного магии, но это работает.Это просто работает.

в файле 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
0 голосов
/ 01 июля 2014

Примерно так:

#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, но это должно указывать вам правильное направление.

0 голосов
/ 24 ноября 2011

Вы можете использовать расширенный встроенный код GCC и использовать макрос offsetof.

...