2008-10-22 15 views
12

Estoy trabajando en un proyecto de sistemas integrados y me he encontrado con un problema del compilador que está siendo incrustado programáticamente en Paradigm C++ IDE. Me gustaría poder automatizar la construcción.Buscando el compilador x86 de 16 bits

El procesador es AMD186ES. No estoy trabajando con el sistema operativo, solo cosas de Baremetal. Necesito generar un código de máquina 8086 de 16 bits en modo real desde C++.

Mi google indica que G ++ puede construir dicho código.

Mis preguntas son:

Puede g ++ configurarse para construir el código máquina?

¿Hay otros compiladores de C++ que también lo pueden hacer?

+1

ver [¿Hay un compilador de C que se dirige al 8086?] (Http://stackoverflow.com/q/4493035/309483) –

Respuesta

3

Actualmente estoy usando GNU as (parte de binutils y el ensamblador utilizado para gcc) y I con éxito he estado ensamblando código ensamblador de 16 bits con lo siguiente:

as <file> 
ld --oformat binary -Ttext 0x0 -e start <file> 

con mis archivos de ensamblaje de comenzar con:

.code16 
.globl start 
.text 
start: 

desde su binario sin formato omitiendo las líneas,

.globl start 
start: 

simplemente se dió una advertencia, a pesar de que los binarios planos no necesitan ningún punto de entrada.


algo que aprendí de la manera difícil;

-Ttext 0x0 

es crítica, de lo contrario el segmento .text es empujado fuera del rango de 16 bits frente (no me pregunten por qué)

personalmente estoy todavía aprendiendo de montaje, así que esto es sólo mi manera, no necesariamente la mejor manera.


EDIT: Si está escribiendo código de arranque, debería cambiar

-Ttext 0x0 

a

-Ttext 0x7c00 

esto va a compensar sus direcciones de memoria por 0x7c00 ya que el código de arranque suele ser cargada al 0x7c00 por el BIOS.

+0

Interesante. ¿Puede/puede esto dar archivos elf, a.out, o se eliminan en un binario sin OS? –

+0

@paulNathan 'ld --oformat binary -Ttext 0x0 -e start ' lo reduce a un binario no-os; ** Sin embargo **, esto basa las direcciones de memoria en '0x0000' si está escribiendo código de arranque, cambia' -Ttext 0x0000' por '-Ttext 0x7c00' ya que es aquí donde se carga el código de arranque en la memoria. – Hawken

+0

He tocado esta respuesta como * la * respuesta, ya que creo que cualquier tienda que se preocupe por estas cosas puede averiguar la ruta 'C++ -> asm' con gcc con bastante facilidad. –

10

Su mejor opción es probablemente OpenWatcom, que incluye un compilador de C++. De regreso a principios y mediados de los 90, creo que este fue el mejor compilador C/C++. Fue de código abierto hace unos años.

+0

IIRC, Watcom escupe extraños .objs. Si eso no es cierto para OpenWatcom, es probable que sea su mejor opción debido a todo el control que le da sobre código generati en – JimR

+0

@JimR: ese es el formato OMF, no ese weired. – albert

+0

@JimR: Sí, creo que las herramientas de MS de> 16 bits están esencialmente solas al usar COFF/** ar ** para los archivos '.obj' y' .lib'; las otras herramientas de la familia DOS parecen generalmente usar OMF (Borland, Watcom, Mars Digital, MS para código de 16 bits, ...), o nombrar sus archivos de otra manera, como '.o' y' .a' (GNU toolchain, y presumiblemente cualquier otro procedente de * nix-land). El proyecto NT parece haber recogido esta tecnología * nix (objetos COFF y archivos ** ar **) cuando estaban desarrollando NT en forma cruzada desde hosts * nix, pero conservaba las extensiones de archivo DOS tradicionales. – SamB

7

¿No tiene su proveedor de chips (AMD, supongo) algún consejo para los compiladores del chip?

Si no es así, es posible que pueda utilizar algunos compiladores DOS de 16 bits - pero tendrá varios potenciales grandes problemas:

  1. conseguir una biblioteca para el compilador que no depende de la BIOS o MS-DOS
  2. depuración
  3. Los vinculadores para sistemas integrados suelen tener soporte específico para localizar código en regiones de memoria específicas. Eso no suele incluirse en los compiladores para DOS, pero es posible que pueda encontrar algún tipo de vinculador/localizador que lo haga por usted.

Un par de compiladores que todavía cuentan con el apoyo y generar código de 16 bits son:

7

This google search muestra una serie de enlaces para configurar gcc como un compilador cruzado. Para hacer que apunte a algo que no sea un binario ELF estándar, puede frigir la salida. This link describe la exclusión de las bibliotecas estándar y la personalización del formato de salida. Puede que tengas que hacer algunos ajustes para que funcione.

Como alternativa, openwatcom.org tiene una versión de código abierto del compilador Watcom C, que también podría hacer lo que desee.

+1

maravilloso enlace (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html) parece algo que escribiría. 'Inc% upvote' – Hawken

1

No estoy seguro, pero creo que la versión anterior de borland C++ fue capaz de hacer eso. se puede descargar la versión 5.5 T: here buena suerte

+0

La cosa es que el PO se "no funciona con el sistema operativo - sólo cosas Baremetal", y no estoy seguro de si Borland Turbo C o C pueden emitir código desnuda código que no es para MSDOS o no –

+0

Sí, Borland C y C++ emiten código que se puede usar en baremetal 8086 y 80186. Paradigm licenció y mejoró los compiladores de Borland y los empaqueta con una variedad de soporte que incluye bibliotecas y Paradigm Locate (necesario para mapear la salida del enlazador en una imagen hex cargable). –

+0

5.5 solo crea código de 32 bits ☹ – mirabilos

0

Ha sido un largo tiempo desde que he mirado en Paradigm cosas (son todavía alrededor?) - ¿está seguro de que no tienen línea de comandos equivalentes para el compilador?Mi recuerdo es que fueron construidos sobre la cadena de herramientas del compilador de Borland ... ¿Entonces tal vez una vieja copia de los compiladores de Borland podría hacer el truco?

- Ah, mirando un poco más lejos, me parece que Paradigm todavía está alrededor (www.devtools.com) vendiendo herramientas X86. (Debe ser una vaca de efectivo!)

Su producto profesional incluye secuencias de comandos ... Dependiendo de la cantidad de trabajo que planeas hacer, puede valer la pena para morder la bala y comprar su oferta completa ...

Buena suerte.

+0

Me dieron la versión "lite" con mi placa integrada. De alguna manera, Paradigm incrustó el compilador en el ejecutable IDE. –

4

Hay un parche para GCC 4.3: New back end ia16: 16-bit Intel x86

Y here's an update for it. Tenga en cuenta que probablemente no funcione muy bien, por ejemplo, la publicación actualizada dice: "Ahora se admiten constructores y destructores, pero por alguna razón, solo funcionan en la configuración de elks."

contenedor

Este acoplable tiene una acumulación de la misma: https://registry.hub.docker.com/u/ysangkok/ia16-gcc-rask

no he podido hacer DOS Binarios aún:. How do I assemble GAS assembly and link it with the Open Watcom C library?

+0

Niza: ¡una solución mucho más completa que la aceptada! –

3

El más reciente como 2014 es por Dev86

+0

¡Huh! Interesante. ¡Tiene un voto positivo! –

+0

Pero, ¿es 8086 demasiado viejo? El soporte para 80186, 80286 o superior es mejor. Ellos tienen algunas instrucciones más útiles –

Cuestiones relacionadas