You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
amiga.lib, dobbiamo anteporre amiga.lili a Ic.lib nell'elenco<br />
delle litirerie. Le altre funzioni analoghe sono puts. putchar,<br />
sprintf, fclose, fgetc, fprintf, fp~itc, fputs, getchar (si veclano<br />
i Rom Kernel Manual per ulteriori clelucidazioni a<br />
proposito).<br />
Se facciamo una prova con il nostro sorgente. otteniamo un<br />
eseguibile di 2756 byte, con una netta i-idiizione del codice,<br />
che ci avvicina al nostro obiettivo.<br />
Ci ritnane ancora un passo da fare, intervenire sul codice<br />
che precede la funzione main e clie la chiama. Si possono<br />
seguire più strategie a proposito. IJna strada può essere<br />
quella di cambiare la funzione -main. Di solito. il codice (in<br />
Assembly) contenuto in c.o chiai~a la funzione -main (in C<br />
e contenuta in 1c.lib) che a sua volta chiarila la funzione<br />
main che scriviamo noi (si noti che, a livello di linker. a tutti<br />
i nomi va anteposto un carattere '-', inserito<br />
automaticamente dal compilatore):<br />
c.o -> main > main (per noi)<br />
C. o -> maln > P<br />
maln (per il llnicer)<br />
Abbiamo due possibilità: o escludere la funzione -1nain.<br />
usando il nome -main per la funzione principale del nostro<br />
codice, o sostituire la funzione -rr-iain standard con la<br />
funzione -tinymain. Nel primo caso si ottiene la miglior<br />
riduzione di codice, ma si perde uno dei servizi che -lilain<br />
offre, cioè la costnizione del vettore argv[ l a partire dalla<br />
linea di cornando (l'altro servizio: la gestione bufferizzata<br />
dell'I/O tipica del C. l'abbiaino già ahbandonato<br />
volontariamente).<br />
Nel secondo si mantiene la gestione della linea di cornando<br />
e si perde solo quella dell'I/O bufferizzato: proprio ci6 che<br />
vogliamo. Per cui converrà usare la -tinymain: per farlo<br />
Figura 1: La "cura dimagrante" per Hello World<br />
I I BPTR stdout;<br />
NODEBUG<br />
sc sn<br />
amiga.lib<br />
- tinymain<br />
I senza co Opzioni Lungliezza<br />
6492<br />
6368<br />
2756<br />
988<br />
occorre definire sulla linea di comando del linker -main<br />
coine -tinyinain a questo illodo:<br />
Bene, proviamo a linkare con questo nuovo parametro: 988<br />
byte! Finalmente una cifi-a ragionevole per un prograrilina<br />
che dice solo "Hello".<br />
Se si usa questa strada (quella clie io prediligo), occorre fare<br />
attenzione a non usare la funzione exit del SAS, perche<br />
questa porta con se iin notevole overhead che vanifica i<br />
risultati ottenuti.<br />
Conviene usare, invece, la funzione -exit (che tuttavia non<br />
è molto diversa da exit) o riieglio ancora XCEXIT clie<br />
praticaniente ha un overhead nullo (non si tratta, infatti, di<br />
una funzione, ma cli un sirnbolo definito in c.o e quindi il suo<br />
uso non aggiunge del codice al nostro programrila).<br />
IJna seconda strada è quella di intervenire su c.o. Ci sono.<br />
ancora una volta, diverse alternative. Una può essere quella<br />
di modificare c.o (la SAS fornisce il listato in Assembly)<br />
escludendo certe funzioni che risultano superflue, come,<br />
per esempio, il supporto per il Workbench, o le chiamate<br />
alle funzioni -fpinit, -fpteriii, MemCleanup. Un'altra può<br />
essere quella di usare i riioduli di startup della Comnlodore,<br />
Astartup.ohj di cui esistono piìi versioni. con o senza<br />
supporto Workl->ench.<br />
Una terza strada i? quella di eliininare del tutto c.o; la nostra<br />
funzione iìlain diverrà così la prima ad essere esegiiita e<br />
pertanto sari come progratiitnare in Asseml->ly (anche se<br />
potremo usare le funzioni di libreria C). I1 SAS perrnette di<br />
gestire anche la linea di comando, grazie alla keyworcl<br />
-asni, presente nelle versioni 5.x del pacchetto. I1<br />
puntatore alla stringa con gli argorilenti viene passato da CL1<br />
nel registro A0 e la sua lunghezza in DO, ecco allora come<br />
diventerelil~e il nostro prograriimino:<br />
#include "proto/exec.hr'<br />
#in&lude "proto/dos.h"<br />
struct DosLibrary *DOSBase;<br />
asm -saveds<br />
~nain ( register d o int len,<br />
reglster-a0 char "arg)<br />
I<br />
lf ( ! (DOSBase= (struct DosLlbrary *)<br />
OpenLibrary ("doc. llbrary", O) ) )<br />
return100;<br />
stdout=Output () ;<br />
prlntf ("Hello World 'ils\nr', arg) ;<br />
Delay (50) ;<br />
return 5;<br />
l<br />
(segue a pag.50)