Ассемблер 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/@...
Чувак ты очень крут! Я, надеюсь, тоже стану крут. Но позже)
Arm это тема!
Вот это уже хорошая тема. Многим полезно будет. И хоть тут для себя я и не открою чего то нового - но интересно понаблюдать за чужим опытом. Видосу лайк.
Лет 5 назад на Хабре была статья, посвящённая программированию Малинки на ассемблере на голом железе. Всего одна, с тех пор ничего. Целиком поддерживаю автора начать цикл видео, посвящённых этой теме. Спасибо.
Объяснил, показал всё доступно. Рассказать теорию тоже имеет смысл, но вообще есть лекции Константина Владимирова, он в них тоже вполне доступно преподаёт. Лекции открыты, легко находятся на ют. Так что, у кого есть желание - те найдут
Отличный ролик, спасибо Вам!
Супер! Спасибо 🎉
Круто, надеюсь хоть пару серий будет....
Спасибо! Интересно!
О! Крутяк! Х86 знаю, avr имею представление, про arm почти ничего. Обязательно вечером посмотрю!
ARM ассемблер после z80 или x86 выглядит слегка необычным. Фиксированная длина команд, условное выполнение команд и многое другое, отличное от cisc архитектур :)
Подписался, очень актуально!
О, круто! Как раз книгу начал по ассемблеру для Raspberry Pi читать
И там как раз указывается команда MOVT
В младших моделях Raspberry Pi (1 и Zero) используется процессор с архитектурой ARMv6. А команда MOVT появилась только в архитектуре ARMv7. То есть для старших моделей она действительно актуальна. Но я стараюсь объяснить код, который будет работать на любом процессоре, то есть беру доступный минимум.
@@CityAceEПонял, спасибо!
Спасибо БОЛЬШОЕ! Отличная интересная информация. Давно мечтаю собрать среду визуального программирования основанную на ассемблере, возможно когда нибудь, получится хотябы GUI для неё накодить где-то в питоне.
На ARM как то принято загружать константу в регистр псевдоинструкцией. При этом используется pc-relative адресация, а сама константа располагается где то рядом с кодом. В gas это делается так: ldr r0, =0x10009000; и компилятор сам генерит всё что нужно. Как там в fasm - не в курсе. Так компактнее.
FASM - топовый компилятор ассемблера, у него очень мощная система макросов и интерпретатор который позволяет очень крутые штуки с кодом делать во время компиляции.
Согласен, я когда изучал ассемблер лет 20 назад, fasm только появился
Топовый компилятор ассемблера делает разработчик процессора/архитектуры процессора. FASM - просто очередной noname ассемблер (изобретение велосипеда)...
@@MaxiRPD Ну так может сказать только человек никогда не пользующийся преимуществами того или иного компилятора асма. Конечно, если тупо транслировать мнемоники в бинарный вид то и разницы в трансляторах нет, но я выше написал в чем преимущества конкретно FASMа.
@@MaxiRPD какая-то религия а не рациональный совет
@@zorrozorro2839 Когда ADS был версии 1.2 а никакого FASMa не было даже в проекте - все задачи трансляции мнемоники ARM в бинарный вид УЖЕ были решены! Пока из всех ваших преимуществ увидел только, что в LDR 32 бита не умеет... Ждем новых открытий.
Супер!!
Отлично 😊
Про инклюды и подобное хочется разобраться, и да байты слова, биты, полуслова, тетрады (нибблы)
Нужно смотреть документашку и собирать всё в свою статью и в свою графическую диаграмму, а после делиться с коллегами по несчастью!
Интересная тема про ассемблер под ARM! Просто то что нужно 👍!
Если есть возможность поделитесь стилизатором/подсветкой, я конечно нашёл в опциях как добавлять команды в стандартный стилизатор assembly.
Еще конечно интересует возможность использования более серьёзной среды с IntelliSense, например VSCode.
И какие есть варианты средств отладки на чипе, только JTAG?
Подсветку уже выкладывал в комментариях (их не так много) по чьей-то просьбе.
Автор умница, тема годная👍, пошёл за чипсами. Главное "псевдоумников" не слушайте.
А кто эти "псевдоумники"?
Только недавно думал об этом и попался ролик. Да еще совсем новый. Пришлось подписаться! :) А как бы выглядел хеллоу ворлд для компиляции в бинарник, который сможет стартовать uefi bios обычного современного x86 компа?
Про x86, к сожалению, ничего не могу сказать 🤷♂️
Огонь! Получается команды Fasmarm во многом совпадают с ассемблером для AVR или RISC-V?
Что советуете изучать в первую очередь: ARM или x86? Допустим у меня ПК на x86, но меня интересует ARM.
Вот я лично ассемблер x86 не знаю 🤷♂️ Мне он был неинтересен, так что я его не изучал. Ну, собственно, поэтому совет дать не смогу.
В арм нет отдельных портов и команд для работы с ними? Порты стыкуются в обычное адресное пространство?
Нет таких команд. Все устройства MMIO (Memory-mapped I/O), то есть проецируются в общее адресное пространство. Совсем как на ПК Специалист.
Расширение s потому что так заведено в GNU, легко гуглится и для общего развития полезно, в частности чем s отличается от S, что значит номер после s и почему не asm в GNU принят, но может и применяться
Ну, .s -- это файл обработанный препроцессором. .S -- файл, который надо обработать препроцессором. По правильному, программист должен создавать .S файлы, а .s создаёт C/C++ компилятор (gcc с параметром -S).
@@Alexander_Gurov_RFа как быть с .s .S в виндоподобных системах, где регистр не важен, такой себе стандарт.
@@grayich регистр не важен при поиске файла. Тем не менее, регистр сохраняется при чтении каталогов, и при передаче имени файла в параметре. Тут никаких проблем нет.
@@Alexander_Gurov_RFречь про то, что в 1 каталоге невозможно создать file.s и file.S на файловых системах fat
tfs
@@grayich Да, нельзя. Но этого обычно и не требуется. А при желании и .s можно обработать как .S.
Какой то странный перевод строки. Так то 0x10 - это 16 в десятичной форме. А вообще лучше по классике использовать 0 для конца строки.
такой же вопрос возник. я так понимаю, что с 0 тоже бы работало. хотя, в x86-DOS вроде как $ использовался, если не ошибаюсь, что и не 0x0 и не 0x10
mov/movt не понял. сначала подумалось, что это что-то с BE/LE, но оказалось, что это ограничение программы ассемблера.
@@alekmit13 Это как у Z80 LD L, xx а затем LD H,xx ... даже не так... а вот...
LD HL, abcd а Movt следом LD H,cd как будто бы не было команды LD L,xx
@@alekmit13 ограничение структуры/архитектуры просто
@@alekmit13 Да, некоторые функции DOS (int 21h) используют этот символ для завершения строки. В функциях ПЗУ Спектрума тоже был какой то нестандартный вариант. Но это накладывает ограничения. А 0 является общепринятым терминатором строк, и большинство библиотек используют его.
Посимвольно всё переписал, и всё то же самое, только не выводит саму строку.
А с GitHub'а не скачивали исходник? Запустите его. Он должен работать. А потом посмотрите, что у вас не так.
Не, прости, но как преподаватель ты не удался
Спасибо за мнение! А можно поинтересоваться что конкретно не понравилось, чтобы я как-то смог поработать над этим?
@@CityAceE вот жеж напросился :(. Хорошо, вечером подготовлю развернутый ответ
@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 часа отснятого видео, которое я неикак не успеваю сверстать и выложить, по причинам которые я вам тут описал. Я не режиссер постановщик в белом пальто. Всё это можно зарекнуть потому что вы очевидно успешнее меня :)
Второе, напишите пожалуйста сценарий.
Третье, переснять фрагменты нормально
Четвертое, этой же консоли нет ни у кого, а зачем практиковаться на косноли которой ни у кого нет? Получается что пример вырожденный и далек от реального.
@@homovespertilio Во-первых, я хочу искренне поблагодарить за подробный разбор! 👍Теперь для полноты картины было бы очень любопытно увидеть что-то подобное от человека, для которого предназначалось это видео, то есть от неспециалиста. Я реально принимаю к сведению всё, что тут было написано. И я, безусловно, могу быть не прав, но мне показалось, что большинство из пунктов всё-таки больше похожи на придирки, которые никак не влияют на усваивание материала. Например, открываем статью про последовательный порт на Wiki и видим все те обозначения, которые я использовал в своём ролике, плюс RS-232.
@@CityAceE я нахожу эту придирку крайне важной, потому что новичку может оказаться сложно в самых неожиданных местах, а тут еще смысловая размытость. Таких моментов я стараюсь избегать, потому как жизнь джуниора полна подводных граблей: плодить их - усложнять и без того жизнь полную лишений, страданий, тупняков и других синдромов самозванца
Какой то ты ассемблер выбрал ниочемный... Непонятно откуда взявшийся.
Оригинальный ZARMASM из комплекта ARM Development Suite надо было брать!
CODE32
LDR R0, =0x10009000
Кому надо, тот обязательно возьмёт! Я же выбрал тот ассемблер, который подошёл лично мне по совокупности параметров. Fasmarm действительно обладает таким недостатком, как невозможность скомпилировать конструкцию LDR R0, =0x10009000. Но всегда существуют обходные пути. Один из них я уже показал. В одном из следующих роликов покажу ещё один.
@@CityAceE Я не понимаю что мешает FASMу уметь то что родной ассемблер ARM умеет точно как минимум 25 лет (может и больше).