WinAVR erzeugt diese Files. Hier ein Beispiel von First Try:
Zunächst die C-Datei:
#include "asuro.h"
int main ()
{
Init ();
while (1);
return 0; //wird nicht erreicht
}
... und hier die lss-Datei:
test.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000028a 00000000 00000000 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .bss 00000012 00800060 00800060 000002fe 2**0
ALLOC
2 .stab 0000036c 00000000 00000000 00000300 2**2
CONTENTS, READONLY, DEBUGGING
3 .stabstr 00000084 00000000 00000000 0000066c 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_aranges 00000068 00000000 00000000 000006f0 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_pubnames 00000121 00000000 00000000 00000758 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_info 0000043c 00000000 00000000 00000879 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_abbrev 0000020a 00000000 00000000 00000cb5 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_line 0000058b 00000000 00000000 00000ebf 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_frame 00000070 00000000 00000000 0000144a 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 000001b5 00000000 00000000 000014ba 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 12 c0 rjmp .+36 ; 0x26 <__ctors_end>
2: 2b c0 rjmp .+86 ; 0x5a <__bad_interrupt>
4: 5e c0 rjmp .+188 ; 0xc2 <__vector_2>
6: 29 c0 rjmp .+82 ; 0x5a <__bad_interrupt>
8: 2b c0 rjmp .+86 ; 0x60 <__vector_4>
a: 27 c0 rjmp .+78 ; 0x5a <__bad_interrupt>
c: 26 c0 rjmp .+76 ; 0x5a <__bad_interrupt>
e: 25 c0 rjmp .+74 ; 0x5a <__bad_interrupt>
10: 24 c0 rjmp .+72 ; 0x5a <__bad_interrupt>
12: 23 c0 rjmp .+70 ; 0x5a <__bad_interrupt>
14: 22 c0 rjmp .+68 ; 0x5a <__bad_interrupt>
16: 21 c0 rjmp .+66 ; 0x5a <__bad_interrupt>
18: 20 c0 rjmp .+64 ; 0x5a <__bad_interrupt>
1a: 1f c0 rjmp .+62 ; 0x5a <__bad_interrupt>
1c: 69 c0 rjmp .+210 ; 0xf0 <__vector_14>
1e: 1d c0 rjmp .+58 ; 0x5a <__bad_interrupt>
20: 1c c0 rjmp .+56 ; 0x5a <__bad_interrupt>
22: 1b c0 rjmp .+54 ; 0x5a <__bad_interrupt>
24: 1a c0 rjmp .+52 ; 0x5a <__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
00000032 <__do_copy_data>:
32: 10 e0 ldi r17, 0x00 ; 0
34: a0 e6 ldi r26, 0x60 ; 96
36: b0 e0 ldi r27, 0x00 ; 0
38: ea e8 ldi r30, 0x8A ; 138
3a: f2 e0 ldi r31, 0x02 ; 2
3c: 02 c0 rjmp .+4 ; 0x42 <.do_copy_data_start>
0000003e <.do_copy_data_loop>:
3e: 05 90 lpm r0, Z+
40: 0d 92 st X+, r0
00000042 <.do_copy_data_start>:
42: a0 36 cpi r26, 0x60 ; 96
44: b1 07 cpc r27, r17
46: d9 f7 brne .-10 ; 0x3e <.do_copy_data_loop>
00000048 <__do_clear_bss>:
48: 10 e0 ldi r17, 0x00 ; 0
4a: a0 e6 ldi r26, 0x60 ; 96
4c: b0 e0 ldi r27, 0x00 ; 0
4e: 01 c0 rjmp .+2 ; 0x52 <.do_clear_bss_start>
00000050 <.do_clear_bss_loop>:
50: 1d 92 st X+, r1
00000052 <.do_clear_bss_start>:
52: a2 37 cpi r26, 0x72 ; 114
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <.do_clear_bss_loop>
58: 01 c0 rjmp .+2 ; 0x5c <main>
0000005a <__bad_interrupt>:
5a: d2 cf rjmp .-92 ; 0x0 <__vectors>
0000005c <main>:
#include "asuro.h"
int main(void)
{
5c: a6 d0 rcall .+332 ; 0x1aa <Init>
5e: ff cf rjmp .-2 ; 0x5e <main+0x2>
00000060 <__vector_4>:
\par Beispiel:
(Nicht vorhanden)
************************************************** ***************************/
SIGNAL (SIG_OVERFLOW2)
{
60: 1f 92 push r1
62: 0f 92 push r0
64: 0f b6 in r0, 0x3f ; 63
66: 0f 92 push r0
68: 11 24 eor r1, r1
6a: 8f 93 push r24
6c: 9f 93 push r25
6e: af 93 push r26
70: bf 93 push r27
TCNT2 += 0x25;
72: 84 b5 in r24, 0x24 ; 36
74: 8b 5d subi r24, 0xDB ; 219
76: 84 bd out 0x24, r24 ; 36
count36kHz ++;
78: 80 91 6d 00 lds r24, 0x006D
7c: 8f 5f subi r24, 0xFF ; 255
7e: 80 93 6d 00 sts 0x006D, r24
if (!count36kHz)
82: 80 91 6d 00 lds r24, 0x006D
86: 88 23 and r24, r24
88: 99 f4 brne .+38 ; 0xb0 <__vector_4+0x50>
timebase ++;
8a: 80 91 6e 00 lds r24, 0x006E
8e: 90 91 6f 00 lds r25, 0x006F
92: a0 91 70 00 lds r26, 0x0070
96: b0 91 71 00 lds r27, 0x0071
9a: 01 96 adiw r24, 0x01 ; 1
9c: a1 1d adc r26, r1
9e: b1 1d adc r27, r1
a0: 80 93 6e 00 sts 0x006E, r24
a4: 90 93 6f 00 sts 0x006F, r25
a8: a0 93 70 00 sts 0x0070, r26
ac: b0 93 71 00 sts 0x0071, r27
b0: bf 91 pop r27
b2: af 91 pop r26
b4: 9f 91 pop r25
b6: 8f 91 pop r24
b8: 0f 90 pop r0
ba: 0f be out 0x3f, r0 ; 63
bc: 0f 90 pop r0
be: 1f 90 pop r1
c0: 18 95 reti
000000c2 <__vector_2>:
#ifdef RC5_AVAILABLE
if (enableRC5 && !(count36kHz % 8))
IsrRC5(); // wird alle 222.2us aufgerufen
#endif
}
/************************************************** **************************/
/*
\brief
Interrupt-Funktion fuer den externen Interrupt 1.
\param
keine
\return
nichts
\see switched
\par
Hier wird 'nur' in der globalen Variablen switched vermerkt, dass ein\n
Switch (Taster) gedrueckt wurde und dieser Interrupt soeben aufgetreten ist.\n
Damit dieser Interrupt aber nicht permanent aufgerufen wird, solange der\n
Taster gedrueckt bleibt, wird die Funktion, dass ein Interrupt erzeugt wird,\n
ueber StopSwitch() abgeschaltet.\n
Nach einer Bearbeitung im eigenen Hauptprogramm, muss also die Funktion\n
StartSwitch() wieder Aufgerufen werden, um einen Tastendruck wieder ueber\n
einen Interrupt zu erkennen.
\par Beispiel:
(Nicht vorhanden)
************************************************** ***************************/
SIGNAL (SIG_INTERRUPT1)
{
c2: 1f 92 push r1
c4: 0f 92 push r0
c6: 0f b6 in r0, 0x3f ; 63
c8: 0f 92 push r0
ca: 11 24 eor r1, r1
cc: 8f 93 push r24
ce: 9f 93 push r25
switched = 1;
d0: 81 e0 ldi r24, 0x01 ; 1
d2: 90 e0 ldi r25, 0x00 ; 0
d4: 90 93 66 00 sts 0x0066, r25
d8: 80 93 65 00 sts 0x0065, r24
GICR &= ~(1 << INT1); // Externen Interrupt 1 sperren
dc: 8b b7 in r24, 0x3b ; 59
de: 8f 77 andi r24, 0x7F ; 127
e0: 8b bf out 0x3b, r24 ; 59
e2: 9f 91 pop r25
e4: 8f 91 pop r24
e6: 0f 90 pop r0
e8: 0f be out 0x3f, r0 ; 63
ea: 0f 90 pop r0
ec: 1f 90 pop r1
ee: 18 95 reti
000000f0 <__vector_14>:
// StopSwitch ();
}
/************************************************** **************************/
/*
\brief
Interrupt-Funktion fuer den AD-Wandler. Kann ueber autoencode gesteuert\n
die Odometrie-Zaehler in encoder hochzaehlen.
\param
keine
\return
nichts
\see
Die globale Variable autoencode wird hier ausgewertet. Ist sie nicht FALSE,\n
dann wird der AD-Wandler-Wert zum Zaehlen der Odometriewerte in der globalen\n
Variablen encoder benutzt.\n
Es wird auch der AD-Wandler-Kanal auf die 'andere' Seite der Odometrie\n
umgeschaltete und der AD-Wandler neu gestartet.\n
Somit wird erreicht, dass zumindest die Odometriemessung automatisch erfolgt.
\par Beispiel:
(Nicht vorhanden)
************************************************** ***************************/
SIGNAL (SIG_ADC)
{
f0: 1f 92 push r1
f2: 0f 92 push r0
f4: 0f b6 in r0, 0x3f ; 63
f6: 0f 92 push r0
f8: 11 24 eor r1, r1
fa: 2f 93 push r18
fc: 3f 93 push r19
fe: 4f 93 push r20
100: 8f 93 push r24
102: 9f 93 push r25
104: af 93 push r26
106: bf 93 push r27
108: ef 93 push r30
10a: ff 93 push r31
static unsigned char tmp [2], flag [2], toggle = FALSE;
unsigned char dval, lval;
if (autoencode)
10c: 80 91 67 00 lds r24, 0x0067
110: 90 91 68 00 lds r25, 0x0068
114: 89 2b or r24, r25
116: d9 f1 breq .+118 ; 0x18e <__vector_14+0x9e>
{
tmp [toggle] = ADCH;
118: 40 91 60 00 lds r20, 0x0060
11c: 24 2f mov r18, r20
11e: 33 27 eor r19, r19
120: 95 b1 in r25, 0x05 ; 5
122: f9 01 movw r30, r18
124: ed 59 subi r30, 0x9D ; 157
126: ff 4f sbci r31, 0xFF ; 255
128: 90 83 st Z, r25
if (toggle)
12a: 44 23 and r20, r20
12c: 11 f0 breq .+4 ; 0x132 <__vector_14+0x42>
{
ADMUX = (1 << ADLAR) | (1 << REFS0) | WHEEL_RIGHT;
12e: 80 e6 ldi r24, 0x60 ; 96
130: 01 c0 rjmp .+2 ; 0x134 <__vector_14+0x44>
dval = MY_ODO_DARK_VALUE_R;
lval = MY_ODO_LIGHT_VALUE_R;
}
else
{
ADMUX = (1 << ADLAR) | (1 << REFS0) | WHEEL_LEFT;
132: 81 e6 ldi r24, 0x61 ; 97
134: 87 b9 out 0x07, r24 ; 7
dval = MY_ODO_DARK_VALUE_L;
lval = MY_ODO_LIGHT_VALUE_L;
}
if ((tmp [toggle] < dval) && (flag[toggle] == TRUE))
136: 9c 38 cpi r25, 0x8C ; 140
138: 90 f4 brcc .+36 ; 0x15e <__vector_14+0x6e>
13a: d9 01 movw r26, r18
13c: af 59 subi r26, 0x9F ; 159
13e: bf 4f sbci r27, 0xFF ; 255
140: 8c 91 ld r24, X
142: 81 30 cpi r24, 0x01 ; 1
144: 01 f5 brne .+64 ; 0x186 <__vector_14+0x96>
{
encoder [toggle] ++;
146: f9 01 movw r30, r18
148: ee 0f add r30, r30
14a: ff 1f adc r31, r31
14c: e7 59 subi r30, 0x97 ; 151
14e: ff 4f sbci r31, 0xFF ; 255
150: 80 81 ld r24, Z
152: 91 81 ldd r25, Z+1 ; 0x01
154: 01 96 adiw r24, 0x01 ; 1
156: 91 83 std Z+1, r25 ; 0x01
158: 80 83 st Z, r24
flag [toggle] = FALSE;
15a: 1c 92 st X, r1
15c: 14 c0 rjmp .+40 ; 0x186 <__vector_14+0x96>
}
if ((tmp [toggle] > lval) && (flag [toggle] == FALSE))
15e: 91 3a cpi r25, 0xA1 ; 161
160: 90 f0 brcs .+36 ; 0x186 <__vector_14+0x96>
162: d9 01 movw r26, r18
164: af 59 subi r26, 0x9F ; 159
166: bf 4f sbci r27, 0xFF ; 255
168: 8c 91 ld r24, X
16a: 88 23 and r24, r24
16c: 61 f4 brne .+24 ; 0x186 <__vector_14+0x96>
{
encoder [toggle] ++;
16e: f9 01 movw r30, r18
170: ee 0f add r30, r30
172: ff 1f adc r31, r31
174: e7 59 subi r30, 0x97 ; 151
176: ff 4f sbci r31, 0xFF ; 255
178: 80 81 ld r24, Z
17a: 91 81 ldd r25, Z+1 ; 0x01
17c: 01 96 adiw r24, 0x01 ; 1
17e: 91 83 std Z+1, r25 ; 0x01
180: 80 83 st Z, r24
flag [toggle] = TRUE;
182: 81 e0 ldi r24, 0x01 ; 1
184: 8c 93 st X, r24
}
toggle ^= 1;
186: 81 e0 ldi r24, 0x01 ; 1
188: 48 27 eor r20, r24
18a: 40 93 60 00 sts 0x0060, r20
18e: ff 91 pop r31
190: ef 91 pop r30
192: bf 91 pop r27
194: af 91 pop r26
196: 9f 91 pop r25
198: 8f 91 pop r24
19a: 4f 91 pop r20
19c: 3f 91 pop r19
19e: 2f 91 pop r18
1a0: 0f 90 pop r0
1a2: 0f be out 0x3f, r0 ; 63
1a4: 0f 90 pop r0
1a6: 1f 90 pop r1
1a8: 18 95 reti
000001aa <Init>:
1aa: 89 e7 ldi r24, 0x79 ; 121
1ac: 85 bd out 0x25, r24 ; 37
1ae: 81 e9 ldi r24, 0x91 ; 145
1b0: 83 bd out 0x23, r24 ; 35
1b2: 89 b7 in r24, 0x39 ; 57
1b4: 80 64 ori r24, 0x40 ; 64
1b6: 89 bf out 0x39, r24 ; 57
1b8: 1b b8 out 0x0b, r1 ; 11
1ba: 1a b8 out 0x0a, r1 ; 10
1bc: 96 e8 ldi r25, 0x86 ; 134
1be: 90 bd out 0x20, r25 ; 32
1c0: 8f ec ldi r24, 0xCF ; 207
1c2: 89 b9 out 0x09, r24 ; 9
1c4: 8f e3 ldi r24, 0x3F ; 63
1c6: 87 bb out 0x17, r24 ; 23
1c8: 84 ef ldi r24, 0xF4 ; 244
1ca: 81 bb out 0x11, r24 ; 17
1cc: 81 ea ldi r24, 0xA1 ; 161
1ce: 8f bd out 0x2f, r24 ; 47
1d0: 82 e0 ldi r24, 0x02 ; 2
1d2: 8e bd out 0x2e, r24 ; 46
1d4: 96 b9 out 0x06, r25 ; 6
1d6: 97 98 cbi 0x12, 7 ; 18
1d8: 80 e0 ldi r24, 0x00 ; 0
1da: 27 d0 rcall .+78 ; 0x22a <FrontLED>
1dc: 61 e0 ldi r22, 0x01 ; 1
1de: 81 e0 ldi r24, 0x01 ; 1
1e0: 2f d0 rcall .+94 ; 0x240 <BackLED>
1e2: 60 e0 ldi r22, 0x00 ; 0
1e4: 80 e0 ldi r24, 0x00 ; 0
1e6: 2c d0 rcall .+88 ; 0x240 <BackLED>
1e8: 81 e0 ldi r24, 0x01 ; 1
1ea: 0c d0 rcall .+24 ; 0x204 <StatusLED>
1ec: 60 e2 ldi r22, 0x20 ; 32
1ee: 80 e2 ldi r24, 0x20 ; 32
1f0: 43 d0 rcall .+134 ; 0x278 <MotorDir>
1f2: 60 e0 ldi r22, 0x00 ; 0
1f4: 80 e0 ldi r24, 0x00 ; 0
1f6: 37 d0 rcall .+110 ; 0x266 <MotorSpeed>
1f8: 10 92 68 00 sts 0x0068, r1
1fc: 10 92 67 00 sts 0x0067, r1
200: 78 94 sei
202: 08 95 ret
00000204 <StatusLED>:
204: 88 23 and r24, r24
206: 11 f4 brne .+4 ; 0x20c <StatusLED+0x8>
208: c0 98 cbi 0x18, 0 ; 24
20a: 03 c0 rjmp .+6 ; 0x212 <StatusLED+0xe>
20c: 81 30 cpi r24, 0x01 ; 1
20e: 19 f4 brne .+6 ; 0x216 <StatusLED+0x12>
210: c0 9a sbi 0x18, 0 ; 24
212: 92 98 cbi 0x12, 2 ; 18
214: 08 95 ret
216: 83 30 cpi r24, 0x03 ; 3
218: 19 f4 brne .+6 ; 0x220 <StatusLED+0x1c>
21a: c0 9a sbi 0x18, 0 ; 24
21c: 92 9a sbi 0x12, 2 ; 18
21e: 08 95 ret
220: 82 30 cpi r24, 0x02 ; 2
222: 11 f4 brne .+4 ; 0x228 <StatusLED+0x24>
224: c0 98 cbi 0x18, 0 ; 24
226: 92 9a sbi 0x12, 2 ; 18
228: 08 95 ret
0000022a <FrontLED>:
22a: 22 b3 in r18, 0x12 ; 18
22c: 2f 7b andi r18, 0xBF ; 191
22e: 99 27 eor r25, r25
230: 36 e0 ldi r19, 0x06 ; 6
232: 88 0f add r24, r24
234: 99 1f adc r25, r25
236: 3a 95 dec r19
238: e1 f7 brne .-8 ; 0x232 <FrontLED+0x8>
23a: 28 2b or r18, r24
23c: 22 bb out 0x12, r18 ; 18
23e: 08 95 ret
00000240 <BackLED>:
240: 98 2f mov r25, r24
242: 88 23 and r24, r24
244: 11 f4 brne .+4 ; 0x24a <BackLED+0xa>
246: 66 23 and r22, r22
248: 49 f0 breq .+18 ; 0x25c <BackLED+0x1c>
24a: 97 98 cbi 0x12, 7 ; 18
24c: 84 b3 in r24, 0x14 ; 20
24e: 83 60 ori r24, 0x03 ; 3
250: 84 bb out 0x14, r24 ; 20
252: 85 b3 in r24, 0x15 ; 21
254: 83 60 ori r24, 0x03 ; 3
256: 85 bb out 0x15, r24 ; 21
258: 99 23 and r25, r25
25a: 09 f4 brne .+2 ; 0x25e <BackLED+0x1e>
25c: a9 98 cbi 0x15, 1 ; 21
25e: 66 23 and r22, r22
260: 09 f4 brne .+2 ; 0x264 <BackLED+0x24>
262: a8 98 cbi 0x15, 0 ; 21
264: 08 95 ret
00000266 <MotorSpeed>:
266: 28 2f mov r18, r24
268: 33 27 eor r19, r19
26a: 3b bd out 0x2b, r19 ; 43
26c: 2a bd out 0x2a, r18 ; 42
26e: 86 2f mov r24, r22
270: 99 27 eor r25, r25
272: 99 bd out 0x29, r25 ; 41
274: 88 bd out 0x28, r24 ; 40
276: 08 95 ret
00000278 <MotorDir>:
278: 22 b3 in r18, 0x12 ; 18
27a: 2f 7c andi r18, 0xCF ; 207
27c: 28 2b or r18, r24
27e: 22 bb out 0x12, r18 ; 18
280: 88 b3 in r24, 0x18 ; 24
282: 8f 7c andi r24, 0xCF ; 207
284: 86 2b or r24, r22
286: 88 bb out 0x18, r24 ; 24
288: 08 95 ret
Wirklich interessant!
Im make-File findet sich dieser Abschnitt:
# Create extended listing file from ELF output file.
%.lss: %.elf
$(OBJDUMP) -h -S $< > $@
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.