Создаем ОС на ассемблере

Создаем ОС на ассемблере

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 это:

  1. Обнаружить все подключенные устройства и проверить их на работоспособность. За это отвечает программа POST (Power On Self Test, самотестирование при включении). Если жизненно необходимое железо не обнаружено, то системный динамик (если таковой имеется) пропищит что-то непонятное и дальше загрузка не пойдет.
  2. Предоставить операционной системе функции для работы с железом.
  3. Считать самый первый сектор загрузочного устройства в нулевой сегмент оперативной памяти по смещению 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

Спасибо за прочтение)

Report Page