【发布时间】:2016-10-29 15:02:07
【问题描述】:
我有这个代码:
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;
}
翻译(通过 avr-gcc version 4.8.1 和 -std=gnu99 -save-temps)为:
.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:如果可以,请使用内置函数。但是,如果您必须使用内联汇编,我想知道您的问题是否是“额外”逗号。谷歌搜索 avr eor 会出现
eor r4,r4和eor r0,r22(注意 eor 命令后没有逗号)。我不是 avr 专家,但这是我首先要尝试的。 -
f#*k!你说得对。不应该有
,。无论如何,AVR 都是微控制器,所以程序空间很紧。 3 指令对于 C 来说是无与伦比的。再次感谢你们!
标签: c gcc assembly inline-assembly avr-gcc