Всем доброго времени суток, товарищи!
Довелось мне приобрести одноплатный ПК Rock Pi 4B для работы.
https://ru.aliexpress.com/item/32976500346.html?spm=a2g0s.9042311.0.0.697c33edElpboUПришла идея написать для него программу с классическим выводом "Hello, World!", но не программой для линукса, а неким видом ОС. Никогда не программировал на ассемблере, очень захотелось попробовать.
Незнание языка даёт о себе знать, хотел бы получить советов от тех, кто в этом лучше разбирается.
Штудируя интернет наткнулся на такие мануалы/статьи.
1.
http://rus-linux.net/MyLDP/algol/asm/asmschool_arm_assembly_language.html2.
https://marsohod.org/projects/marsohod2/amber-arm-soc/226-arm-instr3.
https://habr.com/ru/post/133808/4.
https://habr.com/ru/post/319736/5.
https://modexp.wordpress.com/2018/10/30/arm64-assembly/#arch6.
http://www.davespace.co.uk/arm/introduction-to-arm/arithmetic.htmlНе обошёл стороной и официальный сайт ARM'а.
Ссылка на toolchain:
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloadsИх я отметил, как основополагающие для получения знаний. А так, проштудировал ссылок 30-50, если не больше...
Так же, попался довольно простой видеоматериал по написанию "своей ОС".
https://www.youtube.com/watch?v=9KrZRvJsOeo&feature=emb_logoПарень пишет код, делает образ системы и выводит сообщение, и делает это всё в эмуляции i386, что мне не подходит.
Нашёл вот такой ресурс:
https://godbolt.org/Просмотрев местные компиляторы, сравнив с формой записи ассемблера из пунктов 1 и 5, выбрал более подходящий по форме записи - "ARM armclang 19.3".
Вложение:
Снимок.PNG [ 43.3 КБ | Просмотров: 9936 ]
Почитав про регистры ARM и i386(или общепринятыми можно назвать, не знаю точно, поправьте), так же нашёл различия.
У i386 используются компиляторы FASM, TASM, MASM(эта тройка часто встречалась при прочтении), у ARM(A-Family, 64bit) же используется, как я понял, aarch64. ARM-A(32bit) использует aarch32. У них так же присутствуют различия в написании, у 32bit пишутся регистры с буквой "r", например: r0-r12 регистры общего назначения, SP r13 содержит указатель стека выполняемой программы, LR r14 содержит адрес возврата в инструкциях ветвления, PC r15 счётчик команд, у 64bit с буквой "x": x0-x12, x13, x14, x15.
Не раз прочитав статью под №1, понял, что мне ещё нужно будет писать некий драйвер для связи с видеопамятью. В интернете нашёл, что для связи с видеопамятью используется адрес 0xB8000. Не знаю, к чему его отнести, или так у всех можно сделать, или у ARM как-то по-своему(к чему я больше и склоняюсь).
По поводу адреса видеопамяти 0xB8000 нашёл подсказку на форуме
https://forum.osdev.org/viewtopic.php?p=131248 от пользователя - codemastersnake.
Цитата:
0xA0000 is the pointer address to the Graphical Mode and 0xB8000 is the pointer address to the Color Text Mode and 0xB0000 is the pointer to the Monochrome text Mode.
Прошу наставлений и помощи в этом (не)лёгком деле. Спасибо за внимание!