• Viernes 15 de Noviembre de 2024, 09:21

Autor Tema:  Obtener el "[ORG XxXXX]"  (Leído 2070 veces)

simpleThings

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Obtener el "[ORG XxXXX]"
« en: Sábado 28 de Noviembre de 2009, 06:56 »
0
Hola, soy nuevo en el ASM.

Hice un bootstrap que corre desde el floppy y entra en modo protegido, luego algo de terminal de texto etc. Nada de sistemas operativos,  simple bootstrap.
Luego volví a escribir e bootstrap para un CD de arranque y se me reinicia continuamente al iniciar.
Estaba comentando el codigo hasta el punto en que funcione. Y el punto en que no se me reinicia, es el justo despues de cargar el EAX con el bit de PE puesto a uno en el registro de CR0, y justo antes del salto largo al codigo protegido.

Sospecho que la directiva [ORG 0x7C0] no va bien, porque si cargo programas que no hacen al nasm calcular direcciones en memoria a partir de marcadores, va bien y los programas se ejecutan como lo esperado.

Me gustaria conocer alguna forma de determinar dónde se ha cargado el programa de arranque y poder usar lo luego en las directivas de nasm para calcular mis saltos  :brickwall:  
Ahora voy a intentar imprimir el IP por pantalla, pero aun si me sirviera, no seria una solucion automatizada. Se le ocurre a alguien alguna solucion mas comoda?

Gracias!

Una cosa mas:
        Tengo la directiva del [ORG ...] en la mitad del codigo y no sé si eso cuenta para nasm como el principio de todo el codigo sin importar la posicion del [ORG..], ó el ORG toma efecto en el lugar exacto donde se declara la directiva.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Obtener el "[ORG XxXXX]"
« Respuesta #1 en: Sábado 28 de Noviembre de 2009, 10:14 »
0
¿Estas siguiendo las especificacions de El Torito?

http://en.wikipedia.org/wiki/El_Torito_(CD-ROM_standard)

Para saber como funciona el ORG en NASM consulta su manual.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

simpleThings

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Obtener el "[ORG XxXXX]"
« Respuesta #2 en: Sábado 28 de Noviembre de 2009, 11:37 »
0
Gracias por responder.

En el estandar, leí que si no especifico el lugar en el que quiero cargar el bootloader, en el caso de los PC, se lo cargará en 0x7c0. Y por eso he preferido dejarlo a zeros, ademas que ya estoy loco con el little-endian y en El Torito, little y big endian están mesclados. Por eso, por miedo a no meter la pata, he decidido dejar lo a zero y que lo carge en la direccion por defecto. Ademas que uso Hyper-V y me da miedo pisar algo en RAM.

Me ha agobiado bastante el ASM, y por eso me dí unos dias de descanso, pero en cuanto me sienta mejor de los animos, voy a probar algo parecido a:

Pseudocodigo:
Código: ASM
  1.  
  2. [BITS 16]
  3. Principio_de_El_Torito:
  4.       ;bla bla bla estandares....
  5. Fin_de_El_Torito:
  6. Nota_uno:
  7. ORIGEN equ (Fin_de_El_Torito-Principio_de_El_Torito)+0x7c00
  8. [ORG ORIGEN]     ;o igual lo ponga en el principio por si las moscas
  9.       ;preparo el salto a modo protegido
  10.       jmp 08h:codigo_protegido
  11. [BITS 32]
  12. codigo_protegido:
  13.    ;etc....
  14.    ;GDT,GDTR,IDT etc...
  15. Nota_dos:
  16.  
  17.  

Como se puede ver, uso el mismo nasm para generar la ISO y de paso generar el bootloader que lleva dentro. En "Nota_uno" empieza el sector que El Torito carga en RAM y acaba en "Nota_dos". Mi capricho es generar todo a partir de nasm y tal vez eso me trae los problemas.
Cuando vuelva a intentarlo, si no me sale de nuevo, voy a generar la ISO con algun programa, pero sería una pena.

Cuando tenga algo nuevo, lo comento.

simpleThings

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Obtener el "[ORG XxXXX]"
« Respuesta #3 en: Martes 22 de Diciembre de 2009, 03:59 »
0
Hola!

Yo estuve malito un tiempo.
Hoy he vuelto a probarlo y ha salido.

En el principio del codigo puse la directiva del origen a 0(supongo que cualquier numero sirve)
luego para cada direccion que me faltaba, puse "direccion_que_me_falta EQU (direccion_segun_nasm - principio_del_codigo_a_cargar_en_memoria)+7C00h" y luego simplemente "LGDT direccion_que_me_falta" (por ejemplo).

Adios!   :hola: