=====Quelques infos sur le désassemblage d'un programme arduino===== Il faut dans Fichier->Préférences, cocher Afficher les résultats détaillés pendant compilation ET téléversement Question d'un étudiant sur le [[tdethindus1]] pour calculer la valeur de l'octet d'instruction de l'EEPROM 25C040, quelle est l'écriture la plus efficace? Processus de génération du binaire exécutable Arduino: https://github.com/arduino/Arduino/wiki/Build-Process Emplacement du .hex généré: https://stackoverflow.com/questions/11607834/where-are-the-hex-files-compiled-by-arduino Jeu d'instruction de l'ATMEGA328P: http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf unsigned char genere_value8(unsigned short int addr) { return ( 3 | (((addr>>8)&1)<<3)); } unsigned char genere_value8_2(unsigned short int addr) { return ( 3 | (((addr&0x100))>>5)); } unsigned short int genere_value16(unsigned short int addr) { return ( ((3 | (((addr>>8)&1)<<3))<<8) | (addr&0xff) ); } unsigned short int genere_value16_2(unsigned short int addr) { return ( ((3 | (((addr&0x100)>>5)<<8))) | (addr&0xff)); } // the setup routine runs once when you press reset: void setup() { } // the loop routine runs over and over again forever: void loop() { unsigned short int add=0; add= PINB; add|= (PINB<<8); add=(genere_value8(add)); PORTB=add>>8; PORTB=add&0xff; add= PINB; add|= (PINB<<8); add=(genere_value16(add)); PORTB=add>>8; PORTB=add&0xff; add= PINB; add|= (PINB<<8); add=(genere_value16_2(add)); PORTB=add>>8; PORTB=add&0xff; } la compilation du sketch dans l'IDE arduino indique: /usr/share/arduino/hardware/tools/avr/bin/avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o /tmp/build3959672033620118453.tmp/test_disassembly.cpp.elf /tmp/build3959672033620118453.tmp/test_disassembly.cpp.o /tmp/build3959672033620118453.tmp/core.a GARDER L'IDE ARDUINO OUVERTE, sinon les fichiers temporaires sont effacés. Pour obtenir le code désassemblé à partir du .o ou du .elf: http://forum.arduino.cc/index.php?topic=73638.0 /hardware/tools/avr/bin/avr-objdump -D /.cpp.elf > .asm Pour désassembler tout le programme: /usr/share/arduino/hardware/tools/avr/bin/avr-objdump -D /tmp/build3959672033620118453.tmp/test_disassembly.cpp.elf > ~/test_disassembly.cpp.asm Pour désassembler le sketch: /usr/share/arduino/hardware/tools/avr/bin/avr-objdump -D /tmp/build3959672033620118453.tmp/test_disassembly.cpp.o > ~/test_disassembly.cpp.asm gedit ~/test_disassembly.cpp.asm /tmp/build3959672033620118453.tmp/test_disassembly.cpp.o: format de fichier elf32-avr Déassemblage de la section .text._Z13genere_value8t : 00000000 <_Z13genere_value8t>: 0: 91 70 andi r25, 0x01 ; 1 2: 89 2f mov r24, r25 4: 88 0f add r24, r24 6: 88 0f add r24, r24 8: 88 0f add r24, r24 a: 83 60 ori r24, 0x03 ; 3 c: 08 95 ret Déassemblage de la section .text._Z15genere_value8_2t : 00000000 <_Z15genere_value8_2t>: 0: 88 27 eor r24, r24 2: 91 70 andi r25, 0x01 ; 1 4: 25 e0 ldi r18, 0x05 ; 5 6: 96 95 lsr r25 8: 87 95 ror r24 a: 2a 95 dec r18 c: 01 f4 brne .+0 ; 0xe <_Z15genere_value8_2t+0xe> e: 83 60 ori r24, 0x03 ; 3 10: 08 95 ret Déassemblage de la section .text._Z14genere_value16t : 00000000 <_Z14genere_value16t>: 0: 9c 01 movw r18, r24 2: 95 e0 ldi r25, 0x05 ; 5 4: 36 95 lsr r19 6: 27 95 ror r18 8: 9a 95 dec r25 a: 01 f4 brne .+0 ; 0xc <_Z14genere_value16t+0xc> c: 28 70 andi r18, 0x08 ; 8 e: 33 27 eor r19, r19 10: 23 60 ori r18, 0x03 ; 3 12: 32 2f mov r19, r18 14: 22 27 eor r18, r18 16: a9 01 movw r20, r18 18: 48 2b or r20, r24 1a: ca 01 movw r24, r20 1c: 08 95 ret Déassemblage de la section .text._Z16genere_value16_2t : 00000000 <_Z16genere_value16_2t>: 0: 9c 01 movw r18, r24 2: 33 27 eor r19, r19 4: 23 60 ori r18, 0x03 ; 3 6: 88 27 eor r24, r24 8: 91 70 andi r25, 0x01 ; 1 a: 45 e0 ldi r20, 0x05 ; 5 c: 96 95 lsr r25 e: 87 95 ror r24 10: 4a 95 dec r20 12: 01 f4 brne .+0 ; 0x14 <_Z16genere_value16_2t+0x14> 14: 98 2f mov r25, r24 16: 88 27 eor r24, r24 18: 82 2b or r24, r18 1a: 93 2b or r25, r19 1c: 08 95 ret Déassemblage de la section .text.setup : 00000000 : 0: 08 95 ret Déassemblage de la section .text.loop : 00000000 : 0: 83 b1 in r24, 0x03 ; 3 2: 23 b1 in r18, 0x03 ; 3 4: 90 e0 ldi r25, 0x00 ; 0 6: 92 2b or r25, r18 8: 0e 94 00 00 call 0 ; 0x0 c: 15 b8 out 0x05, r1 ; 5 e: 85 b9 out 0x05, r24 ; 5 10: 83 b1 in r24, 0x03 ; 3 12: 23 b1 in r18, 0x03 ; 3 14: 90 e0 ldi r25, 0x00 ; 0 16: 92 2b or r25, r18 18: 0e 94 00 00 call 0 ; 0x0 1c: 95 b9 out 0x05, r25 ; 5 1e: 85 b9 out 0x05, r24 ; 5 20: 83 b1 in r24, 0x03 ; 3 22: 23 b1 in r18, 0x03 ; 3 24: 90 e0 ldi r25, 0x00 ; 0 26: 92 2b or r25, r18 28: 0e 94 00 00 call 0 ; 0x0 2c: 95 b9 out 0x05, r25 ; 5 2e: 85 b9 out 0x05, r24 ; 5 30: 08 95 ret ===remarque concernant le décalage à gauche=== L'opération de décalage a gauche (LSL page 120 de http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf ) se fait en pratique grace à Add Rd,Rd qui multiplie Rd par 2 (page 32) .