Llenguatge de programació C (XIII). Compilador C i altres llenguatges
1992/03/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
En el capítol onzè vam veure que el lligant (linkers) pot unir en un únic programa executable diferents mòduls compilats apart. Per tant, una vegada compilats per separat els mòduls dels diferents llenguatges, emmagatzemats o no a la biblioteca, en tractar-se de mòduls d'objectes, es poden agrupar per ligante.
No obstant això, per a dir les rutines escrites en llenguatge d'assemblatge en PC des d'un programa C cal tenir en compte una sèrie de punts, que és el primer pas d'aquest capítol. D'altra banda, en compilar els programes C en ordinadors de 16 bits com a PC, cal fer diferents opcions, com veurem en el segon apartat. Finalment, en el tercer paràgraf analitzarem com es poden referir les funcions originals del sistema operatiu, anomenades crides de sistema.
C i llenguatge d'assemblatge
Els programes que s'executen en els PCs es poden organitzar en 6 models diferents de la memòria en funció del compilador. Segons els models que analitzarem en el següent paràgraf, els expositors poden ser de tres tipus: near, far i huge.
Mentre que els demostradors tipus near són de 16 bits, la resta són de 32 bits, ja que en el primer cas se suposa que la direcció està en el mateix segment. Els demostradors tipus far i huge són similars (ja que tots dos s'emmagatzemen en 32 bits) i l'única diferència entre ells radica en la mesura en què es pot expressar en el desplaçament.
són paraules clau near, far i huge. Es poden utilitzar per a compiladors C en PC i en la definició de demostradors, arrays i funcions. Per a utilitzar una rutina escrita per un programa C amb llenguatge d'assemblatge, no fa falta fer gens especial, només ha de ser erigida i referenciada com a funció. No obstant això, en el desenvolupament de la funció pot utilitzar-se near, far o huge segons el model de la memòria.
Si escrivim una rutina anomenada de Ct amb llenguatge d'assemblatge, cal tenir en compte les següents regles:
- els paràmetres es col·locaran en la pila, generalment en ordre invers, és a dir, la pila començarà a omplir-se des de l'últim paràmetre. La longitud dels paràmetres dependrà de les característiques de les dades analitzades en el capítol 2.
- en la rutina, abans de les accions corresponents, deurà: 1) emmagatzemar en una pila el contingut dels registres que s'utilitzaran (sempre BP i si és necessari SI, VAIG DONAR, SS, DS o CS). 2) En el registre BP es guardarà el valor de SP, obtenint els paràmetres a través de BP. El primer paràmetre estarà en (BP + 4) si la funció és near i (BP + 6) en la resta dels casos.
- s'anirà reduint el valor del registre SP per a l'ús de variables locals.
- Una vegada realitzades les accions corresponents a la rutina, el resultat de la devolució s'inscriurà en el registre AX i es recuperarà el valor dels registres emmagatzemats a continuació.
En el programa 1 es mostra una rutina denominada per escrit amb un llenguatge d'assemblatge que multiplica dos números, sense que apareguin els pseudo-ordres corresponents als segments. Cal destacar que al nom de les rutines d'assemblatge se li col·loca el caràcter per davant.
![](images/A57027.jpg)
Compilador C en ordinadors de 16 bits
Com ja s'ha indicat, en els programes dels PCs es pot triar entre 6 models diferents de memòria a l'hora de compilar. Es tracta d'un sistema de memòria segmentat en PCs, en el qual es distingeixen quatre segments (de comandos, de dades, de pila i extra) als quals correspon un registre: CS, DS, SS i ÉS. Existeixen models per a seleccionar el valor d'aquests registres i per tant la longitud del programa.
Amb el model Small només s'utilitzen dos segments, el de comandos i el de dades. Per tant, els programes tindran un màxim de 128K. S'utilitza per a programes petits. El model Medium representa un segment de dades i diversos segments per a les ordres. Per tant, mentre les dades no superin els 64K, les ordres poden arribar a un Mega.
És per a programes llargs que manegen poc dades. Amb el model Compact s'oposa a l'anterior: ordres inferiors a 64K i dades fins a un Mega. Adequat per a programes que manegen gran quantitat de dades. Amb el model Large, tant les ordres com les dades poden arribar a un Mega, perquè en tots dos segments s'adapten múltiples. Per tant, és adequat per a grans programes. El model Huge és similar al model Large, però les dades estàtiques se situen en un mateix segment.
A mesura que augmenta el model, el programa és més llarg i lent a causa dels intercanvis entre registres i piles.
El sisè model, denominat Tiny, només l'ofereix el compilador Turbo C. Segons aquest model el programa complet és un segment únic que no pot superar els 64K.
S'especifica en el comando compilar model i el compilador C de Microsoft s'utilitza com:
![](images/A57027-a.jpg)
Anomenades de sistema des de C
Les crides de sistema són operacions originals del sistema operatiu. Per tant, depenent del sistema operatiu estarem davant diferents anomenades de sistema.
Les crides de sistema que s'indiquen a continuació són els dos sistemes operatius més importants: d'MS-DOS i UNIX.
MS-DOS
En el fitxer dos.h s'inclouen les funcions de la biblioteca que utilitzen anomenades de sistema. Els més significatius són:
![](images/A57027-b.jpg)
En les funcions bdos i intdos es poden realitzar diferents crides segons el paràmetre.
UNIX
En UNIX existeixen nombroses crides de sistema amb la finalitat d'utilitzar directament els serveis del sistema operatiu. En els diferents fitxers de títol es troba la descripció de les funcions relatives a les crides de sistemes, ja que la definició està compilada a la biblioteca.
Les crides més importants són:
anomenades sobre processos
![](images/A57027-c.jpg)
anomenades sobre arxius i dispositius
open, read, write, close i lseek com en el capítol anterior
![](images/A57027-d.jpg)
comunicació interproceso
![](images/A57027-e.jpg)
L'ús d'aquestes crides de sistemes és bastant complex i depèn de la versió. Per això no aprofundirem més aquí.
En els dos capítols següents, concretament en els dos últims, utilitzarem les sentències i funcions analitzades al llarg dels anteriors, programant exemples complexos.
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia