В Arduino скетч (прошивку) пишут на C, затем ее компилируют. Получают hex файл с прошивкой и загружают эту прошивку в микроконтроллер.

В процессе компиляции программы в Arduino так же создается ELF файл (Executable and Linkable Format) с возможностью включения отладочной информации.

Обратная задача - получить исходный листинг программы дизассемблируя двоичный (hex) файл с прошивкой.

Настройте среду разработки Arduino показывать подробный вывод при компиляции. В меню Файл / Настройки откройте окно диалога Настройки:

Настройка Arduino

Откройте или наберите в среде разработки Arduino какую нибудь программу, например, следующую:

int led = 4;
void setup() {
  pinMode(led, OUTPUT);
}
void loop() {
  digitalWrite(led, HIGH);
  delay(10);
  digitalWrite(led, LOW);
  delay(200);
}

На панели инструментов в программе Arduino нажмите кнопку проверить. Ваша программа будет скомпилирована. В среде Arduino исследуйте последние строки вывода компилятора и найдите там путь к файлам своей программы:

Программа Arduino

На этой картинке это /tmp/build5923081435602699287.tmp/Blink_ATtiny13.cpp.hex. Где Blink_ATtiny13.cpp.hex файл прошивки. Перейдите в командной строке в указанную папку. В этой же папке так же можно найти файл Blink_ATtiny13.cpp.elf

Дизассемблируем файл Blink_ATtiny13.cpp.elf

avr-objdump -d Blink_ATtiny13.cpp.elf
Blink_ATtiny13.cpp.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0:	09 c0       	rjmp	.+18     	; 0x14 <__ctors_end>
   2:	21 c0       	rjmp	.+66     	; 0x46 <__bad_interrupt>
   4:	20 c0       	rjmp	.+64     	; 0x46 <__bad_interrupt>
   6:	34 c0       	rjmp	.+104    	; 0x70 <__vector_3>
   8:	1e c0       	rjmp	.+60     	; 0x46 <__bad_interrupt>
   a:	1d c0       	rjmp	.+58     	; 0x46 <__bad_interrupt>
   c:	1c c0       	rjmp	.+56     	; 0x46 <__bad_interrupt>
   e:	1b c0       	rjmp	.+54     	; 0x46 <__bad_interrupt>
  10:	1a c0       	rjmp	.+52     	; 0x46 <__bad_interrupt>
  12:	19 c0       	rjmp	.+50     	; 0x46 <__bad_interrupt>

00000014 <__ctors_end>:
  14:	11 24       	eor	r1, r1
  16:	1f be       	out	0x3f, r1	; 63
  18:	cf e9       	ldi	r28, 0x9F	; 159
  1a:	cd bf       	out	0x3d, r28	; 61

0000001c <__do_copy_data>:
  1c:	10 e0       	ldi	r17, 0x00	; 0
  1e:	a0 e6       	ldi	r26, 0x60	; 96
  20:	b0 e0       	ldi	r27, 0x00	; 0
  22:	ec e7       	ldi	r30, 0x7C	; 124
  24:	f1 e0       	ldi	r31, 0x01	; 1
  26:	02 c0       	rjmp	.+4      	; 0x2c <.do_copy_data_start>

00000028 <.do_copy_data_loop>:
  28:	05 90       	lpm	r0, Z+
  2a:	0d 92       	st	X+, r0

0000002c <.do_copy_data_start>:
  2c:	a2 36       	cpi	r26, 0x62	; 98
  2e:	b1 07       	cpc	r27, r17
  30:	d9 f7       	brne	.-10     	; 0x28 <.do_copy_data_loop>

00000032 <__do_clear_bss>:
  32:	10 e0       	ldi	r17, 0x00	; 0
  34:	a2 e6       	ldi	r26, 0x62	; 98
  36:	b0 e0       	ldi	r27, 0x00	; 0
  38:	01 c0       	rjmp	.+2      	; 0x3c <.do_clear_bss_start>

0000003a <.do_clear_bss_loop>:
  3a:	1d 92       	st	X+, r1

0000003c <.do_clear_bss_start>:
  3c:	a6 36       	cpi	r26, 0x66	; 102
  3e:	b1 07       	cpc	r27, r17
  40:	e1 f7       	brne	.-8      	; 0x3a <.do_clear_bss_loop>
  42:	96 d0       	rcall	.+300    	; 0x170 <main>
  44:	99 c0       	rjmp	.+306    	; 0x178 <_exit>

00000046 <__bad_interrupt>:
  46:	dc cf       	rjmp	.-72     	; 0x0 <__vectors>

00000048 <loop>:
  48:	80 91 60 00 	lds	r24, 0x0060
  4c:	61 e0       	ldi	r22, 0x01	; 1
  4e:	6a d0       	rcall	.+212    	; 0x124 <digitalWrite>
  50:	8a e0       	ldi	r24, 0x0A	; 10
  52:	90 e0       	ldi	r25, 0x00	; 0
  54:	32 d0       	rcall	.+100    	; 0xba <delay>
  56:	80 91 60 00 	lds	r24, 0x0060
  5a:	60 e0       	ldi	r22, 0x00	; 0
  5c:	63 d0       	rcall	.+198    	; 0x124 <digitalWrite>
  5e:	88 ec       	ldi	r24, 0xC8	; 200
  60:	90 e0       	ldi	r25, 0x00	; 0
  62:	2b d0       	rcall	.+86     	; 0xba <delay>
  64:	08 95       	ret

00000066 <setup>:
  66:	80 91 60 00 	lds	r24, 0x0060
  6a:	61 e0       	ldi	r22, 0x01	; 1
  6c:	3f d0       	rcall	.+126    	; 0xec <pinMode>
  6e:	08 95       	ret

00000070 <__vector_3>:
  70:	1f 92       	push	r1
  72:	0f 92       	push	r0
  74:	0f b6       	in	r0, 0x3f	; 63
  76:	0f 92       	push	r0
  78:	11 24       	eor	r1, r1
  7a:	8f 93       	push	r24
  7c:	9f 93       	push	r25
  7e:	af 93       	push	r26
  80:	bf 93       	push	r27
  82:	80 91 62 00 	lds	r24, 0x0062
  86:	90 91 63 00 	lds	r25, 0x0063
  8a:	a0 91 64 00 	lds	r26, 0x0064
  8e:	b0 91 65 00 	lds	r27, 0x0065
  92:	01 96       	adiw	r24, 0x01	; 1
  94:	a1 1d       	adc	r26, r1
  96:	b1 1d       	adc	r27, r1
  98:	80 93 62 00 	sts	0x0062, r24
  9c:	90 93 63 00 	sts	0x0063, r25
  a0:	a0 93 64 00 	sts	0x0064, r26
  a4:	b0 93 65 00 	sts	0x0065, r27
  a8:	bf 91       	pop	r27
  aa:	af 91       	pop	r26
  ac:	9f 91       	pop	r25
  ae:	8f 91       	pop	r24
  b0:	0f 90       	pop	r0
  b2:	0f be       	out	0x3f, r0	; 63
  b4:	0f 90       	pop	r0
  b6:	1f 90       	pop	r1
  b8:	18 95       	reti

000000ba <delay>:
  ba:	20 e6       	ldi	r18, 0x60	; 96
  bc:	39 e0       	ldi	r19, 0x09	; 9
  be:	04 c0       	rjmp	.+8      	; 0xc8 <delay+0xe>
  c0:	f9 01       	movw	r30, r18
  c2:	31 97       	sbiw	r30, 0x01	; 1
  c4:	f1 f7       	brne	.-4      	; 0xc2 <delay+0x8>
  c6:	01 97       	sbiw	r24, 0x01	; 1
  c8:	00 97       	sbiw	r24, 0x00	; 0
  ca:	d1 f7       	brne	.-12     	; 0xc0 <delay+0x6>
  cc:	08 95       	ret

000000ce <init>:
  ce:	83 b7       	in	r24, 0x33	; 51
  d0:	81 60       	ori	r24, 0x01	; 1
  d2:	83 bf       	out	0x33, r24	; 51
  d4:	8f b5       	in	r24, 0x2f	; 47
  d6:	83 60       	ori	r24, 0x03	; 3
  d8:	8f bd       	out	0x2f, r24	; 47
  da:	89 b7       	in	r24, 0x39	; 57
  dc:	82 60       	ori	r24, 0x02	; 2
  de:	89 bf       	out	0x39, r24	; 57
  e0:	12 be       	out	0x32, r1	; 50
  e2:	78 94       	sei
  e4:	86 b1       	in	r24, 0x06	; 6
  e6:	87 68       	ori	r24, 0x87	; 135
  e8:	86 b9       	out	0x06, r24	; 6
  ea:	08 95       	ret

000000ec <pinMode>:
  ec:	38 2f       	mov	r19, r24
  ee:	86 30       	cpi	r24, 0x06	; 6
  f0:	c0 f4       	brcc	.+48     	; 0x122 <pinMode+0x36>
  f2:	66 23       	and	r22, r22
  f4:	61 f4       	brne	.+24     	; 0x10e <pinMode+0x22>
  f6:	27 b3       	in	r18, 0x17	; 23
  f8:	81 e0       	ldi	r24, 0x01	; 1
  fa:	90 e0       	ldi	r25, 0x00	; 0
  fc:	02 c0       	rjmp	.+4      	; 0x102 <pinMode+0x16>
  fe:	88 0f       	add	r24, r24
 100:	99 1f       	adc	r25, r25
 102:	3a 95       	dec	r19
 104:	e2 f7       	brpl	.-8      	; 0xfe <pinMode+0x12>
 106:	80 95       	com	r24
 108:	82 23       	and	r24, r18
 10a:	87 bb       	out	0x17, r24	; 23
 10c:	08 95       	ret
 10e:	27 b3       	in	r18, 0x17	; 23
 110:	81 e0       	ldi	r24, 0x01	; 1
 112:	90 e0       	ldi	r25, 0x00	; 0
 114:	02 c0       	rjmp	.+4      	; 0x11a <pinMode+0x2e>
 116:	88 0f       	add	r24, r24
 118:	99 1f       	adc	r25, r25
 11a:	3a 95       	dec	r19
 11c:	e2 f7       	brpl	.-8      	; 0x116 <pinMode+0x2a>
 11e:	28 2b       	or	r18, r24
 120:	27 bb       	out	0x17, r18	; 23
 122:	08 95       	ret

00000124 <digitalWrite>:
 124:	38 2f       	mov	r19, r24
 126:	86 30       	cpi	r24, 0x06	; 6
 128:	10 f5       	brcc	.+68     	; 0x16e <digitalWrite+0x4a>
 12a:	82 30       	cpi	r24, 0x02	; 2
 12c:	40 f4       	brcc	.+16     	; 0x13e <digitalWrite+0x1a>
 12e:	88 23       	and	r24, r24
 130:	19 f4       	brne	.+6      	; 0x138 <digitalWrite+0x14>
 132:	8f b5       	in	r24, 0x2f	; 47
 134:	8f 77       	andi	r24, 0x7F	; 127
 136:	02 c0       	rjmp	.+4      	; 0x13c <digitalWrite+0x18>
 138:	8f b5       	in	r24, 0x2f	; 47
 13a:	8f 7d       	andi	r24, 0xDF	; 223
 13c:	8f bd       	out	0x2f, r24	; 47
 13e:	66 23       	and	r22, r22
 140:	61 f4       	brne	.+24     	; 0x15a <digitalWrite+0x36>
 142:	28 b3       	in	r18, 0x18	; 24
 144:	81 e0       	ldi	r24, 0x01	; 1
 146:	90 e0       	ldi	r25, 0x00	; 0
 148:	02 c0       	rjmp	.+4      	; 0x14e <digitalWrite+0x2a>
 14a:	88 0f       	add	r24, r24
 14c:	99 1f       	adc	r25, r25
 14e:	3a 95       	dec	r19
 150:	e2 f7       	brpl	.-8      	; 0x14a <digitalWrite+0x26>
 152:	80 95       	com	r24
 154:	82 23       	and	r24, r18
 156:	88 bb       	out	0x18, r24	; 24
 158:	08 95       	ret
 15a:	28 b3       	in	r18, 0x18	; 24
 15c:	81 e0       	ldi	r24, 0x01	; 1
 15e:	90 e0       	ldi	r25, 0x00	; 0
 160:	02 c0       	rjmp	.+4      	; 0x166 <digitalWrite+0x42>
 162:	88 0f       	add	r24, r24
 164:	99 1f       	adc	r25, r25
 166:	3a 95       	dec	r19
 168:	e2 f7       	brpl	.-8      	; 0x162 <digitalWrite+0x3e>
 16a:	28 2b       	or	r18, r24
 16c:	28 bb       	out	0x18, r18	; 24
 16e:	08 95       	ret

00000170 <main>:
 170:	ae df       	rcall	.-164    	; 0xce <init>
 172:	79 df       	rcall	.-270    	; 0x66 <setup>
 174:	69 df       	rcall	.-302    	; 0x48 <loop>
 176:	fe cf       	rjmp	.-4      	; 0x174 <main+0x4>

00000178 <_exit>:
 178:	f8 94       	cli

0000017a <__stop_program>:
 17a:	ff cf       	rjmp	.-2      	; 0x17a <__stop_program>

В результате, из скетча на C мы получили программу на Assembler.

Хотите дизассемблировать прошивку (двоичный hex файл)? Выполните команду:

avr-objdump -D Blink_ATtiny13.cpp.hex -m AVR