Ассемблер ARM под голое железо. Часть 1. Hello, World!

แชร์
ฝัง
  • เผยแพร่เมื่อ 14 ต.ค. 2024
  • В этом ролике мы настроим среду разработки, напишем и запустим первую программу "Hello, World!"
    Telegram: t.me/bare_asm
    GitHub: github.com/Cit...
    Notepad++: notepad-plus-p...
    Fasmarm: arm.flatassemb...
    QEMU: www.qemu.org/
    Это же видео на других площадках:
    / @cityacee
    rutube.ru/chan...
    dzen.ru/cityacee
    video/@...

ความคิดเห็น • 66

  • @eugenevladoff2758
    @eugenevladoff2758 7 หลายเดือนก่อน +3

    Чувак ты очень крут! Я, надеюсь, тоже стану крут. Но позже)

  • @xchemx6752
    @xchemx6752 7 หลายเดือนก่อน +8

    Arm это тема!

  • @Alexander_Gurov_RF
    @Alexander_Gurov_RF 7 หลายเดือนก่อน +7

    Вот это уже хорошая тема. Многим полезно будет. И хоть тут для себя я и не открою чего то нового - но интересно понаблюдать за чужим опытом. Видосу лайк.

  • @alexfed2680
    @alexfed2680 7 หลายเดือนก่อน +5

    Лет 5 назад на Хабре была статья, посвящённая программированию Малинки на ассемблере на голом железе. Всего одна, с тех пор ничего. Целиком поддерживаю автора начать цикл видео, посвящённых этой теме. Спасибо.

  • @Александр-й7б9и
    @Александр-й7б9и 2 หลายเดือนก่อน

    Объяснил, показал всё доступно. Рассказать теорию тоже имеет смысл, но вообще есть лекции Константина Владимирова, он в них тоже вполне доступно преподаёт. Лекции открыты, легко находятся на ют. Так что, у кого есть желание - те найдут

  • @mxstnquu
    @mxstnquu 7 หลายเดือนก่อน +4

    Отличный ролик, спасибо Вам!

  • @parallelno
    @parallelno 7 หลายเดือนก่อน +4

    Супер! Спасибо 🎉

  • @sixaxisization
    @sixaxisization 7 หลายเดือนก่อน +2

    Круто, надеюсь хоть пару серий будет....

  • @alekmit13
    @alekmit13 7 หลายเดือนก่อน +3

    Спасибо! Интересно!

  • @ВасилийШумилов-о8ь
    @ВасилийШумилов-о8ь 7 หลายเดือนก่อน +2

    О! Крутяк! Х86 знаю, avr имею представление, про arm почти ничего. Обязательно вечером посмотрю!

  • @TheT735
    @TheT735 7 หลายเดือนก่อน +2

    ARM ассемблер после z80 или x86 выглядит слегка необычным. Фиксированная длина команд, условное выполнение команд и многое другое, отличное от cisc архитектур :)

  • @mslq
    @mslq หลายเดือนก่อน

    Подписался, очень актуально!

  • @Alan-12345
    @Alan-12345 7 หลายเดือนก่อน +3

    О, круто! Как раз книгу начал по ассемблеру для Raspberry Pi читать
    И там как раз указывается команда MOVT

    • @CityAceE
      @CityAceE  7 หลายเดือนก่อน +2

      В младших моделях Raspberry Pi (1 и Zero) используется процессор с архитектурой ARMv6. А команда MOVT появилась только в архитектуре ARMv7. То есть для старших моделей она действительно актуальна. Но я стараюсь объяснить код, который будет работать на любом процессоре, то есть беру доступный минимум.

    • @Alan-12345
      @Alan-12345 7 หลายเดือนก่อน +1

      @@CityAceEПонял, спасибо!

  • @joeelusive1661
    @joeelusive1661 6 หลายเดือนก่อน +1

    Спасибо БОЛЬШОЕ! Отличная интересная информация. Давно мечтаю собрать среду визуального программирования основанную на ассемблере, возможно когда нибудь, получится хотябы GUI для неё накодить где-то в питоне.

  • @Alexander_Gurov_RF
    @Alexander_Gurov_RF 7 หลายเดือนก่อน +5

    На ARM как то принято загружать константу в регистр псевдоинструкцией. При этом используется pc-relative адресация, а сама константа располагается где то рядом с кодом. В gas это делается так: ldr r0, =0x10009000; и компилятор сам генерит всё что нужно. Как там в fasm - не в курсе. Так компактнее.

  • @zorrozorro2839
    @zorrozorro2839 7 หลายเดือนก่อน +4

    FASM - топовый компилятор ассемблера, у него очень мощная система макросов и интерпретатор который позволяет очень крутые штуки с кодом делать во время компиляции.

    • @ВасилийШумилов-о8ь
      @ВасилийШумилов-о8ь 7 หลายเดือนก่อน

      Согласен, я когда изучал ассемблер лет 20 назад, fasm только появился

    • @MaxiRPD
      @MaxiRPD 7 หลายเดือนก่อน

      Топовый компилятор ассемблера делает разработчик процессора/архитектуры процессора. FASM - просто очередной noname ассемблер (изобретение велосипеда)...

    • @zorrozorro2839
      @zorrozorro2839 7 หลายเดือนก่อน +2

      @@MaxiRPD Ну так может сказать только человек никогда не пользующийся преимуществами того или иного компилятора асма. Конечно, если тупо транслировать мнемоники в бинарный вид то и разницы в трансляторах нет, но я выше написал в чем преимущества конкретно FASMа.

    • @kosiak10851
      @kosiak10851 7 หลายเดือนก่อน +1

      @@MaxiRPD какая-то религия а не рациональный совет

    • @MaxiRPD
      @MaxiRPD 7 หลายเดือนก่อน

      @@zorrozorro2839 Когда ADS был версии 1.2 а никакого FASMa не было даже в проекте - все задачи трансляции мнемоники ARM в бинарный вид УЖЕ были решены! Пока из всех ваших преимуществ увидел только, что в LDR 32 бита не умеет... Ждем новых открытий.

  • @kotalay7839
    @kotalay7839 2 หลายเดือนก่อน

    Супер!!

  • @apendix
    @apendix 7 หลายเดือนก่อน +2

    Отлично 😊
    Про инклюды и подобное хочется разобраться, и да байты слова, биты, полуслова, тетрады (нибблы)

    • @sledleo
      @sledleo 2 หลายเดือนก่อน

      Нужно смотреть документашку и собирать всё в свою статью и в свою графическую диаграмму, а после делиться с коллегами по несчастью!

  • @sledleo
    @sledleo 2 หลายเดือนก่อน +1

    Интересная тема про ассемблер под ARM! Просто то что нужно 👍!
    Если есть возможность поделитесь стилизатором/подсветкой, я конечно нашёл в опциях как добавлять команды в стандартный стилизатор assembly.
    Еще конечно интересует возможность использования более серьёзной среды с IntelliSense, например VSCode.
    И какие есть варианты средств отладки на чипе, только JTAG?

    • @CityAceE
      @CityAceE  หลายเดือนก่อน

      Подсветку уже выкладывал в комментариях (их не так много) по чьей-то просьбе.

  • @kuwaldometr74
    @kuwaldometr74 7 หลายเดือนก่อน +2

    Автор умница, тема годная👍, пошёл за чипсами. Главное "псевдоумников" не слушайте.

    • @qwertyuseradmin
      @qwertyuseradmin 5 หลายเดือนก่อน

      А кто эти "псевдоумники"?

  • @ololo_crazy_ufo_driver
    @ololo_crazy_ufo_driver 7 หลายเดือนก่อน +2

    Только недавно думал об этом и попался ролик. Да еще совсем новый. Пришлось подписаться! :) А как бы выглядел хеллоу ворлд для компиляции в бинарник, который сможет стартовать uefi bios обычного современного x86 компа?

    • @CityAceE
      @CityAceE  7 หลายเดือนก่อน

      Про x86, к сожалению, ничего не могу сказать 🤷‍♂️

  • @a3atbb
    @a3atbb 7 หลายเดือนก่อน +2

    Огонь! Получается команды Fasmarm во многом совпадают с ассемблером для AVR или RISC-V?

  • @qwertyuseradmin
    @qwertyuseradmin 5 หลายเดือนก่อน +1

    Что советуете изучать в первую очередь: ARM или x86? Допустим у меня ПК на x86, но меня интересует ARM.

    • @CityAceE
      @CityAceE  5 หลายเดือนก่อน

      Вот я лично ассемблер x86 не знаю 🤷‍♂️ Мне он был неинтересен, так что я его не изучал. Ну, собственно, поэтому совет дать не смогу.

  • @grayich
    @grayich 7 หลายเดือนก่อน +2

    В арм нет отдельных портов и команд для работы с ними? Порты стыкуются в обычное адресное пространство?

    • @CityAceE
      @CityAceE  7 หลายเดือนก่อน +3

      Нет таких команд. Все устройства MMIO (Memory-mapped I/O), то есть проецируются в общее адресное пространство. Совсем как на ПК Специалист.

  • @WWolf_13
    @WWolf_13 7 หลายเดือนก่อน +1

    Расширение s потому что так заведено в GNU, легко гуглится и для общего развития полезно, в частности чем s отличается от S, что значит номер после s и почему не asm в GNU принят, но может и применяться

    • @Alexander_Gurov_RF
      @Alexander_Gurov_RF 7 หลายเดือนก่อน

      Ну, .s -- это файл обработанный препроцессором. .S -- файл, который надо обработать препроцессором. По правильному, программист должен создавать .S файлы, а .s создаёт C/C++ компилятор (gcc с параметром -S).

    • @grayich
      @grayich 7 หลายเดือนก่อน

      @@Alexander_Gurov_RFа как быть с .s .S в виндоподобных системах, где регистр не важен, такой себе стандарт.

    • @Alexander_Gurov_RF
      @Alexander_Gurov_RF 7 หลายเดือนก่อน

      @@grayich регистр не важен при поиске файла. Тем не менее, регистр сохраняется при чтении каталогов, и при передаче имени файла в параметре. Тут никаких проблем нет.

    • @grayich
      @grayich 7 หลายเดือนก่อน

      @@Alexander_Gurov_RFречь про то, что в 1 каталоге невозможно создать file.s и file.S на файловых системах fat
      tfs

    • @Alexander_Gurov_RF
      @Alexander_Gurov_RF 7 หลายเดือนก่อน

      @@grayich Да, нельзя. Но этого обычно и не требуется. А при желании и .s можно обработать как .S.

  • @Alexander_Gurov_RF
    @Alexander_Gurov_RF 7 หลายเดือนก่อน +3

    Какой то странный перевод строки. Так то 0x10 - это 16 в десятичной форме. А вообще лучше по классике использовать 0 для конца строки.

    • @alekmit13
      @alekmit13 7 หลายเดือนก่อน

      такой же вопрос возник. я так понимаю, что с 0 тоже бы работало. хотя, в x86-DOS вроде как $ использовался, если не ошибаюсь, что и не 0x0 и не 0x10

    • @alekmit13
      @alekmit13 7 หลายเดือนก่อน

      mov/movt не понял. сначала подумалось, что это что-то с BE/LE, но оказалось, что это ограничение программы ассемблера.

    • @apendix
      @apendix 7 หลายเดือนก่อน

      @@alekmit13 Это как у Z80 LD L, xx а затем LD H,xx ... даже не так... а вот...
      LD HL, abcd а Movt следом LD H,cd как будто бы не было команды LD L,xx

    • @apendix
      @apendix 7 หลายเดือนก่อน

      @@alekmit13 ограничение структуры/архитектуры просто

    • @Alexander_Gurov_RF
      @Alexander_Gurov_RF 7 หลายเดือนก่อน

      @@alekmit13 Да, некоторые функции DOS (int 21h) используют этот символ для завершения строки. В функциях ПЗУ Спектрума тоже был какой то нестандартный вариант. Но это накладывает ограничения. А 0 является общепринятым терминатором строк, и большинство библиотек используют его.

  • @UnknownCorey
    @UnknownCorey หลายเดือนก่อน

    Посимвольно всё переписал, и всё то же самое, только не выводит саму строку.

    • @CityAceE
      @CityAceE  หลายเดือนก่อน

      А с GitHub'а не скачивали исходник? Запустите его. Он должен работать. А потом посмотрите, что у вас не так.

  • @homovespertilio
    @homovespertilio 7 หลายเดือนก่อน

    Не, прости, но как преподаватель ты не удался

    • @CityAceE
      @CityAceE  7 หลายเดือนก่อน

      Спасибо за мнение! А можно поинтересоваться что конкретно не понравилось, чтобы я как-то смог поработать над этим?

    • @homovespertilio
      @homovespertilio 7 หลายเดือนก่อน

      @@CityAceE вот жеж напросился :(. Хорошо, вечером подготовлю развернутый ответ

    • @homovespertilio
      @homovespertilio 7 หลายเดือนก่อน

      @CityAceE,
      6:33 В зависимости от того под какую архитектуру нам требуется
      Не понятно
      а на 6:55 скачиваем Win32
      Не понятно
      10:30 Это не серийный порт, это последовательный порт. Это термин. И этот термин важен, когда вы потом в коде пишете туда байты. И тут какраз полчается что мы в последовательный порт последовательно пишем байты.
      10:44 Тут вот в чем путаница. Постановки задачи нет. Hello world это не постановка задачи. В общем случае Hello Wolrd это вывод текста на экран. Обычно stdio выдается как раз в консоль. И тут важно было проговорить что stdio перенаправляется в последовательный порт. И какраз программа исполняющая этот бинарник перенаправит последовательный порт эмулируемой консоли в консоль эмулятора.
      15:16 Не очевидно, это адрес специфичен
      17:27 Отступление про расбери лишнее, только отвлекает внимание
      17:34 Не понятно. Мы же сами записали туда адрес, и сами же его получаем? Теперь вводится новый термин, COM-порт. Не понятно, что это такое.
      17:50 И мы будет встречать его в консоли. Не понятно, что это значит. Тоесть нет, я то понимаю что в консоли windows, потому что мы туда перенаправили stdio в последовательный(серийны, COM, тут слишком много терминов для описания одно и того же), но это не очевидно всем.
      17:47 нужно перефразировать, какая-то путаница. Нет все понятно если в айти 20 лет.
      18:26 Такой команды нет, но тем не менее.
      Это какой-то фреймворк с ASM сахарком? Не понятно. Эта команда преобразуется потом во что-то? Не понятно.
      18:50 Не понятно, тоесть кода компилатор скомпилирует это все, он как-то знает по какому адресу будет находится text?
      а почему мы не сделали com_adress: db 0x10009000, а потом в коде сделали mov r0, com_adress? Так нагляднее, нет?
      19:29 "мы имеем загруженные регистры r0, r1, r2", п потому "ldrt загружает регистр r3" "сумма регистров". Идем в интернет6 читаем: "
      Инструкция ldrt в ассемблере ARM загружает двойное слово из памяти с использованием обратного индекса и обновляет указатель на стек. Это полезно при работе с данными на стеке, когда нужно загрузить данные и обновить указатель стека одновременно." становится еще менее понятно. А потом оказывается что я не то гуглил, не ldrt a ldrb. Но я умею справляться с такими задачами, а те для кого это видео - не факт.
      Ну и копая эти ваши интернеты выяснил что второй аргумент, в нашем случае r2 это смещение адреса относительно адреса текст. И это становится неочевидно, потому что явно это не является суммой адресов.
      21:27 адрес порта, не адрес консоли
      22:21 не нужное отсупление о других диалектах ассемблера
      ну и 22:51 и что там дальше происходило не нужно коментировать. В целом нет задачи снять в один дубль всё. Продукт вышел бы качественнее если бы вы пересняли этот фрагмент.
      27:36 тоже стоило переснять, у вас весь текст куда-то уехал
      29:49 это нужно было объяснить в постановке задачи, и на это ссылаться
      Резюме:
      Первое, у меня 4 часа отснятого видео, которое я неикак не успеваю сверстать и выложить, по причинам которые я вам тут описал. Я не режиссер постановщик в белом пальто. Всё это можно зарекнуть потому что вы очевидно успешнее меня :)
      Второе, напишите пожалуйста сценарий.
      Третье, переснять фрагменты нормально
      Четвертое, этой же консоли нет ни у кого, а зачем практиковаться на косноли которой ни у кого нет? Получается что пример вырожденный и далек от реального.

    • @CityAceE
      @CityAceE  7 หลายเดือนก่อน +1

      @@homovespertilio Во-первых, я хочу искренне поблагодарить за подробный разбор! 👍Теперь для полноты картины было бы очень любопытно увидеть что-то подобное от человека, для которого предназначалось это видео, то есть от неспециалиста. Я реально принимаю к сведению всё, что тут было написано. И я, безусловно, могу быть не прав, но мне показалось, что большинство из пунктов всё-таки больше похожи на придирки, которые никак не влияют на усваивание материала. Например, открываем статью про последовательный порт на Wiki и видим все те обозначения, которые я использовал в своём ролике, плюс RS-232.

    • @homovespertilio
      @homovespertilio 7 หลายเดือนก่อน

      @@CityAceE я нахожу эту придирку крайне важной, потому что новичку может оказаться сложно в самых неожиданных местах, а тут еще смысловая размытость. Таких моментов я стараюсь избегать, потому как жизнь джуниора полна подводных граблей: плодить их - усложнять и без того жизнь полную лишений, страданий, тупняков и других синдромов самозванца

  • @MaxiRPD
    @MaxiRPD 7 หลายเดือนก่อน +1

    Какой то ты ассемблер выбрал ниочемный... Непонятно откуда взявшийся.
    Оригинальный ZARMASM из комплекта ARM Development Suite надо было брать!
    CODE32
    LDR R0, =0x10009000

    • @CityAceE
      @CityAceE  7 หลายเดือนก่อน

      Кому надо, тот обязательно возьмёт! Я же выбрал тот ассемблер, который подошёл лично мне по совокупности параметров. Fasmarm действительно обладает таким недостатком, как невозможность скомпилировать конструкцию LDR R0, =0x10009000. Но всегда существуют обходные пути. Один из них я уже показал. В одном из следующих роликов покажу ещё один.

    • @MaxiRPD
      @MaxiRPD 7 หลายเดือนก่อน

      @@CityAceE Я не понимаю что мешает FASMу уметь то что родной ассемблер ARM умеет точно как минимум 25 лет (может и больше).