telect - если серьезно, твоя логика бы работала, если бы тут сидела куча голодных безработных программистов, готовых ухватится за любой заказ. Однако в реальности ситуация другая - заказов на рынке больше, чем желающих их выполнять. Так что у меня есть возможность выбирать и назначать свою цену.
Назначенная мной вилка - 5-10 штук - абсолютно в рынке. я даже думаю что многие коллеги попеняют мне, что я демпингую. Так что твои 1000р - ничего кроме смеха не вызывают. Нет денег - иди мимо.
<Однако в реальности ситуация другая - заказов на рынке больше, чем желающих их выполнять. Так что у меня есть возможность выбирать и назначать свою цену.
Ну тут просто кто-то найти деньги не может на канаву, вот я и написал. Ну если у вас всё так хорошо, то супер. Я ж не знал. Тут только дальнейшего процветания пожелать остается
Обесценивать работу в той сфере, в которой мало что понимаешь - обычное дело. Забавно было читать как про 1000р (с утра подняло настроение), так и про цену устройства ПРОМЫШЛЕННОЙ РАЗРАБОТКИ.
1м3 копания траншеи вручную на самом легком грунте (а таких, как известно, не бывает) стоит от 500р. При этом человек, который будет выполнять эту работу должен знать только что такое лопата.
Для программирования микроконтроллера исполнитель должен знать си++, структуру МК, схемотехнику, английский язык в достаточном для чтения даташитов объеме. Так что 1000р для такого человека - это, как было сказано выше, программа на уровне "блинк без дэлей". Делать что-то большее за эти деньги - это просто неуважение к себе.
Бывают случаи, когда самому интересно или есть практически готовые (свои) наработки. Но это - частные случаи.
Гы - это из реалии микроконтролеров. К яве и питону это никак не относится.
Какие такие реалии?
Листинг был на асме, при распечатывании результата после трансляции.
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?
Листинг был на асме, при распечатывании результата после трансляции.
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?
Он не "был", он "есть". И не только "на асме", си-компилятор тоже вполне нормально генерит листинги. И весьма полезен. Но для практиков, а не для теоретиков.
И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".
Листинг был на асме, при распечатывании результата после трансляции.
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?
Он не "был", он "есть". И не только "на асме", си-компилятор тоже вполне нормально генерит листинги. И весьма полезен. Но для практиков, а не для теоретиков.
И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".
В ардуинке - можно. Компилятор сохраняет в эльфе номера строк исходника.
В ардуинке - можно. Компилятор сохраняет в эльфе номера строк исходника.
"Номера строк исходника" - это хорошо. Но эта функция - для пошаговой отладки. Для привязки строк исходника к результирующему коду отладчиком. При имеющемся в наличии оригинальном файле исходника.
Если в наличии исходника нет, то сами номера строк (без их содержимого) - малоинформативны.
Или в ардуине в elf и содержимое строк исходника может сохраняться? Но ведь в обсуждаемом случае (когда автор не хочет отдавать исходник), а значит - автор кода позаботится о том, чтобы этих строк в .elf не было. Так что: из .elf только дизасм.
telect - если серьезно, твоя логика бы работала, если бы тут сидела куча голодных безработных программистов, готовых ухватится за любой заказ. Однако в реальности ситуация другая - заказов на рынке больше, чем желающих их выполнять. Так что у меня есть возможность выбирать и назначать свою цену.
Назначенная мной вилка - 5-10 штук - абсолютно в рынке. я даже думаю что многие коллеги попеняют мне, что я демпингую. Так что твои 1000р - ничего кроме смеха не вызывают. Нет денег - иди мимо.
Да мне канава не нужна и не я на деньги жалуюсь, так что не передергивай.
Хотел еще продолжить срач, но стер. Лениво уже стало отвечать
Ну тут просто кто-то найти деньги не может на канаву, вот я и написал. Ну если у вас всё так хорошо, то супер. Я ж не знал. Тут только дальнейшего процветания пожелать остается
Готовый пинжак тоже 2000р стоит, а попробуй заказать сшить по фигуре. За 1000 точно не получится.
у нас только работа - 10тыр. )))
А что, до пятницы не продержишься? Жаль!
Обесценивать работу в той сфере, в которой мало что понимаешь - обычное дело. Забавно было читать как про 1000р (с утра подняло настроение), так и про цену устройства ПРОМЫШЛЕННОЙ РАЗРАБОТКИ.
Нафига ? Оплатите себе курсы трейдинга и гребите миллионы лопатой на акциях )
1м3 копания траншеи вручную на самом легком грунте (а таких, как известно, не бывает) стоит от 500р. При этом человек, который будет выполнять эту работу должен знать только что такое лопата.
Для программирования микроконтроллера исполнитель должен знать си++, структуру МК, схемотехнику, английский язык в достаточном для чтения даташитов объеме. Так что 1000р для такого человека - это, как было сказано выше, программа на уровне "блинк без дэлей". Делать что-то большее за эти деньги - это просто неуважение к себе.
Бывают случаи, когда самому интересно или есть практически готовые (свои) наработки. Но это - частные случаи.
А с чего наработки должны снижать стоимость работы ? Такие "частные случаи" - скорее теория. Может быть продажа готового кода без листинга.
А с чего наработки должны снижать стоимость работы ?
Согласен. Но можно снизить предоставляя только машинный код. Только, типа, прошивка. А дальше гребись в ассемблере. Забавно...
Вообще, такие слова как листинг - это что то явно из прошлого.)
Вообще, такие слова как листинг - это что то явно из прошлого.)
Гы - это из реалии микроконтролеров. К яве и питону это никак не относится.
В бейсике была команда LIST, по-моему. Так что к языкам уровнем повыше асма тоже можно применить понятие "листинг", полагаю.
Гы - это из реалии микроконтролеров. К яве и питону это никак не относится.
Какие такие реалии?
Листинг был на асме, при распечатывании результата после трансляции.
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?
Это просто команда. В данном случае, команда "смотреть исходный текст".
https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B3#:~:text=%D0%9B%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B3%20(%D1%86%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B1%D1%83%D0%BC%D0%B0%D0%B3%D0%B8)%20%E2%80%94%20%D0%B2%D0%BD%D0%B5%D1%81%D0%B5%D0%BD%D0%B8%D0%B5,%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%BE%D0%B9%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B%20%D0%B8%D0%BB%D0%B8%20%D0%B5%D1%91%20%D1%87%D0%B0%D1%81%D1%82%D0%B8.
это то что говорит википедия
Вот именно: "бумажная распечатка текста компьютерной программы или её части."
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?
Он не "был", он "есть". И не только "на асме", си-компилятор тоже вполне нормально генерит листинги. И весьма полезен. Но для практиков, а не для теоретиков.
И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?
Он не "был", он "есть". И не только "на асме", си-компилятор тоже вполне нормально генерит листинги. И весьма полезен. Но для практиков, а не для теоретиков.
И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".
В ардуинке - можно. Компилятор сохраняет в эльфе номера строк исходника.
Вот такая команда:
Тут путь для линукса, для винды иначе.
и вот такой файл получается для штатного Блинка из примеров:
Blink.ino.elf: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 5c 00 jmp 0xb8 ; 0xb8 <__ctors_end> 4: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 8: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 10: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 14: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 18: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 1c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 20: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 24: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 28: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 2c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 30: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 34: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 38: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 3c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 40: 0c 94 17 01 jmp 0x22e ; 0x22e <__vector_16> 44: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 48: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 4c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 50: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 54: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 58: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 5c: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 60: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 64: 0c 94 6e 00 jmp 0xdc ; 0xdc <__bad_interrupt> 00000068 <__trampolines_end>: 68: 00 00 nop 6a: 00 08 sbc r0, r0 6c: 00 02 muls r16, r16 6e: 01 00 .word 0x0001 ; ???? 70: 00 03 mulsu r16, r16 72: 04 07 cpc r16, r20 ... 0000007c <port_to_output_PGM>: 7c: 00 00 00 00 25 00 28 00 2b 00 ....%.(.+. 00000086 <port_to_mode_PGM>: 86: 00 00 00 00 24 00 27 00 2a 00 ....$.'.*. 00000090 <digital_pin_to_port_PGM>: 90: 04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03 ................ a0: 03 03 03 03 .... 000000a4 <digital_pin_to_bit_mask_PGM>: a4: 01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02 ..... @...... .. b4: 04 08 10 20 ... 000000b8 <__ctors_end>: b8: 11 24 eor r1, r1 ba: 1f be out 0x3f, r1 ; 63 bc: cf ef ldi r28, 0xFF ; 255 be: d8 e0 ldi r29, 0x08 ; 8 c0: de bf out 0x3e, r29 ; 62 c2: cd bf out 0x3d, r28 ; 61 000000c4 <__do_clear_bss>: c4: 21 e0 ldi r18, 0x01 ; 1 c6: a0 e0 ldi r26, 0x00 ; 0 c8: b1 e0 ldi r27, 0x01 ; 1 ca: 01 c0 rjmp .+2 ; 0xce <.do_clear_bss_start> 000000cc <.do_clear_bss_loop>: cc: 1d 92 st X+, r1 000000ce <.do_clear_bss_start>: ce: a9 30 cpi r26, 0x09 ; 9 d0: b2 07 cpc r27, r18 d2: e1 f7 brne .-8 ; 0xcc <.do_clear_bss_loop> d4: 0e 94 61 01 call 0x2c2 ; 0x2c2 <main> d8: 0c 94 d2 01 jmp 0x3a4 ; 0x3a4 <_exit> 000000dc <__bad_interrupt>: dc: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 000000e0 <digitalWrite>: } } void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); e0: 90 e0 ldi r25, 0x00 ; 0 e2: fc 01 movw r30, r24 e4: e8 59 subi r30, 0x98 ; 152 e6: ff 4f sbci r31, 0xFF ; 255 e8: 24 91 lpm r18, Z uint8_t bit = digitalPinToBitMask(pin); ea: fc 01 movw r30, r24 ec: ec 55 subi r30, 0x5C ; 92 ee: ff 4f sbci r31, 0xFF ; 255 f0: 34 91 lpm r19, Z uint8_t port = digitalPinToPort(pin); f2: fc 01 movw r30, r24 f4: e0 57 subi r30, 0x70 ; 112 f6: ff 4f sbci r31, 0xFF ; 255 f8: e4 91 lpm r30, Z volatile uint8_t *out; if (port == NOT_A_PIN) return; fa: ee 23 and r30, r30 fc: c9 f0 breq .+50 ; 0x130 <digitalWrite+0x50> // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); fe: 22 23 and r18, r18 100: 39 f0 breq .+14 ; 0x110 <digitalWrite+0x30> // //static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); //static inline void turnOffPWM(uint8_t timer) static void turnOffPWM(uint8_t timer) { switch (timer) 102: 23 30 cpi r18, 0x03 ; 3 104: 01 f1 breq .+64 ; 0x146 <digitalWrite+0x66> 106: a8 f4 brcc .+42 ; 0x132 <digitalWrite+0x52> 108: 21 30 cpi r18, 0x01 ; 1 10a: 19 f1 breq .+70 ; 0x152 <digitalWrite+0x72> 10c: 22 30 cpi r18, 0x02 ; 2 10e: 29 f1 breq .+74 ; 0x15a <digitalWrite+0x7a> // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); out = portOutputRegister(port); 110: f0 e0 ldi r31, 0x00 ; 0 112: ee 0f add r30, r30 114: ff 1f adc r31, r31 116: e4 58 subi r30, 0x84 ; 132 118: ff 4f sbci r31, 0xFF ; 255 11a: a5 91 lpm r26, Z+ 11c: b4 91 lpm r27, Z uint8_t oldSREG = SREG; 11e: 8f b7 in r24, 0x3f ; 63 cli(); 120: f8 94 cli if (val == LOW) { *out &= ~bit; 122: ec 91 ld r30, X out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { 124: 61 11 cpse r22, r1 126: 26 c0 rjmp .+76 ; 0x174 <digitalWrite+0x94> *out &= ~bit; 128: 30 95 com r19 12a: 3e 23 and r19, r30 } else { *out |= bit; 12c: 3c 93 st X, r19 } SREG = oldSREG; 12e: 8f bf out 0x3f, r24 ; 63 } 130: 08 95 ret // //static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); //static inline void turnOffPWM(uint8_t timer) static void turnOffPWM(uint8_t timer) { switch (timer) 132: 27 30 cpi r18, 0x07 ; 7 134: a9 f0 breq .+42 ; 0x160 <digitalWrite+0x80> 136: 28 30 cpi r18, 0x08 ; 8 138: c9 f0 breq .+50 ; 0x16c <digitalWrite+0x8c> 13a: 24 30 cpi r18, 0x04 ; 4 13c: 49 f7 brne .-46 ; 0x110 <digitalWrite+0x30> { #if defined(TCCR1A) && defined(COM1A1) case TIMER1A: cbi(TCCR1A, COM1A1); break; #endif #if defined(TCCR1A) && defined(COM1B1) case TIMER1B: cbi(TCCR1A, COM1B1); break; 13e: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__DATA_REGION_ORIGIN__+0x20> 142: 8f 7d andi r24, 0xDF ; 223 144: 03 c0 rjmp .+6 ; 0x14c <digitalWrite+0x6c> static void turnOffPWM(uint8_t timer) { switch (timer) { #if defined(TCCR1A) && defined(COM1A1) case TIMER1A: cbi(TCCR1A, COM1A1); break; 146: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__DATA_REGION_ORIGIN__+0x20> 14a: 8f 77 andi r24, 0x7F ; 127 #endif #if defined(TCCR1A) && defined(COM1B1) case TIMER1B: cbi(TCCR1A, COM1B1); break; 14c: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__DATA_REGION_ORIGIN__+0x20> 150: df cf rjmp .-66 ; 0x110 <digitalWrite+0x30> #if defined(TCCR2) && defined(COM21) case TIMER2: cbi(TCCR2, COM21); break; #endif #if defined(TCCR0A) && defined(COM0A1) case TIMER0A: cbi(TCCR0A, COM0A1); break; 152: 84 b5 in r24, 0x24 ; 36 154: 8f 77 andi r24, 0x7F ; 127 #endif #if defined(TCCR0A) && defined(COM0B1) case TIMER0B: cbi(TCCR0A, COM0B1); break; 156: 84 bd out 0x24, r24 ; 36 158: db cf rjmp .-74 ; 0x110 <digitalWrite+0x30> 15a: 84 b5 in r24, 0x24 ; 36 15c: 8f 7d andi r24, 0xDF ; 223 15e: fb cf rjmp .-10 ; 0x156 <digitalWrite+0x76> #endif #if defined(TCCR2A) && defined(COM2A1) case TIMER2A: cbi(TCCR2A, COM2A1); break; 160: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50> 164: 8f 77 andi r24, 0x7F ; 127 #endif #if defined(TCCR2A) && defined(COM2B1) case TIMER2B: cbi(TCCR2A, COM2B1); break; 166: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50> 16a: d2 cf rjmp .-92 ; 0x110 <digitalWrite+0x30> 16c: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50> 170: 8f 7d andi r24, 0xDF ; 223 172: f9 cf rjmp .-14 ; 0x166 <digitalWrite+0x86> cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; 174: 3e 2b or r19, r30 176: da cf rjmp .-76 ; 0x12c <digitalWrite+0x4c> 00000178 <micros>: return m; } unsigned long micros() { unsigned long m; uint8_t oldSREG = SREG, t; 178: 3f b7 in r19, 0x3f ; 63 cli(); 17a: f8 94 cli m = timer0_overflow_count; 17c: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <timer0_overflow_count> 180: 90 91 06 01 lds r25, 0x0106 ; 0x800106 <timer0_overflow_count+0x1> 184: a0 91 07 01 lds r26, 0x0107 ; 0x800107 <timer0_overflow_count+0x2> 188: b0 91 08 01 lds r27, 0x0108 ; 0x800108 <timer0_overflow_count+0x3> #if defined(TCNT0) t = TCNT0; 18c: 26 b5 in r18, 0x26 ; 38 #else #error TIMER 0 not defined #endif #ifdef TIFR0 if ((TIFR0 & _BV(TOV0)) && (t < 255)) 18e: a8 9b sbis 0x15, 0 ; 21 190: 05 c0 rjmp .+10 ; 0x19c <micros+0x24> 192: 2f 3f cpi r18, 0xFF ; 255 194: 19 f0 breq .+6 ; 0x19c <micros+0x24> m++; 196: 01 96 adiw r24, 0x01 ; 1 198: a1 1d adc r26, r1 19a: b1 1d adc r27, r1 #else if ((TIFR & _BV(TOV0)) && (t < 255)) m++; #endif SREG = oldSREG; 19c: 3f bf out 0x3f, r19 ; 63 return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); 19e: ba 2f mov r27, r26 1a0: a9 2f mov r26, r25 1a2: 98 2f mov r25, r24 1a4: 88 27 eor r24, r24 1a6: bc 01 movw r22, r24 1a8: cd 01 movw r24, r26 1aa: 62 0f add r22, r18 1ac: 71 1d adc r23, r1 1ae: 81 1d adc r24, r1 1b0: 91 1d adc r25, r1 1b2: 42 e0 ldi r20, 0x02 ; 2 1b4: 66 0f add r22, r22 1b6: 77 1f adc r23, r23 1b8: 88 1f adc r24, r24 1ba: 99 1f adc r25, r25 1bc: 4a 95 dec r20 1be: d1 f7 brne .-12 ; 0x1b4 <micros+0x3c> } 1c0: 08 95 ret 000001c2 <delay.constprop.0>: void delay(unsigned long ms) 1c2: 8f 92 push r8 1c4: 9f 92 push r9 1c6: af 92 push r10 1c8: bf 92 push r11 1ca: cf 92 push r12 1cc: df 92 push r13 1ce: ef 92 push r14 1d0: ff 92 push r15 { uint32_t start = micros(); 1d2: 0e 94 bc 00 call 0x178 ; 0x178 <micros> 1d6: 4b 01 movw r8, r22 1d8: 5c 01 movw r10, r24 1da: 88 ee ldi r24, 0xE8 ; 232 1dc: c8 2e mov r12, r24 1de: 83 e0 ldi r24, 0x03 ; 3 1e0: d8 2e mov r13, r24 1e2: e1 2c mov r14, r1 1e4: f1 2c mov r15, r1 while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { 1e6: 0e 94 bc 00 call 0x178 ; 0x178 <micros> 1ea: 68 19 sub r22, r8 1ec: 79 09 sbc r23, r9 1ee: 8a 09 sbc r24, r10 1f0: 9b 09 sbc r25, r11 1f2: 68 3e cpi r22, 0xE8 ; 232 1f4: 73 40 sbci r23, 0x03 ; 3 1f6: 81 05 cpc r24, r1 1f8: 91 05 cpc r25, r1 1fa: a8 f3 brcs .-22 ; 0x1e6 <delay.constprop.0+0x24> ms--; 1fc: 21 e0 ldi r18, 0x01 ; 1 1fe: c2 1a sub r12, r18 200: d1 08 sbc r13, r1 202: e1 08 sbc r14, r1 204: f1 08 sbc r15, r1 start += 1000; 206: 88 ee ldi r24, 0xE8 ; 232 208: 88 0e add r8, r24 20a: 83 e0 ldi r24, 0x03 ; 3 20c: 98 1e adc r9, r24 20e: a1 1c adc r10, r1 210: b1 1c adc r11, r1 { uint32_t start = micros(); while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { 212: c1 14 cp r12, r1 214: d1 04 cpc r13, r1 216: e1 04 cpc r14, r1 218: f1 04 cpc r15, r1 21a: 29 f7 brne .-54 ; 0x1e6 <delay.constprop.0+0x24> ms--; start += 1000; } } } 21c: ff 90 pop r15 21e: ef 90 pop r14 220: df 90 pop r13 222: cf 90 pop r12 224: bf 90 pop r11 226: af 90 pop r10 228: 9f 90 pop r9 22a: 8f 90 pop r8 22c: 08 95 ret 0000022e <__vector_16>: #if defined(TIM0_OVF_vect) ISR(TIM0_OVF_vect) #else ISR(TIMER0_OVF_vect) #endif { 22e: 1f 92 push r1 230: 0f 92 push r0 232: 0f b6 in r0, 0x3f ; 63 234: 0f 92 push r0 236: 11 24 eor r1, r1 238: 2f 93 push r18 23a: 3f 93 push r19 23c: 8f 93 push r24 23e: 9f 93 push r25 240: af 93 push r26 242: bf 93 push r27 // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) unsigned long m = timer0_millis; 244: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <timer0_millis> 248: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <timer0_millis+0x1> 24c: a0 91 03 01 lds r26, 0x0103 ; 0x800103 <timer0_millis+0x2> 250: b0 91 04 01 lds r27, 0x0104 ; 0x800104 <timer0_millis+0x3> unsigned char f = timer0_fract; 254: 30 91 00 01 lds r19, 0x0100 ; 0x800100 <_edata> m += MILLIS_INC; f += FRACT_INC; 258: 23 e0 ldi r18, 0x03 ; 3 25a: 23 0f add r18, r19 if (f >= FRACT_MAX) { 25c: 2d 37 cpi r18, 0x7D ; 125 25e: 58 f5 brcc .+86 ; 0x2b6 <__vector_16+0x88> // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) unsigned long m = timer0_millis; unsigned char f = timer0_fract; m += MILLIS_INC; 260: 01 96 adiw r24, 0x01 ; 1 262: a1 1d adc r26, r1 264: b1 1d adc r27, r1 if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer0_fract = f; 266: 20 93 00 01 sts 0x0100, r18 ; 0x800100 <_edata> timer0_millis = m; 26a: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <timer0_millis> 26e: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <timer0_millis+0x1> 272: a0 93 03 01 sts 0x0103, r26 ; 0x800103 <timer0_millis+0x2> 276: b0 93 04 01 sts 0x0104, r27 ; 0x800104 <timer0_millis+0x3> timer0_overflow_count++; 27a: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <timer0_overflow_count> 27e: 90 91 06 01 lds r25, 0x0106 ; 0x800106 <timer0_overflow_count+0x1> 282: a0 91 07 01 lds r26, 0x0107 ; 0x800107 <timer0_overflow_count+0x2> 286: b0 91 08 01 lds r27, 0x0108 ; 0x800108 <timer0_overflow_count+0x3> 28a: 01 96 adiw r24, 0x01 ; 1 28c: a1 1d adc r26, r1 28e: b1 1d adc r27, r1 290: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <timer0_overflow_count> 294: 90 93 06 01 sts 0x0106, r25 ; 0x800106 <timer0_overflow_count+0x1> 298: a0 93 07 01 sts 0x0107, r26 ; 0x800107 <timer0_overflow_count+0x2> 29c: b0 93 08 01 sts 0x0108, r27 ; 0x800108 <timer0_overflow_count+0x3> } 2a0: bf 91 pop r27 2a2: af 91 pop r26 2a4: 9f 91 pop r25 2a6: 8f 91 pop r24 2a8: 3f 91 pop r19 2aa: 2f 91 pop r18 2ac: 0f 90 pop r0 2ae: 0f be out 0x3f, r0 ; 63 2b0: 0f 90 pop r0 2b2: 1f 90 pop r1 2b4: 18 95 reti unsigned char f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; 2b6: 26 e8 ldi r18, 0x86 ; 134 2b8: 23 0f add r18, r19 m += 1; 2ba: 02 96 adiw r24, 0x02 ; 2 2bc: a1 1d adc r26, r1 2be: b1 1d adc r27, r1 2c0: d2 cf rjmp .-92 ; 0x266 <__vector_16+0x38> 000002c2 <main>: void init() { // this needs to be called before setup() or some functions won't // work there sei(); 2c2: 78 94 sei // on the ATmega168, timer 0 is also used for fast hardware pwm // (using phase-correct PWM would mean that timer 0 overflowed half as often // resulting in different millis() behavior on the ATmega8 and ATmega168) #if defined(TCCR0A) && defined(WGM01) sbi(TCCR0A, WGM01); 2c4: 84 b5 in r24, 0x24 ; 36 2c6: 82 60 ori r24, 0x02 ; 2 2c8: 84 bd out 0x24, r24 ; 36 sbi(TCCR0A, WGM00); 2ca: 84 b5 in r24, 0x24 ; 36 2cc: 81 60 ori r24, 0x01 ; 1 2ce: 84 bd out 0x24, r24 ; 36 // this combination is for the standard atmega8 sbi(TCCR0, CS01); sbi(TCCR0, CS00); #elif defined(TCCR0B) && defined(CS01) && defined(CS00) // this combination is for the standard 168/328/1280/2560 sbi(TCCR0B, CS01); 2d0: 85 b5 in r24, 0x25 ; 37 2d2: 82 60 ori r24, 0x02 ; 2 2d4: 85 bd out 0x25, r24 ; 37 sbi(TCCR0B, CS00); 2d6: 85 b5 in r24, 0x25 ; 37 2d8: 81 60 ori r24, 0x01 ; 1 2da: 85 bd out 0x25, r24 ; 37 // enable timer 0 overflow interrupt #if defined(TIMSK) && defined(TOIE0) sbi(TIMSK, TOIE0); #elif defined(TIMSK0) && defined(TOIE0) sbi(TIMSK0, TOIE0); 2dc: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__DATA_REGION_ORIGIN__+0xe> 2e0: 81 60 ori r24, 0x01 ; 1 2e2: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <__DATA_REGION_ORIGIN__+0xe> // this is better for motors as it ensures an even waveform // note, however, that fast pwm mode can achieve a frequency of up // 8 MHz (with a 16 MHz clock) at 50% duty cycle #if defined(TCCR1B) && defined(CS11) && defined(CS10) TCCR1B = 0; 2e6: 10 92 81 00 sts 0x0081, r1 ; 0x800081 <__DATA_REGION_ORIGIN__+0x21> // set timer 1 prescale factor to 64 sbi(TCCR1B, CS11); 2ea: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__DATA_REGION_ORIGIN__+0x21> 2ee: 82 60 ori r24, 0x02 ; 2 2f0: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__DATA_REGION_ORIGIN__+0x21> #if F_CPU >= 8000000L sbi(TCCR1B, CS10); 2f4: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__DATA_REGION_ORIGIN__+0x21> 2f8: 81 60 ori r24, 0x01 ; 1 2fa: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__DATA_REGION_ORIGIN__+0x21> sbi(TCCR1, CS10); #endif #endif // put timer 1 in 8-bit phase correct pwm mode #if defined(TCCR1A) && defined(WGM10) sbi(TCCR1A, WGM10); 2fe: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__DATA_REGION_ORIGIN__+0x20> 302: 81 60 ori r24, 0x01 ; 1 304: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__DATA_REGION_ORIGIN__+0x20> // set timer 2 prescale factor to 64 #if defined(TCCR2) && defined(CS22) sbi(TCCR2, CS22); #elif defined(TCCR2B) && defined(CS22) sbi(TCCR2B, CS22); 308: 80 91 b1 00 lds r24, 0x00B1 ; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51> 30c: 84 60 ori r24, 0x04 ; 4 30e: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51> // configure timer 2 for phase correct pwm (8-bit) #if defined(TCCR2) && defined(WGM20) sbi(TCCR2, WGM20); #elif defined(TCCR2A) && defined(WGM20) sbi(TCCR2A, WGM20); 312: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50> 316: 81 60 ori r24, 0x01 ; 1 318: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50> #endif #if defined(ADCSRA) // set a2d prescaler so we are inside the desired 50-200 KHz range. #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz sbi(ADCSRA, ADPS2); 31c: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> 320: 84 60 ori r24, 0x04 ; 4 322: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> sbi(ADCSRA, ADPS1); 326: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> 32a: 82 60 ori r24, 0x02 ; 2 32c: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> sbi(ADCSRA, ADPS0); 330: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> 334: 81 60 ori r24, 0x01 ; 1 336: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> cbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #endif // enable a2d conversions sbi(ADCSRA, ADEN); 33a: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> 33e: 80 68 ori r24, 0x80 ; 128 340: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a> // here so they can be used as normal digital i/o; they will be // reconnected in Serial.begin() #if defined(UCSRB) UCSRB = 0; #elif defined(UCSR0B) UCSR0B = 0; 344: 10 92 c1 00 sts 0x00C1, r1 ; 0x8000c1 <__DATA_REGION_ORIGIN__+0x61> #include "wiring_private.h" #include "pins_arduino.h" void pinMode(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); 348: e1 eb ldi r30, 0xB1 ; 177 34a: f0 e0 ldi r31, 0x00 ; 0 34c: 24 91 lpm r18, Z uint8_t port = digitalPinToPort(pin); 34e: ed e9 ldi r30, 0x9D ; 157 350: f0 e0 ldi r31, 0x00 ; 0 352: 84 91 lpm r24, Z volatile uint8_t *reg, *out; if (port == NOT_A_PIN) return; 354: 88 23 and r24, r24 356: 99 f0 breq .+38 ; 0x37e <main+0xbc> // JWS: can I let the optimizer do this? reg = portModeRegister(port); 358: 90 e0 ldi r25, 0x00 ; 0 35a: 88 0f add r24, r24 35c: 99 1f adc r25, r25 35e: fc 01 movw r30, r24 360: ea 57 subi r30, 0x7A ; 122 362: ff 4f sbci r31, 0xFF ; 255 364: a5 91 lpm r26, Z+ 366: b4 91 lpm r27, Z out = portOutputRegister(port); 368: fc 01 movw r30, r24 36a: e4 58 subi r30, 0x84 ; 132 36c: ff 4f sbci r31, 0xFF ; 255 36e: 85 91 lpm r24, Z+ 370: 94 91 lpm r25, Z cli(); *reg &= ~bit; *out |= bit; SREG = oldSREG; } else { uint8_t oldSREG = SREG; 372: 8f b7 in r24, 0x3f ; 63 cli(); 374: f8 94 cli *reg |= bit; 376: ec 91 ld r30, X 378: e2 2b or r30, r18 37a: ec 93 st X, r30 SREG = oldSREG; 37c: 8f bf out 0x3f, r24 ; 63 setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); 37e: c0 e0 ldi r28, 0x00 ; 0 380: d0 e0 ldi r29, 0x00 ; 0 pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 382: 61 e0 ldi r22, 0x01 ; 1 384: 8d e0 ldi r24, 0x0D ; 13 386: 0e 94 70 00 call 0xe0 ; 0xe0 <digitalWrite> delay(1000); // wait for a second 38a: 0e 94 e1 00 call 0x1c2 ; 0x1c2 <delay.constprop.0> digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 38e: 60 e0 ldi r22, 0x00 ; 0 390: 8d e0 ldi r24, 0x0D ; 13 392: 0e 94 70 00 call 0xe0 ; 0xe0 <digitalWrite> delay(1000); // wait for a second 396: 0e 94 e1 00 call 0x1c2 ; 0x1c2 <delay.constprop.0> 39a: 20 97 sbiw r28, 0x00 ; 0 39c: 91 f3 breq .-28 ; 0x382 <main+0xc0> 39e: 0e 94 00 00 call 0 ; 0x0 <__vectors> 3a2: ef cf rjmp .-34 ; 0x382 <main+0xc0> 000003a4 <_exit>: 3a4: f8 94 cli 000003a6 <__stop_program>: 3a6: ff cf rjmp .-2 ; 0x3a6 <__stop_program>"Номера строк исходника" - это хорошо. Но эта функция - для пошаговой отладки. Для привязки строк исходника к результирующему коду отладчиком. При имеющемся в наличии оригинальном файле исходника.
Если в наличии исходника нет, то сами номера строк (без их содержимого) - малоинформативны.
Или в ардуине в elf и содержимое строк исходника может сохраняться? Но ведь в обсуждаемом случае (когда автор не хочет отдавать исходник), а значит - автор кода позаботится о том, чтобы этих строк в .elf не было. Так что: из .elf только дизасм.
И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".
Теоретики... практики... Ну да.
Вот именно: "бумажная распечатка текста компьютерной программы или её части."
Не придирайся. Признайся, что не понимал что это такое .
Это да. Ну не понимаю я эту современную молодёжь.)