Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Hacer un arranque

Estas en el tema de Hacer un arranque en el foro de C/C++ en Foros del Web. Lo que quisiera hacer un arranque, se que para ello debo escrirlo en ensamblador, y hasta ahí todo va bién, mi problema es cuando quiero ...
  #1 (permalink)  
Antiguo 15/12/2008, 02:57
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 1 mes
Puntos: 1
Hacer un arranque

Lo que quisiera hacer un arranque, se que para ello debo escrirlo en ensamblador, y hasta ahí todo va bién, mi problema es cuando quiero llamar a una funcion escrita en código C desde un código escrito en ensamblador.
Entonces lo que busco es saber cual cuales son los compiladores que debería usar y cual enlazador, y cual son sus opciones de tendría que usar.
He intentado usar el gcc, pero la verdad es que no me sale.
Uso WindowsXP.

compiladorasm.exe [opciones] archivo1.asm

compiladorc.exe [opciones] archivo2.c

enlazador.exe [opciones] archivo1.o archivo2.o
  #2 (permalink)  
Antiguo 15/12/2008, 10:34
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Hacer un arranque

El loader tiene que estar escrito en 16 bits y no podes usar directamente el codigo de 32/64 bits que genere el compilador ... primero tendrias que pasar a modo protegido/long. Ademas de que no podes usar nada que implique interaccion con el S.O. ya que tu loader no provee esos servicios ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 15/12/2008, 15:24
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Hacer un arranque

Mi problema radica basicamente a la hora de enlazar, el enlazador me genera un archivo para la plataforma Win32, y eso no me sirve.
  #4 (permalink)  
Antiguo 15/12/2008, 15:26
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Hacer un arranque

Para el loader usa herramientas de 16 bits (MASM, FASM, NASM o lo que quieras pero de 16 bits).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 16/12/2008, 16:05
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Hacer un arranque

Lo que yo hago es lo siguiente:
nasm -fcoff archivo1.asm

luego:
gcc -c archivo2.c

y hasta aquí, aparentementetodo va todo bien.

ahora el problema esta cuando quiero enlazar, y esto es lo que hago:
gcc archivo1.o archivo2.o

y me devuelve el siguiente mensaje:
bin/../lib/gcc/mingw32/3.4.2/../../../libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

entonces lo que hago es:
gcc -nostartfiles archivo1.o archivo2.o

y me devuelve el siguiente mensaje:
bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\b in\ld.exe: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000

esta vez si me genera un archivo de salida, llamado a.exe, el problema es que es un archivo para la plataforma de Windows, y eso no me sirve para hacer un arranque.
  #6 (permalink)  
Antiguo 16/12/2008, 16:17
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Hacer un arranque

Desde el principio esta mal, estas usando todas herramientas de 32 bits, como te dije antes: usa herramientas de 16 bits (MASM, FASM, NASM o lo que quieras pero de 16 bits).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 17/12/2008, 04:07
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Hacer un arranque

La verdad es yo no sé que tiene que ver 16 bits con 32 bits, es mas yo he compilado código en ensamblador en 32 bits y me funciona como arranque.
Además unos de los compiladores que me estás aconsejando usar el es NASM, y es ese uno de los que yo uso, así que lo de 16 ó 32 bits de que me hablás la verdad no sé de que se trata.

Lo que quiero hacer es un arranque, y ejecutarlo en una máquina virtual (qemu, VMware, VirtualPC, etc), en mi caso, VirtualPC.

Si yo escribo un código en ensablador y lo compilo:
nasm archivo.asm
El archivo resultante me sirve. Lo inserto en un archivo de extensión .iso, usando el programa UltraISO. Y luego uso VirtualPC y funciona.

Hasta ahí todo bién, ahora mi problema se basa en que es demasiado complejo hacer un programa sólo en ensamblador. Así que la idea es hacer el código principal, ó código de inicio en ensamblador, y desde allí llamar a funciones mas complejas escritas en código C.

Entonces yo escribo es siquiente código en ensablamdor (archivo1.asm):
Código:
extern _cfoo

START:
	; código
	; código
	; código
	call _cfoo		; Llamar a la función escrita en C
	; y más código
Después escribo es siguiente código en C (archivo2.c):
Código:
void cfoo(void)
{
	// Aquí escribo todo el código de lo que
	// se supone que va hacer esta función
	
	// código
	// código
	// código
	// y más código
}
Luego de que tengo el código en ensamblador y en C, paso a compilarlo.

Primero, compilo el código en ensamblador:
nasm -fcoff archivo1.asm

Segundo, compilo el código en C:
gcc -c archivo2.c

Y hasta aquí, aparentemente está todo bien.

Tercero, enlazo los códigos compilados:
gcc archivo1.o archivo2.o

y me devuelve el siguiente mensaje:
bin/../lib/gcc/mingw32/3.4.2/../../../libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

entonces lo que hago es:
gcc -nostartfiles archivo1.o archivo2.o

y me devuelve el siguiente mensaje:
bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\b in\ld.exe: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000

esta vez si me genera un archivo de salida, llamado a.exe, el problema es que es un archivo para la plataforma de Windows, y eso no me sirve para hacer un arranque. O sea no quiero un programa que se ejecute en Windows, sino un programa que se arranque desde un diskette, disco duro, o un máquina virtual.

Según mi análisis, el problema está en el momento de enlazar, talvéz no le indico al enlazador las opciones correctas. Ahora que si el problema es lo de 16 ó 32 bits, voy a necesitar que me sea explicado, porque con sólo decirme que ese es el problema no me basta, necesito saber porque. Pero si el problema es el compilador que uso, voy a necesitar que me digan cual es exactamente el compilador que debería usar, cual es exactamente el enlazador que debería usar, y cuales son exactamente las opciones que debería indicarles, porque decirme que debería probar con uno u otro compilador no me sirve, ya que he probado con el MASM, el TASM, el FASM, el NASM, el GCC, el TURBOC, y el PELLESC, y la verdad es que con ninguno he logrado mi objetivo.
Así que si alguno pudiera darme una explicación clara y precisa, desde ya muchas gracias.
  #8 (permalink)  
Antiguo 17/12/2008, 04:16
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Hacer un arranque

Cita:
Iniciado por Germancho7186 Ver Mensaje
La verdad es yo no sé que tiene que ver 16 bits con 32 bits, es mas yo he compilado código en ensamblador en 32 bits y me funciona como arranque.
Empeza de nuevo entonces, una PC bootea en modo Real en 16 bits, de no ser asi no podrias arrancar con MS-DOS por ejemplo. ¿Esta claro eso? ¿Sos capaz de comprenderlo o necesitas mas detalles?

Cita:
Iniciado por Germancho7186 Ver Mensaje
Además unos de los compiladores que me estás aconsejando usar el es NASM, y es ese uno de los que yo uso, así que lo de 16 ó 32 bits de que me hablás la verdad no sé de que se trata.
No, NASM es un ENSAMBLADOR, no un compilador. Yo no te aconseje ninguno en particular, lee con mas atencion, yo te dije que uses CUALQUIERA que genere codigo de 16 bits. ¿Sigue sin entenderse eso? ¿Es tan complicado?

Cita:
Iniciado por Germancho7186 Ver Mensaje
Lo que quiero hacer es un arranque, y ejecutarlo en una máquina virtual (qemu, VMware, VirtualPC, etc), en mi caso, VirtualPC.
Eso se entendio desde el primer mensaje.

Cita:
Iniciado por Germancho7186 Ver Mensaje
Si yo escribo un código en ensablador y lo compilo:
nasm archivo.asm
El archivo resultante me sirve. Lo inserto en un archivo de extensión .iso, usando el programa UltraISO. Y luego uso VirtualPC y funciona.
Eso quiere decir que tu codigo objeto es de 16 bits.

Cita:
Iniciado por Germancho7186 Ver Mensaje
Hasta ahí todo bién, ahora mi problema se basa en que es demasiado complejo hacer un programa sólo en ensamblador. Así que la idea es hacer el código principal, ó código de inicio en ensamblador, y desde allí llamar a funciones mas complejas escritas en código C.
Si queres usar codigo de 32/64 bits TENES que cargarlo, pasar a modo protegido/long y por ultimo ejecutarlo (saltando a el), no podes enlazarlo directamente ya que el procesador seguiria en modo Real 16 bits y el codigo seria incorrecto.

Cita:
Iniciado por Germancho7186 Ver Mensaje
esta vez si me genera un archivo de salida, llamado a.exe, el problema es que es un archivo para la plataforma de Windows, y eso no me sirve para hacer un arranque. O sea no quiero un programa que se ejecute en Windows, sino un programa que se arranque desde un diskette, disco duro, o un máquina virtual.
Y si, un PE no te lo va a cargar, el loader tiene que ser codigo puro de 16 bits sin ningun formato.

Cita:
Iniciado por Germancho7186 Ver Mensaje
Según mi análisis, el problema está en el momento de enlazar, talvéz no le indico al enlazador las opciones correctas. Ahora que si el problema es lo de 16 ó 32 bits, voy a necesitar que me sea explicado, porque con sólo decirme que ese es el problema no me basta, necesito saber porque. Pero si el problema es el compilador que uso, voy a necesitar que me digan cual es exactamente el compilador que debería usar, cual es exactamente el enlazador que debería usar, y cuales son exactamente las opciones que debería indicarles, porque decirme que debería probar con uno u otro compilador no me sirve, ya que he probado con el MASM, el TASM, el FASM, el NASM, el GCC, el TURBOC, y el PELLESC, y la verdad es que con ninguno he logrado mi objetivo.
Así que si alguno pudiera darme una explicación clara y precisa, desde ya muchas gracias.
Segui tratando de enlazarlo, cuando lo consigas avisa.

¿De verdad no entendes que no podes ejecutar codigo de 32 bits asi como asi? ¿Que mayor precision queres? ¿Queres que te expliquen tambien la arquitectura x86? Bajate los manuales de Intel y la hacemos mas corta, no esperes que te expliquen todo en un foro, se te dan lineas y vos las seguis.

Si ya estas haciendo un loader se presupone un minimo de conocimiento de la arquitectura, lo que no sirve en realidad es tratar de construir cosas sin comprender lo que se esta haciendo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 17/12/2008 a las 04:34
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:29.