avrd

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-gcc

le 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

1 aucun paramètre

lancer avrd sans aucun paramètre permet d'afficher une aide

fichier 1.bat :

@echo off
.\avrd.exe
pause

résultat :

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
2 aucune option

lancer avrd avec un fichier .hex en paramètre mais sans aucune option permet un désassemblage brut

fichier 2.bat :

@echo off
.\avrd.exe sample-ATtiny15L.hex
pause

résultat :

; ======================================
; 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
3 option -inc

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 .equ

fichier 3.bat :

@echo off
.\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc
pause

résultat :

; ======================================
; 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
4 option -rules : endofit

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ègles

fichier 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 :

; ======================================
; 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
5 option -rules : label

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ègles

fichier 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 :

; ======================================
; 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
6 options -addhex -addbin

en cas de doute quant à l'organisation du fichier .hex on peut regarder l'interprétation qui en est faite

fichier 6.bat :

@echo off
.\avrd.exe sample-ATtiny15L.hex -inc:tn15def.inc -rules:rules-5.txt -addhex -addbin
pause

résultat :

; ======================================
; 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
7 options -addsram -addio

on peut ausi observer l'utilisation des espaces d'adressage

fichier 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