Дизассемлер пустого скетча. что там ?

Тема в разделе "Флудилка", создана пользователем Ariadna-on-Line, 7 май 2024.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну понятно - пустая заготовка под скетч (кроме строчек setup() { и loop() { нет ничего) скомпилирована под ATtiny85 (Digispark Micronucleus) и дизассемблирована. По сообщениям компилятора - размер 220 байт хламу и 6 байт сраму ))))
    В начале - похоже таблица векторов прерываний. Это даже мне понятно (вроде).
    В конце - запрет прерываний и скакание на месте.
    Вопрос -
    Есть ли тут ассемблерные "борзочтеи", которые вмиг расскажут народу - чего там компилятор нашуршал из ничего ? Любопытно однако. С уважением.
     

    Вложения:

    • Dizasm1.png
      Dizasm1.png
      Размер файла:
      19,1 КБ
      Просмотров:
      48
    • Dizasm2.png
      Dizasm2.png
      Размер файла:
      28,1 КБ
      Просмотров:
      52
    • Dizasm3.png
      Dizasm3.png
      Размер файла:
      30,6 КБ
      Просмотров:
      52
    • Dizasm4.png
      Dizasm4.png
      Размер файла:
      45 КБ
      Просмотров:
      49
    • Dizasm5.png
      Dizasm5.png
      Размер файла:
      15 КБ
      Просмотров:
      37
    Последнее редактирование: 7 май 2024
  2. parovoZZ

    parovoZZ Гуру

    А компилятор здесь каким боком? У дурины нет своего компилятора. У ней gcc.
     
  3. AlexU

    AlexU Гуру

    Всё описанное ниже актуально для Arduino IDE версии 1.8.19 и ниже.
    Попробуйте выполнить команду:
    Код (Bash):
    avr-objdump -hS sketch.ino.elf > sketch.ino.lst
    где, sketch.ino.elf -- бинарник Вашего пустого скетча, sketch.ino.lst -- имя файла, в который Вы хотите сохранить дизассемблированный код (потом содержимое этого файла прикрепите к ответному сообщению, а я попробую рассказать, что там делается).

    Где брать avr-objdump и sketch.ino.elf?
    В настройках Arduino IDE укажите выводить "все" сообщения компилятора (там есть "Сообщения компилятора:" и выпадающий список "Ничего", "По умолчанию", "Подробнее", "Все"). После чего нажмите кнопку проверки скетча.
    Внизу в консоли появится куча сообщений. В конце будет что-то типа:
    Код (Bash):
    ~/.arduino15/packages/arduino/tools/avr-gcc/4.8.1-arduino5/bin/avr-size -A /tmp/arduino_build_105486/sketch_may07a.ino.elf
    вот 'avr-size' надо заменить на 'avr-objdump', а 'sketch_may07a.ino.elf' (у Вас будет не много другое название и путь) и есть искомый бинарник Вашего пустого скетча.
     
  4. parovoZZ

    parovoZZ Гуру

    когда я изучал исходный код, я в микрочип студио с установленным visualmicro в режиме симуляции ходил по строчкам. Правда, после 50-го шага мне надоело, потому как очень много бесполезного мусора.
     
  5. AlexU

    AlexU Гуру

    Небольшое дополнение: то что ТС выложил на скриншотах не является корректным дизассемблированным кодом, там есть ошибки.
    ТС, если хочет погрузиться в изучение "чего там накомпилировал компилятор", лучше не пользоваться больше этим дизассемблером.
     
  6. AlexU

    AlexU Гуру

    ParovoZZ, любым инструментом нужно пользоваться с умом -- тем же дебаггером и дизассемблером. Если программатором будешь забивать гвозди, то в итоге от программатора будет:
     
  7. parovoZZ

    parovoZZ Гуру

    какой программатор? Я в симуляции был))
    а флеш на почти килобайт чем забита в пустом проекте?
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Я с командной строкой уже лет тридцать не работал. Еще со времен DOS. Не получается.
     
  9. AlexU

    AlexU Гуру

    Что именно не получается?
    Славные были времена -- Norton Commander, Windows 3.11, X-Com, а ещё Turbo Pascal 7.0 с интегрированной средой разработки, с поддержкой дебага с точками останова и всякими плюшками...
     
  10. AlexU

    AlexU Гуру

    Ну раз у ТС так и не осилил командную строку, то краткий обзор его скриншотов.
    Как уже правильно заметил ТС первые строки 0x0 - 0x1С это таблица прерываний. Здесь следует обратить внимание на строку 0xA -- это прерывание 'TIMER0' по переполнению, которое ведёт на адрес 0x40 (ниже рассмотрим).
    Строка 0xE1 -- сброс регистра r1 в '0' (так работает "исключающее ИЛИ" -- eor -- с одинаковыми значениями).
    Строка 0x20 -- сброс регистра SREG в '0' (сами смотрите в доку на МК, что это значит).
    Строки 0x22 - 0x28 -- настройка стека, установка регистров SPH и SPL (сами смотрите в доку на МК, что это значит), но как указал ранее дизассемблер "кривой", поэтому строки 0x22 и 0x24 не правильные.
    Строки 0x2A - 0x38 -- очистка секции '.BSS' (неинициализированные переменные заполняются '0'). Но, опять же, всё, что связанно с командами 'ldi' дизассембированно не правильно.
    Далее могу ошибаться:
    Строка 0x3A -- вроде как вызов функции настройки 'TIMER0' (строка 0xB8), из-за кривого дизассемблирования инструкций 'ldi' теряется смысл кода.
    Строка 0x3C -- переход к функции 'main()' на строку 0xD8.
    Строка 0x3E -- обработчик "плохого прерывания" (смотрите таблицу прерываний, все векторы без обработчиков "прыгают" на этот адрес), делает переход на нулевой адрес, т.е начинает работу прошивки с нулевого адреса (грубо говоря, программный сброс МК).
    Строки 0x40 - 0xB6 -- обработчик прерывания переполнения 'TIMER0', вроде как TIMER0_OVF (смотрите доки, как он правильно называется). Используется для подсчёта миллисекунд с момента начала работы контроллера (в секции .BSS хранятся три переменных, используемых этим обработчиком, которые очищаются в строках 0x2A - 0x38).
    Строки 0xB8 - по то ли 0xD2, то ли 0xD4, то ли 0xD6 -- настройка 'TIMER0', которая вызывается из строки 0x3A. Из-за кривого дизассемблера, не могу в точности понять код.
    Строка 0xD6 -- х.з, что это какое, может какая "заглушка" кода.
    Строки 0xD8 - 0xDA -- это и есть функция 'main()', в которой запрещаются прерывания 'cli' и начинает работать бесконечный пустой 'loop()'.
     
  11. Bott

    Bott Гик

    А цель всего этого? Написать код в Ардуино IDE потом дезасемблировать НЕХ потом убрать в е лишнее и обратно в НЕХ для прошивки? Типа оптимизация кода? И шо оно так работает?
     
  12. AlexU

    AlexU Гуру

    Для чего ТС-у нужен разбор ассемблерного кода, не знаю.
    В целом я использую для оценки возможности оптимизации кода как по скорости выполнения, так и по размеру. Вот только не так как Вы предполагаете. Изучив дизассемблированный код, вношу правки в исходники на C/C++ и опять смотрю дизассемблированный код.
    Иногда дизассемблированный код помогает понять причину неработы прошивки. Вот к примеру вчера, изучая листинг того, что выдала Arduino IDE для Digispark'а, обнаружил очень странную вещь -- для подсчёта миллисекунд инициализируется TIMER0, а в таблице векторов используется вектор TIMER1. Кто виноват (компилятор, линкер или библиотека), пока не выяснил. Но эта прошивка, которая на языке C++ выглядит рабочей, в железе работать не будет -- каждую миллисекунду МК будет перезагружаться. И хоть глаза все сотри, изучая исходник на C++, понять почему не работает будет почти не возможно.
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Цели нет. Просто любопытно, почему пустой скетч дает аж 220 байт кода флеша и 6 кайт в дин. память. Бывает программка рабочая столько же занимает.
    2. Я для PIC-процессора так делал, когда памяти не хватало. Компилил на Бейсике, дизассемблил, вычищал и компилил уже ассемблером. Бывало код вдвое ужимался. Бейсик - простой для програмёра, но именно поэтому дает избыточный код.
    3. Не совсем понял. Я выкладывал скрины пустого скетча. Работать в нем нечему.
     
    Последнее редактирование: 8 май 2024
  14. ИгорьК

    ИгорьК Гуру

    ...не уходите пасти сферических коней...
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Сферических коней пасут либо гении, либо Альцгеймерщики. Любопытство - средство от Альцгеймера.
     
  16. parovoZZ

    parovoZZ Гуру

    в исходники загляни.
     
  17. parovoZZ

    parovoZZ Гуру

    сам себе противоречишь. Или это не ты писал?
    когда эти вызовы удалишь, тогда действительно будет
     
    Ariadna-on-Line нравится это.
  18. ИгорьК

    ИгорьК Гуру

    Если это так, то здешний форум просто уникален :)
     
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    О блин. А я думал это просто "макетка" для скетча. Спасибо, запомнил.
    ПС. Щас попробую проверить ваши слова.
    Неа. Не хочет компилировать "чистое поле". Ну да ладно . Я понял - тут же есть опции платформы, А они видимо уже требуют кода.

    Пора начинать наливать за Победу.
     

    Вложения:

    Последнее редактирование: 8 май 2024
  20. parovoZZ

    parovoZZ Гуру

    точка входа на языке C - функция main().
     
    Ariadna-on-Line нравится это.