0

アセンブリ コードで offsetof を使用しようとしています

#define     offsetof(TYPE, MEMBER)   ((size_t) &((TYPE *)0)->MEMBER)

#define     DEFINE(sym, val)   asm volatile("\n->" #sym " %0 " #val : : "i" (val))

構造は

struct mystruct {
int a;
int b;
int c;

}

私のアセンブリ コードでは、単純に SUB sp, sp, #- を実行する必要があります。

マクロの宣言方法

4

2 に答える 2

0

これはうまくいかないと思います。

offsetof演算子はコンパイル時のものであり、プリプロセッサによって評価されません。プリプロセッサは C を解析しないので、それはほとんど魔法のようです。構造オフセットを計算するにはどうすればよいでしょうか。これを行うには、多くのマシン固有の情報が必要になるため、コンパイラの責任範囲が大きくなります。プリプロセッサはテキストを処理するだけです。

典型的なドキュメントではマクロを呼び出しますがoffsetof、それはプリプロセッサによって評価されるという意味ではありません。コンパイラ固有の魔法に評価されるマクロであることを意味するだけかもしれません。

たとえば、gccの場合、次のように定義できます。

#define offsetof(type, member)  __builtin_offsetof (type, member)

ここに、実際に計算__builtin_offsetof()を行う魔法のようなコンパイラ固有の関数があります。アセンブラソースがリテラルオフセットを必要とする場所に呼び出しを残すことは、もちろん解決策ではありません。

于 2013-10-08T10:23:40.160 に答える