PDA

Просмотр полной версии : Простейший boot-loader


Ivan_64
11.12.2009, 07:26
Продолжаем флуд:d)

use16
org 0x7C00
bios_start:
cli
mov ax,0x0
mov es,ax
mov ds,ax
mov es,ax
sti

;Устанавливаем видеорежим
mov ax,3
int 0x10

;Отключаем курсор
mov ah,1
mov ch,0x20
int 0x10

;Инициализируем все что нужно для запуска цикла
mov ax,0xB800
mov es,ax
mov si,message
xor di,di
;Цикл переноса данных.
@@:
lodsb
mov ah,0xF
stosw
cmp al,0x0
jnz @b
;Бесконечный цикл.
jmp $

message db "Hello, World!",0
TIMES 510-($-$$) db 0
dw 0xAA55
Как видите код более чем тривиален - может быть кого ни будь это подтолкнет к написанию собственной ОС. Из опыта могу сказать что лучше всего писать на ассемблере - понятней, удобней, но разработка идет дольше и приходится переносить сложные алгоритмы на асм самому.

Добавлено через 5 минут
Кстати чуть не забыл, вот пример перехода в защищенный режим полученный мной на одном форуме в качестве ответа. Этот исходник мне очень помог.
;************************************
; By Dex
; Assemble with fasm
; c:\fasm Pmode.asm Pmode.bin
;
;************************************
org 0x7C00
use16
;****************************
; Realmode startup code.
;****************************
start:
xor ax,ax
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0x7C00
;*****************************
; Setting up, to enter pmode.
;*****************************
cli
lgdt [gdtr]
mov eax, cr0
or al,0x1
mov cr0,eax
jmp 0x10: protected
;*****************************
; Pmode. ;-)
;*****************************
use32
protected:
mov ax,0x8
mov ds,ax
mov es,ax
mov ss,ax
mov esp,0x7C00
;*****************************
; Turn floppy off (if space).
;*****************************
mov dx,3F2h
mov al,0
out dx,al
;*********************************
; Print T in the right hand corner
;*********************************
mov byte [es:0xB809E], "T"
;*********************************
; Just loop for now
;*********************************
jmp $
;*************************************
; GDT.
;*************************************
gdt: dw 0x0000, 0x0000, 0x0000, 0x0000
sys_data: dw 0xFFFF, 0x0000, 0x9200, 0x00CF
sys_code: dw 0xFFFF, 0x0000, 0x9800, 0x00CF
gdt_end:

gdtr: dw gdt_end - gdt - 1
dd gdt
;*************************************
; Make program 510 byte's + 0xaa55
;*************************************
times 510- ($-start) db 0
dw 0xaa55

PS: Очень важная информация
После прыжка к защищенному коду(ну тоесть к 32-битному) обязательно проинициализируйте DS его селектором. В данном случае селектор DS - 0x8
Соответственно ваш защищенный код должен начинаться так:
mov ax,0x8
mov ds,ax
По другому никак - иначе будете смотреть как ваша ОС перезагружается без конца и края, я на этом баге просидел почти 3 месяца - постоянно совал левый селектор.