Well i think there are a lot of errors here. I marked them with
bold. Hope this all helps
Greets,
Sephiroth Angellus (RetainSoftware)
bits 16]
[org 0x7C00]
kernel:
cli ;desabilito interrupciones
mov ax, cs
mov ds, ax
mov es, ax
call habilita_A20 ; llama habilita_a20
lgdt [GDTPTR] ; cargamos la GDT
mov eax, cr0 ; obtenemos en ax el registro cr0
or al, 0x01; aumento al
mov cr0, eax ; cr0 = 1. Pasamos a modo Protegido
; ret (a little bit dumb here)
jmp dword
(code32-GDT):go_to_pmode
[bits 32]
go_to_pmode:
MOV ax,
(data32-GDT)
mov ss,
ax
mov ds,
ax
mov es,
ax
mov fs,
ax
mov gs,
ax
mov esp,0x2F000 ; Set stack
; (not needed)jmp fin ; jmp to enable 32 bit mode
fin:
jmp fin
[bits 16]
habilita_A20:
call empty_8042 ; verifico si buffer de entrada esta lleno
mov al, 0xD1 ; comando para escribir nuevo estado controlador
out 64h, al ; mueve al puerto 64h contenido de al
call empty_8042 ; verifico si buffer de entrada esta lleno
mov al, 0xDF ; al = 0xDF para habilitar linea a20
out 60h, al ; mueve al para el puerto de del teclado
call empty_8042 ; verifico si buffer de entrada esta lleno
ret
empty_8042:
in al,0x64 ; estado del puerto 8042
test al,2 ; esta el buffer de entrada lleno?
jnz empty_8042 ; Si esta lleno realizamos un loop
ret
; Tabla de la GDT
GDTPTR:
dw GDT_END - GDT - 1 ; 8 bytes (cada entrada) * 8 = 2000h (8192) - 1 = 1fffh (tamanho de la GDT)
dd GDT ; indica la gdt
GDT:
dw 0,0,0,0 ; descritor null
code32:
dw 0xFFFF,0x0000 ; descritor de c?digo 32 bits
db 0x00,0x9A,0xCF,0x00 ; limite=FFFF (byte 0 e 1),base=0 (byte 2,3,4,7),[present=1,ring=0,c?digo] (byte 5),
; [byte-granular,32bits] (byte 6)
data32:
dw 0xFFFF,0x0000 ; descritor de dados 32 bits
db 0x00,0x92,0xCF,0x00 ; limite=FFFF (byte 0 e 1),base=0 (byte 2,3,4,7),[present=1,ring=0,dados] (byte 5),
; [byte-granular,32bits] (byte 6)
; descritor de c?digo 16 bits
code16:
dw 0xFFFF,0x0000 ; limite=FFFF (byte 0 e 1),base=10000h (byte 2,3,4,7),[present=1,ring=0,c?digo] (byte 5),
db 0x1,0x9a,0x00,0x00 ; [byte-granular,16bits] (byte 6)
; descritor de dados 16 bits
data16:
dw 0xFFFF,0x0000 ; limite=FFFF (byte 0 e 1),base=10000h (byte 2,3,4,7),[present=1,ring=0,dados] (byte 5),
db 0x1,0x92,0x00,0x00 ; [byte-granular,16bits] (byte 6)
GDT_END: