AVR: дизассемблируем прошивку

disassemblerИногда бывает необходимо посмотреть как компилятор скомпоновал прошивку,что бы понять что было оптимизировано, и в какие команды микроконтроллера avr был преобразован исходный текст на Си.

Если использовать avr-gcc (он же WinAvr), то для этой цели служит утилита avr-objdump.

На вход ей подается файл с расширением elf, который генерируется при линковке приложения.

Для дизассемблирования прошивки микроконтроллера avr atmega надо выполнить команду:

avr-objdump -dS test.elf > dump.asm

в файле dump.asm будет результат дизассемблирования.

Например, если дизассемблировать вот такую программу:

#include <avr/io.h>
 
int main( void )
{
  //настраиваем PB0 на выход
  DDRB = _BV( PB0 );
  while( 1 ) {
    //инвертируем состояние ножки PB0
    PORTB ^= _BV( PB0 );   
  }
  return 0;
}

То получим вот такой результат:

test.elf:     file format elf32-avr
 
Disassembly of section .text:
 
00000000 <__vectors>:
   0:	12 c0       	rjmp	.+36     	; 0x26 <__ctors_end>
   2:	19 c0       	rjmp	.+50     	; 0x36 <__bad_interrupt>
   4:	18 c0       	rjmp	.+48     	; 0x36 <__bad_interrupt>
   6:	17 c0       	rjmp	.+46     	; 0x36 <__bad_interrupt>
   8:	16 c0       	rjmp	.+44     	; 0x36 <__bad_interrupt>
   a:	15 c0       	rjmp	.+42     	; 0x36 <__bad_interrupt>
   c:	14 c0       	rjmp	.+40     	; 0x36 <__bad_interrupt>
   e:	13 c0       	rjmp	.+38     	; 0x36 <__bad_interrupt>
  10:	12 c0       	rjmp	.+36     	; 0x36 <__bad_interrupt>
  12:	11 c0       	rjmp	.+34     	; 0x36 <__bad_interrupt>
  14:	10 c0       	rjmp	.+32     	; 0x36 <__bad_interrupt>
  16:	0f c0       	rjmp	.+30     	; 0x36 <__bad_interrupt>
  18:	0e c0       	rjmp	.+28     	; 0x36 <__bad_interrupt>
  1a:	0d c0       	rjmp	.+26     	; 0x36 <__bad_interrupt>
  1c:	0c c0       	rjmp	.+24     	; 0x36 <__bad_interrupt>
  1e:	0b c0       	rjmp	.+22     	; 0x36 <__bad_interrupt>
  20:	0a c0       	rjmp	.+20     	; 0x36 <__bad_interrupt>
  22:	09 c0       	rjmp	.+18     	; 0x36 <__bad_interrupt>
  24:	08 c0       	rjmp	.+16     	; 0x36 <__bad_interrupt>
 
00000026 <__ctors_end>:
  26:	11 24       	eor	r1, r1
  28:	1f be       	out	0x3f, r1	; 63
  2a:	cf e5       	ldi	r28, 0x5F	; 95
  2c:	d4 e0       	ldi	r29, 0x04	; 4
  2e:	de bf       	out	0x3e, r29	; 62
  30:	cd bf       	out	0x3d, r28	; 61
  32:	02 d0       	rcall	.+4      	; 0x38 
  34:	08 c0       	rjmp	.+16     	; 0x46 <_exit>
 
00000036 <__bad_interrupt>:
  36:	e4 cf       	rjmp	.-56     	; 0x0 <__vectors>
 
00000038 :
#include <avr/io.h>
 
int main( void )
{
  //настраиваем PB0 на выход
  DDRB = _BV( PB0 );
  38:	81 e0       	ldi	r24, 0x01	; 1
  3a:	87 bb       	out	0x17, r24	; 23
  while( 1 ) {
    //инвертируем состояние ножки PB0
    PORTB ^= _BV( PB0 );   
  3c:	91 e0       	ldi	r25, 0x01	; 1
  3e:	88 b3       	in	r24, 0x18	; 24
  40:	89 27       	eor	r24, r25
  42:	88 bb       	out	0x18, r24	; 24
  44:	fc cf       	rjmp	.-8      	; 0x3e <__SP_H__>
 
00000046 <_exit>:
  46:	f8 94       	cli
 
00000048 <__stop_program>:
  48:	ff cf       	rjmp	.-2      	; 0x48 <__stop_program>
Запись опубликована в рубрике Микроконтроллеры avr с метками , , , . Добавьте в закладки постоянную ссылку.

11 комментариев: AVR: дизассемблируем прошивку

  1. Леван говорит:

    Огромное спасибо :) то что нужно!))

  2. Леван говорит:

    А команду для дизассемблирования нужно в программе вводить или в командной строке виндовс?

  3. Артём Двинин говорит:

    Пожалуйста, команду вводить в командной строке windows, а лучше в linux ;)

  4. Леван говорит:

    Не совсем понял как сделать.
    У меня фаил main.elf лежит на диске C.
    Мне что нужно писать avr-objdump -dS C:/main.elf > dump.asm
    Я так сделал ничего не получилось(

  5. Леван говорит:

    И есть ли просто утилиты куда засовываешь фаил .elf а они тебе .asm фаил

  6. Артём Двинин говорит:

    Наверно, надо полный путь указать к avr-objdump

  7. Артём Двинин говорит:

    Думаю, что есть, но мне avr-objdump’а хватает, по этому не могу ничего посоветовать.

  8. Кирилл говорит:

    А каким образом можно получить elf из bin или разобрать сам bin?

  9. Артём Двинин говорит:

    Из bin elf не получить, только наоборот. С прошивками формата bin работает vavrdisasm. Вам подо что надо Windows/Linux ?

  10. 4RESTER говорит:

    Неплохой дизассемблер для AVR8 — DasmAVR

  11. Артём Двинин говорит:

    Спасибо! Но он вроде бы только под windows?

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>