Тёмный

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

CityAceE
Подписаться 1,6 тыс.
Просмотров 2,7 тыс.
50% 1

В этом ролике мы настроим среду разработки, напишем и запустим первую программу "Hello, World!"
Telegram: t.me/bare_asm
GitHub: github.com/CityAceE/arm_assembly
Notepad++: notepad-plus-plus.org/
Fasmarm: arm.flatassembler.net/
QEMU: www.qemu.org/
Это же видео на других площадках:
/ @cityacee
rutube.ru/channel/24637489/
dzen.ru/cityacee
video/@cityacee

Кино

Опубликовано:

 

5 мар 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 58   
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
Вот это уже хорошая тема. Многим полезно будет. И хоть тут для себя я и не открою чего то нового - но интересно понаблюдать за чужим опытом. Видосу лайк.
@alexfed2680
@alexfed2680 2 месяца назад
Лет 5 назад на Хабре была статья, посвящённая программированию Малинки на ассемблере на голом железе. Всего одна, с тех пор ничего. Целиком поддерживаю автора начать цикл видео, посвящённых этой теме. Спасибо.
@xchemx6752
@xchemx6752 2 месяца назад
Arm это тема!
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
На ARM как то принято загружать константу в регистр псевдоинструкцией. При этом используется pc-relative адресация, а сама константа располагается где то рядом с кодом. В gas это делается так: ldr r0, =0x10009000; и компилятор сам генерит всё что нужно. Как там в fasm - не в курсе. Так компактнее.
@mxstnquu
@mxstnquu 2 месяца назад
Отличный ролик, спасибо Вам!
@parallelno
@parallelno 2 месяца назад
Супер! Спасибо 🎉
@eugenevladoff2758
@eugenevladoff2758 2 месяца назад
Чувак ты очень крут! Я, надеюсь, тоже стану крут. Но позже)
@joeelusive1661
@joeelusive1661 Месяц назад
Спасибо БОЛЬШОЕ! Отличная интересная информация. Давно мечтаю собрать среду визуального программирования основанную на ассемблере, возможно когда нибудь, получится хотябы GUI для неё накодить где-то в питоне.
@apendix
@apendix 2 месяца назад
Отлично 😊 Про инклюды и подобное хочется разобраться, и да байты слова, биты, полуслова, тетрады (нибблы)
@alekmit13
@alekmit13 2 месяца назад
Спасибо! Интересно!
@user-bh2ot5ks8f
@user-bh2ot5ks8f 2 месяца назад
О! Крутяк! Х86 знаю, avr имею представление, про arm почти ничего. Обязательно вечером посмотрю!
@sixaxisization
@sixaxisization 2 месяца назад
Круто, надеюсь хоть пару серий будет....
@Alan-12345
@Alan-12345 2 месяца назад
О, круто! Как раз книгу начал по ассемблеру для Raspberry Pi читать И там как раз указывается команда MOVT
@CityAceE
@CityAceE 2 месяца назад
В младших моделях Raspberry Pi (1 и Zero) используется процессор с архитектурой ARMv6. А команда MOVT появилась только в архитектуре ARMv7. То есть для старших моделей она действительно актуальна. Но я стараюсь объяснить код, который будет работать на любом процессоре, то есть беру доступный минимум.
@Alan-12345
@Alan-12345 2 месяца назад
@@CityAceEПонял, спасибо!
@TheT735
@TheT735 2 месяца назад
ARM ассемблер после z80 или x86 выглядит слегка необычным. Фиксированная длина команд, условное выполнение команд и многое другое, отличное от cisc архитектур :)
@zorrozorro2839
@zorrozorro2839 2 месяца назад
FASM - топовый компилятор ассемблера, у него очень мощная система макросов и интерпретатор который позволяет очень крутые штуки с кодом делать во время компиляции.
@user-bh2ot5ks8f
@user-bh2ot5ks8f 2 месяца назад
Согласен, я когда изучал ассемблер лет 20 назад, fasm только появился
@MaxiRPD
@MaxiRPD 2 месяца назад
Топовый компилятор ассемблера делает разработчик процессора/архитектуры процессора. FASM - просто очередной noname ассемблер (изобретение велосипеда)...
@zorrozorro2839
@zorrozorro2839 2 месяца назад
@@MaxiRPD Ну так может сказать только человек никогда не пользующийся преимуществами того или иного компилятора асма. Конечно, если тупо транслировать мнемоники в бинарный вид то и разницы в трансляторах нет, но я выше написал в чем преимущества конкретно FASMа.
@kosiak10851
@kosiak10851 2 месяца назад
@@MaxiRPD какая-то религия а не рациональный совет
@MaxiRPD
@MaxiRPD 2 месяца назад
@@zorrozorro2839 Когда ADS был версии 1.2 а никакого FASMa не было даже в проекте - все задачи трансляции мнемоники ARM в бинарный вид УЖЕ были решены! Пока из всех ваших преимуществ увидел только, что в LDR 32 бита не умеет... Ждем новых открытий.
@ololo_crazy_ufo_driver
@ololo_crazy_ufo_driver 2 месяца назад
Только недавно думал об этом и попался ролик. Да еще совсем новый. Пришлось подписаться! :) А как бы выглядел хеллоу ворлд для компиляции в бинарник, который сможет стартовать uefi bios обычного современного x86 компа?
@CityAceE
@CityAceE 2 месяца назад
Про x86, к сожалению, ничего не могу сказать 🤷‍♂️
@kuwaldometr74
@kuwaldometr74 2 месяца назад
Автор умница, тема годная👍, пошёл за чипсами. Главное "псевдоумников" не слушайте.
@qwertyuseradmin
@qwertyuseradmin Месяц назад
А кто эти "псевдоумники"?
@a3atbb
@a3atbb 2 месяца назад
Огонь! Получается команды Fasmarm во многом совпадают с ассемблером для AVR или RISC-V?
@grayich
@grayich 2 месяца назад
В арм нет отдельных портов и команд для работы с ними? Порты стыкуются в обычное адресное пространство?
@CityAceE
@CityAceE 2 месяца назад
Нет таких команд. Все устройства MMIO (Memory-mapped I/O), то есть проецируются в общее адресное пространство. Совсем как на ПК Специалист.
@qwertyuseradmin
@qwertyuseradmin Месяц назад
Что советуете изучать в первую очередь: ARM или x86? Допустим у меня ПК на x86, но меня интересует ARM.
@CityAceE
@CityAceE Месяц назад
Вот я лично ассемблер x86 не знаю 🤷‍♂️ Мне он был неинтересен, так что я его не изучал. Ну, собственно, поэтому совет дать не смогу.
@WWolf_13
@WWolf_13 2 месяца назад
Расширение s потому что так заведено в GNU, легко гуглится и для общего развития полезно, в частности чем s отличается от S, что значит номер после s и почему не asm в GNU принят, но может и применяться
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
Ну, .s -- это файл обработанный препроцессором. .S -- файл, который надо обработать препроцессором. По правильному, программист должен создавать .S файлы, а .s создаёт C/C++ компилятор (gcc с параметром -S).
@grayich
@grayich 2 месяца назад
@@Alexander_Gurov_RFа как быть с .s .S в виндоподобных системах, где регистр не важен, такой себе стандарт.
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
@@grayich регистр не важен при поиске файла. Тем не менее, регистр сохраняется при чтении каталогов, и при передаче имени файла в параметре. Тут никаких проблем нет.
@grayich
@grayich 2 месяца назад
@@Alexander_Gurov_RFречь про то, что в 1 каталоге невозможно создать file.s и file.S на файловых системах fat tfs
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
@@grayich Да, нельзя. Но этого обычно и не требуется. А при желании и .s можно обработать как .S.
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
Какой то странный перевод строки. Так то 0x10 - это 16 в десятичной форме. А вообще лучше по классике использовать 0 для конца строки.
@alekmit13
@alekmit13 2 месяца назад
такой же вопрос возник. я так понимаю, что с 0 тоже бы работало. хотя, в x86-DOS вроде как $ использовался, если не ошибаюсь, что и не 0x0 и не 0x10
@alekmit13
@alekmit13 2 месяца назад
mov/movt не понял. сначала подумалось, что это что-то с BE/LE, но оказалось, что это ограничение программы ассемблера.
@apendix
@apendix 2 месяца назад
@@alekmit13 Это как у Z80 LD L, xx а затем LD H,xx ... даже не так... а вот... LD HL, abcd а Movt следом LD H,cd как будто бы не было команды LD L,xx
@apendix
@apendix 2 месяца назад
@@alekmit13 ограничение структуры/архитектуры просто
@Alexander_Gurov_RF
@Alexander_Gurov_RF 2 месяца назад
@@alekmit13 Да, некоторые функции DOS (int 21h) используют этот символ для завершения строки. В функциях ПЗУ Спектрума тоже был какой то нестандартный вариант. Но это накладывает ограничения. А 0 является общепринятым терминатором строк, и большинство библиотек используют его.
@homovespertilio
@homovespertilio 2 месяца назад
Не, прости, но как преподаватель ты не удался
@CityAceE
@CityAceE 2 месяца назад
Спасибо за мнение! А можно поинтересоваться что конкретно не понравилось, чтобы я как-то смог поработать над этим?
@homovespertilio
@homovespertilio 2 месяца назад
@@CityAceE вот жеж напросился :(. Хорошо, вечером подготовлю развернутый ответ
@homovespertilio
@homovespertilio 2 месяца назад
@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 2 месяца назад
@@homovespertilio Во-первых, я хочу искренне поблагодарить за подробный разбор! 👍Теперь для полноты картины было бы очень любопытно увидеть что-то подобное от человека, для которого предназначалось это видео, то есть от неспециалиста. Я реально принимаю к сведению всё, что тут было написано. И я, безусловно, могу быть не прав, но мне показалось, что большинство из пунктов всё-таки больше похожи на придирки, которые никак не влияют на усваивание материала. Например, открываем статью про последовательный порт на Wiki и видим все те обозначения, которые я использовал в своём ролике, плюс RS-232.
@homovespertilio
@homovespertilio 2 месяца назад
@@CityAceE я нахожу эту придирку крайне важной, потому что новичку может оказаться сложно в самых неожиданных местах, а тут еще смысловая размытость. Таких моментов я стараюсь избегать, потому как жизнь джуниора полна подводных граблей: плодить их - усложнять и без того жизнь полную лишений, страданий, тупняков и других синдромов самозванца
@MaxiRPD
@MaxiRPD 2 месяца назад
Какой то ты ассемблер выбрал ниочемный... Непонятно откуда взявшийся. Оригинальный ZARMASM из комплекта ARM Development Suite надо было брать! CODE32 LDR R0, =0x10009000
@CityAceE
@CityAceE 2 месяца назад
Кому надо, тот обязательно возьмёт! Я же выбрал тот ассемблер, который подошёл лично мне по совокупности параметров. Fasmarm действительно обладает таким недостатком, как невозможность скомпилировать конструкцию LDR R0, =0x10009000. Но всегда существуют обходные пути. Один из них я уже показал. В одном из следующих роликов покажу ещё один.
@MaxiRPD
@MaxiRPD 2 месяца назад
@@CityAceE Я не понимаю что мешает FASMу уметь то что родной ассемблер ARM умеет точно как минимум 25 лет (может и больше).
Далее
ГЕНИИ МАРКЕТИНГА 😂
00:35
Просмотров 758 тыс.
Sprinting with More and More Money
00:29
Просмотров 26 млн
Обзор Lichee RV Dock (RISC-V)
27:33
Просмотров 831
Как правильно катать КС 🔫
1:00