31.05.2013 Views

Trends - Amiga Magazine Online

Trends - Amiga Magazine Online

Trends - Amiga Magazine Online

SHOW MORE
SHOW LESS

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)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!