ce désassembleur de fichier .hex pour AVR Atmel a été conçu comme complément de avr-objdump, pour contrôler ce que génère avr-gcc1 aucun paramètrele nom de ce désassembleur est avrd, par opposition à avra, assembleur pour AVR Atmel utilisé sous Linux
le source assembleur généré peut être directement exploité par avra
lancer avrd sans aucun paramètre permet d'afficher une aidefichier 1.bat :
@echo off .\avrd.exe pause
résultat :
2 aucune option
syntax : avrd file.hex [ options ] options : -rules:rulesfile.txt deal with some addr (<addr> in hex, one rule by line, ; cmt) <addr> endofit first address after interrupt vectors <addr> .dw <count> don't try to disassemble <count> words at this address <addr> label NAME provide a label for this address -addhex add source hex file in a comment -addbin add extracted bin code in a comment -addsram add SRAM accessed address in a comment -addio add IO accessed address in a comment -addall equiv -addhex -addbin -addsram -addio together -out:disassembled.asm file to write result in (default stdout) -inc:avrdef.inc use avr register and bit definitions file -map:linkedprog.map use map file to provide addresses labels -forcehexa force literal values in hexadecimal
lancer avrd avec un fichier .hex en paramètre mais sans aucune option permet un désassemblage brutfichier 2.bat :
@echo off .\avrd.exe sample-ATtiny15L.hex pause
résultat :
3 option -inc
; ====================================== ; ASM : .cseg .org 0 ; size 2 bytes rjmp L001E ; 0000 C00E .org 9 ; size 28 bytes ; ====================================== L0012: ; rcall clr r1 ; eor r1,r1 0012 2411 L0014: ; branch dec r1 ; 0014 941A brne L0014 ; 0016 F7F1 dec r16 ; 0018 950A brne L0014 ; 001A F7E1 ret ; 001C 9508 L001E: ; rjmp sbi 23,4 ; 001E 9ABC L0020: ; rjmp sbi 24,4 ; 0020 9AC4 ldi r16,255 ; ser r16 0022 EF0F rcall L0012 ; 0024 DFF6 cbi 24,4 ; 0026 98C4 ldi r16,255 ; ser r16 0028 EF0F rcall L0012 ; 002A DFF3 rjmp L0020 ; 002C CFF9
si on connaît le microprocesseur utilisé et si on dispose du fichier .inc correspondant, ce fichier sera interprété pour en extraire les définitions .equfichier 3.bat :
@echo off .\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc pause
résultat :
4 option -rules : endofit
; ====================================== ; ASM : .nolist .include "tn15def.inc" .list .cseg .org 0 ; size 2 bytes rjmp L001E ; 0000 C00E .org 9 ; size 28 bytes ; ====================================== L0012: ; rcall clr r1 ; eor r1,r1 0012 2411 L0014: ; branch dec r1 ; 0014 941A brne L0014 ; 0016 F7F1 dec r16 ; 0018 950A brne L0014 ; 001A F7E1 ret ; 001C 9508 L001E: ; rjmp sbi DDRB,DDB4 ; sbi 17,4 001E 9ABC Data Direction Register, Port B : L0020: ; rjmp sbi PORTB,PORTB4 ; sbi 18,4 0020 9AC4 Data Register, Port B : ldi r16,255 ; ser r16 0022 EF0F rcall L0012 ; 0024 DFF6 cbi PORTB,PORTB4 ; cbi 18,4 0026 98C4 Data Register, Port B : ldi r16,255 ; ser r16 0028 EF0F rcall L0012 ; 002A DFF3 rjmp L0020 ; 002C CFF9
dès que l'on a repéré où s'arrête la table des vecteurs d'interruption, il est intéressant de l'indiquer dans un fichier de règlesfichier 4.bat :
@echo off .\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc -rules:rules-4.txt pause
fichier rules-4.txt :
0012 endofit
résultat :
5 option -rules : label
; ====================================== ; ASM : .nolist .include "tn15def.inc" .list .cseg .org 0 ; size 2 bytes rjmp L001E ; 0000 C00E Reset .org 9 ; size 28 bytes ; ====================================== L0012: ; rcall clr r1 ; eor r1,r1 0012 2411 L0014: ; branch dec r1 ; 0014 941A brne L0014 ; 0016 F7F1 dec r16 ; 0018 950A brne L0014 ; 001A F7E1 ret ; 001C 9508 ; ====================================== L001E: ; rjmp from it -- Reset sbi DDRB,DDB4 ; sbi 17,4 001E 9ABC Data Direction Register, Port B : L0020: ; rjmp sbi PORTB,PORTB4 ; sbi 18,4 0020 9AC4 Data Register, Port B : ldi r16,255 ; ser r16 0022 EF0F rcall L0012 ; 0024 DFF6 cbi PORTB,PORTB4 ; cbi 18,4 0026 98C4 Data Register, Port B : ldi r16,255 ; ser r16 0028 EF0F rcall L0012 ; 002A DFF3 rjmp L0020 ; 002C CFF9
dès que l'on a compris le rôle d'une fonctionnalité, il est intéressant de l'indiquer dans un fichier de règlesfichier 5.bat :
@echo off .\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc -rules:rules-5.txt pause
fichier rules-5.txt :
0012 endofit 0012 label WAIT
résultat :
6 options -addhex -addbin
; ====================================== ; ASM : .nolist .include "tn15def.inc" .list .cseg .org 0 ; size 2 bytes rjmp L001E ; 0000 C00E Reset .org 9 ; size 28 bytes ; ====================================== WAIT: ; rcall clr r1 ; eor r1,r1 0012 2411 L0014: ; branch dec r1 ; 0014 941A brne L0014 ; 0016 F7F1 dec r16 ; 0018 950A brne L0014 ; 001A F7E1 ret ; 001C 9508 ; ====================================== L001E: ; rjmp from it -- Reset sbi DDRB,DDB4 ; sbi 17,4 001E 9ABC Data Direction Register, Port B : L0020: ; rjmp sbi PORTB,PORTB4 ; sbi 18,4 0020 9AC4 Data Register, Port B : ldi r16,255 ; ser r16 0022 EF0F rcall WAIT ; 0012 0024 DFF6 cbi PORTB,PORTB4 ; cbi 18,4 0026 98C4 Data Register, Port B : ldi r16,255 ; ser r16 0028 EF0F rcall WAIT ; 0012 002A DFF3 rjmp L0020 ; 002C CFF9
en cas de doute quant à l'organisation du fichier .hex on peut regarder l'interprétation qui en est faitefichier 6.bat :
@echo off .\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc -rules:rules-5.txt -addhex -addbin pause
résultat :
7 options -addsram -addio
; ====================================== ; HEX : ; 02 0000 02 esar : 00 00 = FC ; 02 0000 00 data : 0E C0 = 30 ; 10 0012 00 data : 11 24 1A 94 F1 F7 0A 95 E1 F7 08 95 BC 9A C4 9A = 4B ; 0C 0022 00 data : 0F EF F6 DF C4 98 0F EF F3 DF F9 CF = 0B ; 00 0000 01 eofr : = FF ; ====================================== ; BIN : ; .org 0 ; size 2 bytes ; 0000 0E C0 ; .org 9 ; size 28 bytes ; 0012 11 24 1A 94 F1 F7 0A 95 E1 F7 08 95 BC 9A C4 9A ; 0022 0F EF F6 DF C4 98 0F EF F3 DF F9 CF ; ====================================== ; ASM : .nolist .include "tn15def.inc" .list .cseg .org 0 ; size 2 bytes rjmp L001E ; 0000 C00E Reset .org 9 ; size 28 bytes ; ====================================== WAIT: ; rcall clr r1 ; eor r1,r1 0012 2411 L0014: ; branch dec r1 ; 0014 941A brne L0014 ; 0016 F7F1 dec r16 ; 0018 950A brne L0014 ; 001A F7E1 ret ; 001C 9508 ; ====================================== L001E: ; rjmp from it -- Reset sbi DDRB,DDB4 ; sbi 17,4 001E 9ABC Data Direction Register, Port B : L0020: ; rjmp sbi PORTB,PORTB4 ; sbi 18,4 0020 9AC4 Data Register, Port B : ldi r16,255 ; ser r16 0022 EF0F rcall WAIT ; 0012 0024 DFF6 cbi PORTB,PORTB4 ; cbi 18,4 0026 98C4 Data Register, Port B : ldi r16,255 ; ser r16 0028 EF0F rcall WAIT ; 0012 002A DFF3 rjmp L0020 ; 002C CFF9
on peut ausi observer l'utilisation des espaces d'adressagefichier 7.bat :
@echo off .\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc -rules:rules-5.txt -addsram -addio pause
résultat :
; ====================================== ; ASM : .nolist .include "tn15def.inc" .list .cseg .org 0 ; size 2 bytes rjmp L001E ; 0000 C00E Reset .org 9 ; size 28 bytes ; ====================================== WAIT: ; rcall clr r1 ; eor r1,r1 0012 2411 L0014: ; branch dec r1 ; 0014 941A brne L0014 ; 0016 F7F1 dec r16 ; 0018 950A brne L0014 ; 001A F7E1 ret ; 001C 9508 ; ====================================== L001E: ; rjmp from it -- Reset sbi DDRB,DDB4 ; sbi 17,4 001E 9ABC Data Direction Register, Port B : L0020: ; rjmp sbi PORTB,PORTB4 ; sbi 18,4 0020 9AC4 Data Register, Port B : ldi r16,255 ; ser r16 0022 EF0F rcall WAIT ; 0012 0024 DFF6 cbi PORTB,PORTB4 ; cbi 18,4 0026 98C4 Data Register, Port B : ldi r16,255 ; ser r16 0028 EF0F rcall WAIT ; 0012 002A DFF3 rjmp L0020 ; 002C CFF9 ; ====================================== ; SRAM : ; ====================================== ; IO : ; 0017 out DDRB : Data Direction Register, Port B ; 0018 out PORTB : Data Register, Port B