필요한 상수 값 : 행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;
}
변환 (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에는 gcc가 내장되어 있습니다. 왜 그걸 사용하지 않니? 어쨌든 컴파일러에 의존합니다. 왜 plain C를 사용하지 않습니까? – Olaf
나는 올라프와있다 : 가능한 경우 내장 된 것을 사용하라. 그러나 반드시 인라인 asm을 사용해야한다면 문제가 "여분"쉼표인지 궁금합니다. 인터넷 검색은 'r4, r4'및 'eor r0, r22'로 표시됩니다 (eor 명령 다음에 쉼표가 없음). 나는 전문가는 아니지만 그게 내가 먼저 해보려는 것입니다. –
f # * k! 네가 옳아. 거기에는','가 없어야합니다. 어쨌든 AVR은 마이크로 컨트롤러이므로 프로그램 공간이 부족합니다. 3 인스트럭션은 C에게 탁월합니다. 다시 여러분 께 감사드립니다! – milkpirate