私はこのコードを持っている:AVR GCC、アセンブリCスタブ関数、EOR及び必要な一定値
uint16_t swap_bytes(uint16_t x)
{
asm volatile(
"eor, %A0, %B0" "\n\t"
"eor, %B0, %A0" "\n\t"
"eor, %A0, %B0" "\n\t"
: "=r" (x)
: "0" (x)
);
return x;
}
(-std=gnu99 -save-temps
とavr- gcc version 4.8.1
によって)変換される:
.global swap_bytes
.type swap_bytes, @function
swap_bytes:
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
/* #APP */
; 43 "..\lib\own\ownlib.c" 1
eor, r24, r25
eor, r25, r24
eor, r24, r25
; 0 "" 2
/* #NOAPP */
ret
.size swap_bytes, .-swap_bytes
しかし、コンパイラはそのような不平を言っています:
|65|Error: constant value required|
|65|Error: garbage at end of line|
|66|Error: constant value required|
|66|Error: garbage at end of line|
|67|Error: constant value required|
|67|Error: garbage at end of line|
||=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
上記の行は、 eor
コマンドを使用します。なぜコンパイラはそれに問題がありますか?レジスタはほぼすべての操作が可能な上位(> = r16)です。 constant value required
それはリテラルを期待するような私の音...私はそれを得ることはありません。
gccには組み込み機能があります。なぜそれらを使用しない?とにかくコンパイラに依存しています。プレーンCを使わないのはなぜですか? – Olaf
私はオラフと付き合っています。可能であれば、ビルトインを使用してください。しかし、インラインasmを使用しなければならない場合は、あなたの問題が「余分な」カンマであるのだろうかと思います。グーグルでは、「eor r4、r4」と「eor r0、r22」(eorコマンドの後にカンマはありません)になります。私は専門家ではありませんが、それは私が最初に試してみるものです。 –
f#* k!あなたが正しい。 '、'はありません。とにかくAVRはマイクロコントローラなので、プログラム空間は狭いです。 3命令はCにとって無敵です。もう一度皆さんに感謝してください! – milkpirate