Supposons que nous ayons le morceau de code C suivant pour un avr-8bit:
int v1=1;
int v2=2;
v2=v2+v1;
Je m'attendais à ce que le démontage suivant
ldi r18, 1;
ldi r19, 2;
add r19, r18;
mais après avoir couru:
avr-gcc -mmcu=atmega2560 Test.c -o Test.elf
et
avr-objdump -S Test.elf > Test.lss
J'ai le démontage suivant
ldi r24, 0x01 ; 1
ldi r25, 0x00 ; 0
std Y+2, r25 ; 0x02
std Y+1, r24 ; 0x01
ldi r24, 0x02 ; 2
ldi r25, 0x00 ; 0
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
ldd r18, Y+3 ; 0x03
ldd r19, Y+4 ; 0x04
ldd r24, Y+1 ; 0x01
ldd r25, Y+2 ; 0x02
add r24, r18
adc r25, r19
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
y a-t-il quelqu'un qui peut m'aider à comprendre le résultat du démonteur?
Edit: En utilisant char, l'assemblage devient:
ldi r24, 0x01
std Y+1, r24
ldi r24, 0x02
std Y+2, r24
ldd r25, Y+2
ldd r24, Y+1
add r24, r25
std Y+2, r24
Quand y a-t-il une instruction standard?
-O3
peut produire du code cassé? [citation nécessaire] (et non, le code C qui invoque un comportementComme j'ai trouvé un exemple de code, je ferai de mon commentaire une réponse - d'autres ont déjà expliqué le problème.
Beaucoup de code intégré avec lequel je travaille définit des types supplémentaires qui sont spécifiques à leur taille, tels que "uint8, uint16, uint32" pour les entiers non signés, par exemple. De cette façon, vous savez toujours exactement à quel type de variable vous avez affaire. Surtout dans les petits imbriqués, signés, flottants, les "int" de taille / signature indéfinies vous coûteront au mieux des cycles de processeur et, au pire, causeront de graves bogues.
Voici nos # définitions actuelles:
la source
Votre code C utilise des variables entières 16 bits (int). Le compilateur ne peut pas lire dans vos pensées, il compile donc exactement ce qui se trouve dans le fichier source. Donc, si vous voulez des variables 8 bits, vous devez utiliser le type respectif.
En conséquence, vous obtiendrez toujours le stockage des valeurs dans la mémoire (bien que plus simple). Je ne suis pas si bon en C, mais à mon humble avis, il y a quelques options pour assigner la variable à un registre, si vous voulez que certaines variables soient dans les registres au lieu de RAM. Quelque chose comme:
Notez que tous les registres ne sont pas disponibles pour de telles astuces.
Alors, la conclusion? Écrivez vos programmes en assembleur. Ils seront toujours plus petits, plus rapides et faciles à lire / à soutenir.
la source