à propos tematu o ORG - chciałem napisać mały system: boot.s (bootloader, ładuje loader), start.s (loader, ustawia ekran, gdt i skacze do kernela), kernel.c (niech się ładnie wita ;)
Bootloader działa bezproblemowo, ładuje z 2 sektora dyskietki kernel pod adres 0800h:0000h i skacze tam. Start.s ustawia ekran, ładuje tablice GDT (wpisy są na pewno dobre) i... może dam kod:
cli
xor ax, ax
mov ds, ax
lgdt [gdt_decr]
jmp .pmode
.pmode:
mov eax, cr0
or eax, 1
mov cr0, eax
jmp _start32 ; (*)
[BITS 32]
[EXTERN main]
_start32:
mov ax, 08h ;08h to selektor dla sekcji kodu
mov ds, ax
mov ss, ax
jmp main
jmp $
kernel.c:
void main(void){
funkcja_do_drukowania();
for(;;);
}
Oba pliki kompiluje jako ELF (bo pisze pod linuksem) i linkuje - wszystko niby ok. Po uruchomieniu pod Bochsem OS albo się resetuje albo robi coś dziwnego w pamięci. Próbowałem też pisać
jmp 08h:main
ale nic z tego. To samo przy (*) w start.s. Powinno tam być chyba
jmp 08h:_start32
ale wtedy nie działa.
Bochs twierdzi, że wchodze do PMode a CS=0800h.
Nie wiem co robie tutaj źle :(