Programación General > ASM (Ensamblador)

 Problemas Con El Salto A Modo Protegido

<< < (3/5) > >>

Eternal Idol:
¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites.

Enko:

--- Cita de: "Eternal Idol" --- ¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites.
--- Fin de la cita ---
Segun entendi, CLI desabilita las interupciones (CLear Interupt) y STI las habilita (SeT Interupt). :S

La instruccion LGDT carga la tabla de descriptores de segmentos y la instruccion LIDT es la que carga la tabla de interrupciones.

La verdad que en el codigo que puse no quice habilitar las interupciones y si no estoy mal, no se habilitan.

sharek:

--- Cita de: "Eternal Idol" ---¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites.
--- Fin de la cita ---
No habilito las interrupciones hasta que tengo el código en 32bit, después del salto corto, todo y no tener tabla de interrupciones, no debería rebentarme y acabar en un error de protección general, pero, sigo sin ver el porqué peta, pongo el codigo esencial, a ver si veis algún error garrafal:


--- Código: Text --- [BITS 16]  jmp  07C0h:inicioinicio:; aqui uso interrupciones de bios para cargar el &#34;nucleo&#34;pasa_a_modo_protegido:  cli  lgdt  [selector_tabla_descriptores]   mov  EAX, CR0  or  AL, 1  mov  CR0, EAX  jmp 08h:07C00h + modo_protegido[BITS 32]modo_protegido:  jmp  08h:10000hselector_tabla_descriptores:  dw  selector_tabla_descriptores.fin - selector_tabla_descriptores -1  dd  07C00h + selector_tabla_descriptores selector_tabla_descriptores:.nulo:              &#59; Segmento nulo  dw  0          &#59; Limit L0-L15  dw  0          &#59; base B0-B15  db  0          &#59; base B16-B23  db  00000000b      &#59; Drets d' accés  db  00000000b      &#59; Granularitat/D/0/AV/Nibble Limit L16-L19  db  0          &#59; Base B24-B31.codigo:              &#59; Segment de codi lectura/escriptura, no conformat  dw  0FFFFh        &#59; Limit L0-L15  dw  0          &#59; base B0-B15  db  0          &#59; base B16-B23  db  10011010b    &#59; Drets d' accés  db  11001111b    &#59; Granularitat/D/0/AV/Nibble Limit L16-L19  db  0        &#59; Base B24-B31.datos:          &#59; Segment de dades, lectura/escriptura, expansió cap avall  dw  0FFFFh      &#59; Limit L0-L15  dw  0        &#59; base B0-B15  db  0        &#59; base B16-B23  db  10010010b  &#59; Drets d' accés  db  11001111b  &#59; Granularitat/D/0/AV/Nibble Limit L16-L19  db  0      &#59; Base B24-B31.fin:times 510-(&#036;-&#036;&#036;) nop  dw  0AA55h  
el código debería terminar en

--- Código: Text ---  jmp  08h:10000h pero por alguna razón bochs rebienta en la linea anterior, en el salto a 32bit:

--- Código: Text ---  jmp 08h:07C00h + modo_protegido 
--- Citar ---00001345703i[CPU  ] >> jmp far 0008:7c44 : EA447C0800
00001345703e[CPU  ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00001345703i[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called
00001345703e[CPU  ] CPU_LOOP bx_guard.interrupt_requested=1
Next at t=1345703
(0) [0x00007c3f] 07c0:003f (unk. ctxt): jmp far 0008:7c44         ; ea447c0800
<bochs:2> 00001345703i[     ] dbg: Quit

--- Fin de la cita ---

Todo apunta a un problema con los descriptores de segmentos, pero yo creo que están bien...

(se que es un palo leer todo el post, pero ya no se donde caer muerto...)

Eternal Idol:

--- Cita de: "Enko" --- Segun entendi, CLI desabilita las interupciones (CLear Interupt) y STI las habilita (SeT Interupt). :S

La instruccion LGDT carga la tabla de descriptores de segmentos y la instruccion LIDT es la que carga la tabla de interrupciones.

La verdad que en el codigo que puse no quice habilitar las interupciones y si no estoy mal, no se habilitan.
--- Fin de la cita ---
No hablaba de tu codigo Enko, sino de este:


--- Código: Text --- [BITS 32]inicio:  sti  jmp  &#036;  

sharek:
Soy un plasta, lo se!

pero fijaos en el código de ahora, no habilito las interrupciones y sigue fallando por excepción 13 (err prot general)

soy un liante! al principio no me iba, luego parecía que si, y ahora vuelve a no irme... es un problema en alguna parte del código y no hay tutía

Amf amf

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa