Je vais avoir ce code:AVR GCC, fonctions stub assemblage C, EOR et la valeur constante requise
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;
}
ce qui se traduit (par AVR gcc version 4.8.1
avec -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
Mais alors le compilateur se plaint comme ça:
|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)) ===|
Les lignes mentionnées sont celles avec les commandes eor
. Pourquoi le compilateur a-t-il des problèmes avec ça? Les registres sont même supérieurs (> = r16) où presque toutes les opérations sont possibles. constant value required
me semble comme il s'attend à un littéral ... Je ne comprends pas.
gcc a des built-ins pour cela. Pourquoi ne pas les utiliser? Vous êtes de toute façon dépendant du compilateur. Pourquoi ne pas utiliser C simple? – Olaf
Je suis avec Olaf: Utilisez des builtins si vous le pouvez. Cependant, si vous devez utiliser inline asm, je me demande si votre problème est une virgule "extra". Googling pour avr eor retourne 'eor r4, r4' et' eor r0, r22' (notez la virgule après la commande eor). Je ne suis pas un expert avr, mais c'est ce que j'essayerais en premier. –
f # * k! tu as raison. il ne devrait pas y avoir ','. Quoi qu'il en soit, les AVR sont des microcontrôleurs, donc l'espace du programme est restreint. 3 instruction est imbattable pour C. merci encore! – milkpirate