Ik heb een programmatje (klein OS in de maak) geschreven in NASM, als ik mijn code test op bochs (x86 emulator) dan werkt mijn code prima
maar als ik mijn code wegschrijf in de bootsector van een floppy en hem opstart reboot mijn pc (triple fault waarschijnlijk).
Iemand een idee waarom dit op boachs wel werkt en op een echte pc niet.
(mijn standaard assembly forum is down, en ik kan geen fatsoenlijke andere vidnen, dus in mijn laatste hoop hier deze post)
alsvast heel erg bedankt, groeten Bram
Code:
bits 16
org 0x07c00 ; Start address 0000:7c00
jmp start ; Jump to start of boot routine & skip other data
dummy:
.586
.MMX
start:
mov ax, 0003h
int 10h
mov ax,0b800h
mov es, ax
xor bx, bx
mov dword [es:bx], 0f4d0f52h
mov ax, 0
int 16h
cli
lgdt [gdtr]
mov eax, CR0
or eax, 1
mov CR0, eax
jmp codesel:protc
bits 32
protc:
mov ax, datasel
mov ds, ax
mov es, ax
mov ax, videosel
mov gs, ax
mov eax, 2048
mov dword [DS:eax], 0f4d0f50h ;PM in white
mov ebx, [ES:eax]
mov [gs:0], ebx
p:
jmp p
bits 16
gdtr :
dw 8*4 ; Length of the gdt
dd gdt ; physical address of gdt
gdt:
dd 0 ;NULL descriptor
dd 0
codesel equ $-gdt
dw 0ffffh ;4gb code section
dw 0h ;begin at start adress
db 0h ;extra byte to set start offset
db 09ah ;wat flags
db 0cfh ;nogwat flags
db 0h
datasel equ $-gdt
dw 0ffffh ;4gb data section
dw 0h ;begin at start adress
db 0h ;extra byte to set start offset
db 092h ;wat flags
db 0cfh ;nogwat flags
db 0h
videosel equ $-gdt ; ie 18h,next gdt entry
dw 3999 ; Limit 80*25*2-1
dw 0x8000 ; begin at start adress
db 0x0b
db 0x92 ; present,ring 0,data,expand-up,writable
db 0x00 ; byte granularity 16 bit
db 0x00
times 510-($-$$) db 0 ; Fill bytes from present loc to 510 with 0s
dw 0x0aa55 ; Write aa55 in bytes 511,512 to indicate that