Yo tengo el mismo problema.
Este el código de mi kernel:
...
GDT_DESC:
db GDT_END - GDT
dw GDT
Start:
cli
mov ax, ax
mov ds, ax
...
Cuando lo ejecuto en VirtualPC, me aparece un mensaje que dice: "Error irrecuperable del procesador". Alguien me podría explicar porque no funciona.
Veo 2 errores en las declaraciones en GDT_DESC
1. En el registro de la GDT (GDTR) se guardan 48 bits: 16 bits para el limite y 32 bits para la direccion base. Tu estas declarando unicamente 24 bits (8 bits para el limite y 16 bits para la direccion base)
2. En el limite, a la resta tambien debes agregar "- 1"
GDT_DESC:
dw GDT_END - GDT - 1
dd GDT
No entiendo para que utilizas la instruccion
mov ax, ax que esta despues de
CLI. Tal vez lo que querias utilizar era
xor ax, ax para hacer
AX = 0. Pero aun asi estaria incorrecto si quisieras asignar ese valor a
DS. El segmento de datos, segun tu GDT, deberia tener el valor
0x10 (tercer descriptor, el primer descriptor es el nulo)
El primer descriptor es el nulo, nunca se utiliza.
El segundo descriptor es para el segmento de codigo y el valor que se utiliza para hacer referencia a el es
0x08El tercer descriptor es el segmento de datos y el valor para utilizar este segmento es
0x10