Lenguaje de programación C (XIII). Compilador C y otros lenguajes

En el capítulo undécimo vimos que el ligando (linkers) puede unir en un único programa ejecutable diferentes módulos compilados aparte. Por lo tanto, una vez compilados por separado los módulos de los diferentes lenguajes, almacenados o no en la biblioteca, al tratarse de módulos de objetos, se pueden agrupar por ligante.

No obstante, para llamar las rutinas escritas en lenguaje de ensamblaje en PC desde un programa C hay que tener en cuenta una serie de puntos, que es el primer paso de este capítulo. Por otro lado, al compilar los programas C en ordenadores de 16 bits como PC, hay que hacer diferentes opciones, como veremos en el segundo apartado. Por último, en el tercer párrafo analizaremos cómo se pueden referir las funciones originales del sistema operativo, llamadas llamadas de sistema.

C y lenguaje de ensamblaje

Los programas que se ejecutan en los PCs se pueden organizar en 6 modelos diferentes de la memoria en función del compilador. Según los modelos que analizaremos en el siguiente párrafo, los expositores pueden ser de tres tipos: near, far y huge.

Mientras que los demostradores tipo near son de 16 bits, el resto son de 32 bits, ya que en el primer caso se supone que la dirección está en el mismo segmento. Los demostradores tipo far y huge son similares (ya que ambos se almacenan en 32 bits) y la única diferencia entre ellos radica en la medida en que se puede expresar en el desplazamiento.

son palabras clave near, far y huge. Se pueden utilizar para compiladores C en PC y en la definición de demostradores, arrays y funciones. Para utilizar una rutina escrita por un programa C con lenguaje de ensamblaje, no hace falta hacer nada especial, sólo tiene que ser erigida y referenciada como función. No obstante, en el desarrollo de la función puede utilizarse near, far o huge según el modelo de la memoria.

Si escribimos una rutina llamada de Ct con lenguaje de ensamblaje, hay que tener en cuenta las siguientes reglas:

  • los parámetros se colocarán en la pila, generalmente en orden inverso, es decir, la pila comenzará a llenarse desde el último parámetro. La longitud de los parámetros dependerá de las características de los datos analizados en el capítulo 2.
  • en la rutina, antes de las acciones correspondientes, deberá: 1) almacenar en una pila el contenido de los registros que se van a utilizar (siempre BP y si es necesario SI, DI, SS, DS o CS). 2) En el registro BP se guardará el valor de SP, obteniendo los parámetros a través de BP. El primer parámetro estará en (BP + 4) si la función es near y (BP + 6) en el resto de los casos.
  • se irá reduciendo el valor del registro SP para el uso de variables locales.
  • Una vez realizadas las acciones correspondientes a la rutina, el resultado de la devolución se inscribirá en el registro AX y se recuperará el valor de los registros almacenados a continuación.

En el programa 1 se muestra una rutina denominada por escrito con un lenguaje de ensamblaje que multiplica dos números, sin que aparezcan los pseudo-órdenes correspondientes a los segmentos. Cabe destacar que al nombre de las rutinas de ensamblaje se le coloca el carácter por delante.

Programa 1. Multiplicar la rutina por el lenguaje de ensamblaje.

Compilador C en ordenadores de 16 bits

Como ya se ha indicado, en los programas de los PCs se puede elegir entre 6 modelos diferentes de memoria a la hora de compilar. Se trata de un sistema de memoria segmentado en PCs, en el que se distinguen cuatro segmentos (de comandos, de datos, de pila y extra) a los que corresponde un registro: CS, DS, SS y ES. Existen modelos para seleccionar el valor de estos registros y por tanto la longitud del programa.

Con el modelo Small sólo se utilizan dos segmentos, el de comandos y el de datos. Por lo tanto, los programas tendrán un máximo de 128K. Se utiliza para programas pequeños. El modelo Medium representa un segmento de datos y varios segmentos para las órdenes. Por lo tanto, mientras los datos no superen los 64K, las órdenes pueden llegar a un Mega.

Es para programas largos que manejan poco datos. Con el modelo Compact se opone a lo anterior: órdenes inferiores a 64K y datos hasta un Mega. Adecuado para programas que manejan gran cantidad de datos. Con el modelo Large, tanto las órdenes como los datos pueden llegar a un Mega, porque en ambos segmentos se adaptan múltiples. Por lo tanto, es adecuado para grandes programas. El modelo Huge es similar al modelo Large, pero los datos estáticos se sitúan en un mismo segmento.

A medida que aumenta el modelo, el programa es más largo y lento debido a los intercambios entre registros y pilas.

El sexto modelo, denominado Tiny, sólo lo ofrece el compilador Turbo C. Según este modelo el programa completo es un segmento único que no puede superar los 64K.

Se especifica en el comando compilar modelo y el compilador C de Microsoft se utiliza como:

Llamadas de sistema desde C

Las llamadas de sistema son operaciones originales del sistema operativo. Por tanto, dependiendo del sistema operativo estaremos ante diferentes llamadas de sistema.

Las llamadas de sistema que se indican a continuación son los dos sistemas operativos más importantes: de MS-DOS y UNIX.

MS-DOS

En el fichero dos.h se incluyen las funciones de la biblioteca que utilizan llamadas de sistema. Los más significativos son:

En las funciones bdos e intdos se pueden realizar distintas llamadas según el parámetro.

UNIX

En UNIX existen numerosas llamadas de sistema con el fin de utilizar directamente los servicios del sistema operativo. En los diferentes ficheros de título se encuentra la descripción de las funciones relativas a las llamadas de sistemas, ya que la definición está compilada en la biblioteca.

Las llamadas más importantes son:

llamadas sobre procesos

llamadas sobre archivos y dispositivos

open, read, write, close y lseek como en el capítulo anterior

comunicación interproceso

El uso de estas llamadas de sistemas es bastante complejo y depende de la versión. Por eso no vamos a profundizar más aquí.

En los dos capítulos siguientes, concretamente en los dos últimos, utilizaremos las sentencias y funciones analizadas a lo largo de los anteriores, programando ejemplos complejos.

Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila