Ver Mensaje Individual
  #7 (permalink)  
Antiguo 17/12/2008, 04:07
Germancho7186
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 2 meses
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.