были проблемы с atoi. (использую winAvr).
Функция работает если ее вызывать внутри другой функции, вызываемой из main().
Если степень вложения больше, то функция не работает.
Вот что выдает компилятор :
Код
000061c2 <atoi>:
61c2: fc 01 movw r30, r24
61c4: 88 27 eor r24, r24
61c6: 99 27 eor r25, r25
61c8: e8 94 clt
61ca: 21 91 ld r18, Z+
61cc: 20 32 cpi r18, 0x20; 32
61ce: e9 f3 breq .-6 ; 0x61ca <atoi+0x8>
61d0: 29 30 cpi r18, 0x09; 9
61d2: 10 f0 brcs .+4 ; 0x61d8 <atoi+0x16>
61d4: 2e 30 cpi r18, 0x0E; 14
61d6: c8 f3 brcs .-14 ; 0x61ca <atoi+0x8>
61d8: 2b 32 cpi r18, 0x2B; 43
61da: 41 f0 breq .+16 ; 0x61ec <atoi+0x2a>
61dc: 2d 32 cpi r18, 0x2D; 45
61de: 39 f4 brne .+14 ; 0x61ee <atoi+0x2c>
61e0: 68 94 set
61e2: 04 c0 rjmp .+8 ; 0x61ec <atoi+0x2a>
61e4: 0e 94 f3 31 call 0x63e6; 0x63e6 <__mulhi_const_10>
61e8: 82 0f add r24, r18
61ea: 91 1d adc r25, r1
61ec: 21 91 ld r18, Z+
61ee: 20 53 subi r18, 0x30; 48
61f0: 2a 30 cpi r18, 0x0A; 10
61f2: c0 f3 brcs .-16 ; 0x61e4 <atoi+0x22>
61f4: 1e f4 brtc .+6 ; 0x61fc <atoi+0x3a>
61f6: 90 95 com r25
61f8: 81 95 neg r24
61fa: 9f 4f sbci r25, 0xFF; 255
61fc: 08 95 ret
Код
000061fe <atol>:
61fe: 1f 93 push r17
6200: fc 01 movw r30, r24
6202: 99 27 eor r25, r25
6204: 88 27 eor r24, r24
6206: bc 01 movw r22, r24
6208: e8 94 clt
620a: 11 91 ld r17, Z+
620c: 10 32 cpi r17, 0x20; 32
620e: e9 f3 breq .-6 ; 0x620a <atol+0xc>
6210: 19 30 cpi r17, 0x09; 9
6212: 10 f0 brcs .+4 ; 0x6218 <atol+0x1a>
6214: 1e 30 cpi r17, 0x0E; 14
6216: c8 f3 brcs .-14 ; 0x620a <atol+0xc>
6218: 1b 32 cpi r17, 0x2B; 43
621a: 51 f0 breq .+20 ; 0x6230 <atol+0x32>
621c: 1d 32 cpi r17, 0x2D; 45
621e: 49 f4 brne .+18 ; 0x6232 <atol+0x34>
6220: 68 94 set
6222: 06 c0 rjmp .+12 ; 0x6230 <atol+0x32>
6224: 0e 94 de 31 call 0x63bc; 0x63bc <__mulsi_const_10>
6228: 61 0f add r22, r17
622a: 71 1d adc r23, r1
622c: 81 1d adc r24, r1
622e: 91 1d adc r25, r1
6230: 11 91 ld r17, Z+
6232: 10 53 subi r17, 0x30; 48
6234: 1a 30 cpi r17, 0x0A; 10
6236: b0 f3 brcs .-20 ; 0x6224 <atol+0x26>
6238: 3e f4 brtc .+14 ; 0x6248 <atol+0x4a>
623a: 90 95 com r25
623c: 80 95 com r24
623e: 70 95 com r23
6240: 61 95 neg r22
6242: 7f 4f sbci r23, 0xFF; 255
6244: 8f 4f sbci r24, 0xFF; 255
6246: 9f 4f sbci r25, 0xFF; 255
6248: 1f 91 pop r17
624a: 08 95 ret
Думаю что во всем виновата команда push в atol().
Сообщение отредактировал alex1979 - Aug 10 2008, 18:56