Создаем ОС на ассемблере
Andrey Gorbokon </>Добрый вечер, сегодня напишем ОС с Hello, World! на ассемблере FASM
Нам нужно:
- FASM
- Windows (если вы на линуксе, ставьте на виртуалбокс). Образ в комменты скину
- UltraISO, опять-таки в комменты скину
- VirtualBox
В архиве с фасмом есть FASM.exe и FASMW.exe. Устанавливаем FASMW.exe.
Если, вы на линуксе, то качаем прогу под линукс, распаковываем, и перемещаем бинарник fasm в /usr/local/bin/. Создаем hello.asm, открываем в любом текстовом редакторе (mousepad, к примеру), и вставляем код. Если вы на винде, вставляем код в ту прогу
org 7C00h
start:
cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 07C00h
sti
mov ax, 3
int 10h
mov ah, 2h
mov dh, 0
mov dl, 0
xor bh, bh
int 10h
mov ax, 1301h
mov bp, message
mov cx, 12
mov bl, 02h
int 10h
jmp $
message db 'Hello World!',0
times 510 - ($ - $$) db 0
db 0x55, 0xAA
А теперь немного объяснений.
Строкой
org 7C00h
Мы сообщаем, что нашу ОС нужно загрузить в ОЗУ по адресу 0x7C00
Строками
mov ax, 3
int 10h
мы устанавливаем режим 80х25 (80 символов в строке и 25 строк) и очищаем экран. Строками
mov ah, 2h
mov dh, 0
mov dl, 0
xor bh, bh
int 10h
мы устанавливаем курсор. За это отвечает функция 2h прерывания 10h. В регистр dh мы помещаем координату курсора по Y, а в регистр dl — по X.
mov ax, 1301h
mov bp, message
mov cx, 12
mov bl, 02h
int 10h
Тут мы печатаем хеллоу-ворлд. За это отвечает функция 13h прерывания 10h. В регистр bp мы помещаем саму строку, в регистр cx — число символов в строке, в регистр bl — атрибут, в нашем случае цвет, он будет зеленым. На цвет фона влияют первые 4 бита, на цвет текста — вторые 4 бита. Таблица цветов:
0 - черный, 1 - синий, 2 - зеленый, 3 - желтый, 4 - красный, 5 - фиолетовый, 6 - коричневый, 7 - светло-серый, 8 - темно-серый, 9 - светло-синий, A - светло-зеленый, B - светло-желтый, C - светло-красный, D- светло-фиолетовый, E - светло-коричневый, F – Белый.
В строке
jmp $
программа останавливается.
Еще немного, про включение ПК.
Итак, когда мы нажимаем большую кнопку включения на нашем компьютере запускается система, которая есть почти на любом компьютере — BIOS (Basic Input/Output System или базовая система ввода/вывода). Задача BIOS это:
- Обнаружить все подключенные устройства и проверить их на работоспособность. За это отвечает программа POST (Power On Self Test, самотестирование при включении). Если жизненно необходимое железо не обнаружено, то системный динамик (если таковой имеется) пропищит что-то непонятное и дальше загрузка не пойдет.
- Предоставить операционной системе функции для работы с железом.
- Считать самый первый сектор загрузочного устройства в нулевой сегмент оперативной памяти по смещению 0x7C00h и передать туда управление. 1 сектор на диске равен 512 байтам. Поэтому, наш загрузчик не должен превышать 512 байт. BIOS определяет, что сектор загрузочный по наличию в последних двух его байтах значений 0x55 и 0xAA.
Если вы на винде, нажмем ctrl + f9 и в той же директории у нас должен появится бинарник hello.bin. Если, на линуксе, то:
cd [путь к папке, где лежит hello.asm]
fasm hello.asm
Открываем в винде (если вы на линуксе, в виртуалбоксе открывайте) exe-шник с UltraISO.

Тыкаем пробная версия. Я вот уже год как пользуюсь, эта пробная версия не истекает.
Переносим наш бинарник в область, куда показывает стрелка

ПКМ => сделать загрузочным

Потом файл => сохранить как и сохраняем куда хотим
У нас появился ISO-файл. Теперь загрузим как и винду в виртуалбокс. В инете есть куча гайдов по нему, думаю разберетесь. Если есть вопросы - пишите мне в лс или в чат, помогу.
И видим наш хеллоу ворлд!

можете поменять текст, цвет, по идее, все будет работать.
Ссылочки
Хорошая книга о разработке ОС на NASM:
https://littleosbook.github.io/
Разработка ОС на Rust для малинки:
https://habr.com/ru/post/349248/
И еще одна статейка про разработку ОС на Rust:
https://habr.com/ru/post/439066/
Руководство по препроцессору FASM:
https://www.cyberforum.ru/fasm/thread1253291.html
Спасибо за прочтение)