1

Codesourcery arm-linux-eabi ク​​ロスコンパイラを使用すると、コンパイラが特定のコードを実行しないという問題が発生します。これは、特にシステムコールでは、使用されていないと見なされるためです。これを回避する方法はありますか?

たとえば、次のコードは変数を初期化しません。

unsigned int temp = 42;
asm volatile("mov R1, %0 :: "r" (temp));
asm volatile("swi 1");

この場合、temp は値 42 に初期化されることはありません。ただし、初期化後に printk を追加すると、正しい値 42 に初期化されます。

unsigned int temp __attribute__ ((used)) = 42;

まだ動作しませんが、警告メッセージが表示されます:

「使用済み」属性は無視されます [-Wattributes]

これは Linux カーネル コードにあります。

任意のヒント?

4

1 に答える 1

4

これは、インラインアセンブリを使用する正しい方法ではありません。記述されているように、2つのステートメントは別個のものであり、コンパイラーが2つの間のレジスター値を保持する必要がある理由はありません。適切な入力と出力の制約を使用して、両方のアセンブリ命令を同じインラインアセンブリブロックに配置するか、コンパイラをより効率的にするために次のようなことを行う必要があります。

register unsigned int temp __asm__("r1") = 42;
__asm__ volatile("swi 1" : : "r"(temp) : "memory");

(クローバーリストにメモリを追加したことに注意してください。作成しているシステムコールはわかりませんが、システムコールがユーザースペース内のオブジェクトに書き込む場合は、「メモリ」をクローバーリストにリストする必要があります。)

于 2012-10-31T13:05:41.103 に答える