2017-10-14 18 views
0

GCCinline assemblyを使用して、即時に特定のレジスタr0をロードします。しかし、私は正しい結果を得ていません。PowerPCインラインアセンブリ:レジスタにC値をロード

unsigned short value = 0x1337; 

asm volatile 
(
"li 0, %0\n\t" 
     "sc\n\t" 
     "blr" 
: /* Output registers */ 
:"r"(value) /* Input registers */ 
: /* No clobbered registers */ 
); 

はコンパイルすると、これは9から来るん

li  r0, 9 
sc 
blr 

を与えますか?代わりに指定された値0x1337が必要でした。 Hereは私が見たチュートリアルです。

答えて

2

9は0x1337を含むレジスタです。これはあなたが求めていたものです。 valueはどのように入力レジスタですか? 9、a.k.a.r9は完全に有効な入力レジスタである。これは私が得るアセンブリ出力です。

li 9,4919 
    li 0, 9 
    sc 
    blr 

0x1337を直接ロードする場合は、代わりにその値を使用してください。

asm volatile (
    "li 0, 0x1337\n\t" 
    "sc\n\t" 
    "blr" 
); 

かは、だけではなく、"r"制約の"i"制約を使用しています。

asm volatile (
    "li 0, %0\n\t" 
    "sc\n\t" 
    "blr" 
    : 
    : "i"(0x1337) 
); 
+0

うん、当然それは簡単な解決策 – BullyWiiPlaza

+0

@BullyWiiPlazaた:あなたは、レジスタと即値を混在させることはできませんので、裸の数字ではありません名を登録得るためにはgcc -mregnames' '使用します。また、あなたが壊れているレジスタについてコンパイラに伝えるようにして、あなたがジャンプしていることを伝えるために 'asm goto'を使用してください。私はコンパイラに安全な方法があるかどうか分からないが、あなたのasmは 'lr'の戻りアドレスを必要とし、それが返される。あなたはおそらくasmであなたの関数全体を書いておくべきです、なぜなら、それがインラインであれば、これがどのように機能するのかわからないからです。 –

+0

@PeterCordes:はい、これは機能全体です。 :) – BullyWiiPlaza

関連する問題