Создание операционной системы на ассемблере


А теперь давайте разбираться, как это все работает.



%define SETUP_SEG 0x07e0 %define SETUP_SECTS 10

%define KERNEL_SEG 0x1000 %define KERNEL_SECTS 1000

Для начала описываем место и размер для каждого загружаемого блока.
Размеры пока произвольные, поскольку все остальное еще предстоит написать.

section .text BITS 16

org 0x7c00

Как я уже говорил, boot sector загружается и запускается по адресу 0:7c00h Содержимое регистров при старте таково:

  • cs содержит 0
  • ip содержит 7с00h
Прерывания запрещены! Про содержание остальных регистров мне ничего не известно, если кто-то, что-то знает, напишите мне. Остальные регистры мы будем инициализировать самостоятельно.

entry_point: mov ax, cs

cli mov ss, ax mov sp, entry_point sti

mov ds, ax

Стек у нас будет располагаться перед программой, до служебной области BIOS еще остается порядка 30 килобайт, для стека больше чем достаточно. Прерывания изначально запрещены, но я все равно сделаю это самостоятельно, на всякий случай. и разрешу после установки стека. Никаких проблем это вызвать, по-моему, не должно.
Так же, нулевым значением, инициализируем сегментный регистр ds.

; Сохpаняем фоpму куpсоpа mov ah, 3 xor bh, bh int 0x10

push cx

; отключаем куpсоp mov ah, 1 mov ch, 0x20 int 10h

Чтобы все было красиво и радовало глаз, мы на время чтения отключим курсор. Иначе он будет мелькать на экране. Чтобы его потом восстановить, как и был, мы сохраняем его форму в стеке.

; Загpужаем setup mov ax, SETUP_SEG mov es, ax

mov ax, 1 mov cx, SETUP_SECTS

mov si, load_setup_msg call load_block

call outstring

mov si, complete_msg call outstring

Загружаем первый блок (setup). Процедуру загрузки блока мы рассмотрим немного позже. А в остальном здесь, по-моему, все понятно.

; загpужаем ядpо. mov ax, KERNEL_SEG mov es, ax

mov ax, 1 + SETUP_SECTS mov cx, KERNEL_SECTS

mov si, load_kernel_msg call load_block

call outstring

mov si, complete_msg call outstring

Загружаем второй блок (kernel). Здесь все в точности аналогично первому блоку.

; Восстанавливаем куpсоp pop cx mov ah, 1 int 0x10




- Начало -  - Назад -  - Вперед -



Книжный магазин