Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
C e ASM
www.ingmonti.it
>
9e +ariabili &el C corri$ on&ono a& in&iri((i e o$$ono e$$ere "$ate come tali anc!e nella arte A$$embl, inline. Si noti com"n)"e c!e nella arte A$$embl, non $i /a il controllo &ei ti i er c"i o$$ono e$$ere e$eg"ite o era(ioni c!e in C $a. rebbero ri/i"tate erc!: ericolo$e o& errate. ;er e+itare roblemi * meglio in&icare $em re il aralleli$mo &elle o era(ioni 4wor& o b,te tr6% erc!: il com ilatore C /a a$$"n(ioni non $em re re+e&ibili. 9a limita(ione rinci ale &ell1A$$embler inline &el T"rbo C-- * c!e non "< accettare label. 9e "nic!e label c"i "< "ntare "n1i$tr"(ione A$$embl, inline $ono )"elle &el C. Anc!e $e non $ono molto # "bblici((ate# il C ammette le label e l1i$tr"(ione goto% c!e * come "na ="m incon&i(ionata. 9a $critt"ra &i "n1etic!etta !a in C la $te$$a $inta$$i &ell1A$$em. bl,8 "n nome $imbolico $eg"ito &al &"e "nti. >e&iamo "n &i rogramma con "na loo % c!e nece$$ita &i "n1etic!etta8
#include <iostream.h>; unsigned int A.H/; main() { A.$/ = $; A.!/ = !; A.H/ = H; aumenta di uno tutti gli elementi del +ettoreI asm { G=J BK0 3 G=J BK0 $ >
1? ASM C.o&t
. 1 &i 9
www.ingmonti.it
Altre regole e limita(ioni &ell1A$$embler inline &el T"rbo C $ono le $eg"enti8 - Aall1ambiente T"rbo C-- non * o$$ibile ottenere "n /ile e$eg"ibile. Si "< ottenere "n e$eg"ibile $olo com ilan&o &alla linea &i coman&o con TCC 4+e&i oltre6 - Nei blocc!i a$m non $i o$$ono "$are &iretti+e c!e allocano la memoria 4A5% AB% ..6 - Aato c!e il $egno #C# in C concl"&e l1i$tr"(ione% non $i "< "$are come $egno &i commento% anc!e nei blocc!i a$m 7. ;er i commenti $i &o+r3 "tili((are o+"n)"e la $inta$$i &ei commenti &el C o &el C--% anc!e nella arte A$$embl,. Ci< era gi3 $tato e+i&en(iato &al rogramma rece&ente. - Alla /ine &i ogni blocco A$$embl, inline i regi$tri 5;% S;% CS% AS e SS &e+ono contenere gli $te$$i +alori c!e a+e+ano all1ini(io &el blocco. Gli altri regi$tri% DS com re$o% o$$ono e$$ere "$ati liberamente. - 91ottimi((a(ione &ella arte C "< e$$ere in/l"en(ata negati+amente &alla re$en(a &i blocc!i a$m 7. E"e$te limita(ioni &ell1A$$embl, inline lo ren&ono $como&o &a "$are er rogrammi $olo minimamente com le$$i. E"an&o la arte in A$$embl, * im egnati+a * meglio con/inarla in "n mo&"lo $e arato% c!e conterr3 roce&"re &a c!ia. mare &a C e c!e +err3 collegato al rogramma C tramite il linFer.
nell1e$em io $i * in&icata l1o (ione I+% c!e /a incl"&ere nell1e$eg"ibile le in/orma(ioni $imbolic!e er il &eb"gger. Se I+ * abilitata $ar3 o$$ibile /are il &eb"gging &irettamente &al $orgente% nel mo&o con$"eto8
BI> td )rogramm
'n1o (ione intere$$ante &el T"rbo C-- ermette &i com ilare in A$$embl, in+ece c!e in ling"aggio macc!inaC l1e$ec". (ione &i8
BI> tcc M3 )rogramm.c)) 5a 3 de+e essere maiuscola
ro&"ce il /ile rogramm.a$m. D$$o * "n $orgente A$$embl, c!e mo$tra come il C !a tra&otto le $"e i$tr"(ioni in lin. g"aggio &i ba$$o li+ello. ;"< e$$ere mo&i/icato #a mano# e com ilato con TASM. D1 intere$$ante $t"&iare come il C tra&"ce le i$tr"(ioni% er am liare la ro ria c"lt"ra e er ca ire come oter ottimi((a. re i rogrammi c!e il C ro&"ce.
. 2 &i 9
2001-01-0@
1? ASM C.o&t
C e ASM
6ntero 32 "it con segno Jirgola mo"ile 3H "it Jirgola mo"ile 64 "it Jirgola mo"ile 64 "it
www.ingmonti.it
6ntero 32 "it con segno Jirgola mo"ile 3H "it Jirgola mo"ile 64 "it Jirgola mo"ile 96 "it
Tabella 1 Dimensioni dei tipi in Turbo C++ (16 bit) e Visual C++ (32 bit) 4L6 er i &ettagli $"l /"n(ionamento in rotecte& mo&e +e&ere in altro l"ogo &i )"e$to libro. Il fatto che il C abbia variabili di dimensioni diverse in dipendenza del compilatore, anche se hanno lo stesso tipo, visto da alcuni come una caratteristica che ne migliora la portabilit. - I tipi numerici del C hanno numero di bit diversi in dipendenza dall architettura del computer su cui sono usati. !uesto "costringe" i programmatori a scrivere applicazioni che sono indipendenti dalla rappresentazione dei numeri, dato che non ci si pu# fidare di come sono implementati. !uando invece si lavora a basso livello, come accade spesso nella programmazione per la grafica, pu# essere impor$ tante sapere con %uanti bit sono rappresentati i numeri. In %uesto caso sarebbe meglio avere tipi di dati che mantenga$ no costante il loro numero di bit cambiando piattaforma. !uesto problema si risolve facilmente definendo tipi appositi e non usando %uelli tipici del C. Infatti applicazioni od ambienti di sviluppo hanno librerie che includono la definizione in linguaggio C di tipi numerici "portabili", che han$ no lo stesso numero di bit in tutte le piattaforme. &'( &'( Come esempio si pu# citare la libreria )*+, usata nella programmazione grafica in ,inu-. essa ha il tipo "gint" in$ tero con segno a 1/ bit in ogni piattaforma e il tipo "gint01" che sempre di 01 bit. 91A$$embl, inline &el >i$"al C-- !a le $eg"enti caratteri$tic!e8 - Accetta t"tte le e$ re$$ioni c!e $arebbero legali in MASM - Il blocco a$m !a ini(io con la $tringa #MMa$m 7# 4&"e $egni &i $ottolineat"ra% a$m e& "na gra//a a erta6 e $i concl"&e con "na gra//a c!i"$a - Si o$$ono "$are label all1interno &el blocco a$m% ma bi$ogna /are molta atten(ione a c!e )"e$te etic!ette non abbiano il nome &i /"n(ioni &el C% erc!: altrimenti il rogramma otrebbe $altare a )"elle /"n(ioni - Aa "n blocco a$m $i "< $altare a )"al$ia$i etic!etta% $ia C c!e A$$embl, - I n"meri e$a&ecimali o$$ono e$$ere $critti $ia con la nota(ione &el C 4e$. 0N00006% $ia con la nota(ione &ell1A$$embl, 4e$. 00000!6 - Non $i o$$ono "$are &iretti+e &i alloca(ione &ella memoria 4&e/ine6 - I commenti &entro "n blocco a$m o$$ono e$$ere $ia #$tile C# c!e #$tile A$$embl,# - I regi$tri DAH% DCH% DAH o$$ono e$$ere "$ati liberamente &entro "n blocco a$m% $en(a alc"na limita(ione - Se $i "$ano &entro "n blocco a$m i regi$tri D5H% DSI o DAI% il C li $al+er3 rima &i entrarci e li ri ri$tiner3 all1"$citaC er )"e$to la +elocit3 &i e$ec"(ione &el rogramma $ar3 leggermente enali((ata - D5; +iene "$ato &al C% er c"i $e lo &o+e$$imo "$are &entro "n blocco a$m &o+remmo $al+arlo e ri ri$tinarlo rima &i c!i"&ere il blocco - T"tti gli altri regi$tri non &e+ono e$$er mo&i/icati all1"$cita &i "n blocco a$m. Se li $i +"ole "$are * in&i$ en$abile $al. +arli all1ini(io e ri ri$tinarli rima &ella /ine &el blocco. - ;er /are roce&"re con l1A$$embl, inline bi$ogna $cri+ere in C t"tta la arte relati+a alla &e/ini(ione &el rototi o e& al a$$aggio &ei arametri alla roce&"raC oi all1interno &ella roce&"ra &i a rir3 "n blocco a$m% nel )"ale i arametri $a. ranno "$ati $imbolicamente. ;er e$em io8 ; E=L:<.A3G ; Bom)ute the )o-er o* an integer ; E;B56B O)o-erH O7:K7 3:4G:97 L=<, E;B56B AB=,:A O)o-erH E<=B )ush e") mo+ e")0 es) ; 3a+e :BE ; Go+e :3E into :BE so -e can re*er ; to arguments on the stacP mo+ ea%0 .e")@4/ ; 4et *irst argument 1? ASM C.o&t >er. 0.@.0 2001-01-0@ . K &i 9
Ing. Gabriele MONTI mo+ ec%0 .e")@6/ ; 4et second argument shl ea%0 cl ; :AK = :AK 2 ( H Q B5 ) )o) e") ; <estore :BE ret ; <eturn -ith sum in :AK O)o-erH :9,E O7:K7 :9,3 :9, Ai+enta8 2 E=L:<H.B 2 #include <stdio.h> int )o-erH( int num0 int )o-er ); +oid main( +oid ) { )rint*( ?3 times H to the )o-er o* 5 is RdSn?0 S )o-erH( 30 5) ); > int )o-erH( int num0 int )o-er ) { OOasm { mo+ ea%0 num ; 4et *irst argument mo+ ec%0 )o-er ; 4et second argument shl ea%0 cl ; :AK = :AK 2 ( H to the )o-er o* B5 ) > 2 <eturn -ith result in :AK 2 >
www.ingmonti.it
1.1.1
E"an&o $i &e+ono $cri+ere a lica(ioni C c!e /acciano "$o &i arti in A$$embl, com le$$e * o$$ibile ricorrere al colle. gamento &i mo&"li $e arati% com ilati con ling"aggi &i+er$i. In genere in )"e$to ca$o il rogramma A$$embl, $ar3 co$tit"ito &a "na colle(ione &i roce&"re% $en(a "n rogramma rinci ale. 9e roce&"re A$$embl, c!e &e+ono e$$ere "tili((ate in "n rogramma C $i &e+ono com ortare e$attamente come $e /o$. $ero $critte in C. In articolare il a$$aggio &ei arametri% $ia in ingre$$o c!e in "$cita% e& i nomi $imbolici "tili((ati &o+ranno ri$ ettare con reci$ione le $ eci/ic!e &el com ilatore C "tili((ato. 91im o$ta(ione ti ica &ei rogrammi m"ltiling"aggio in C e A$$embl, con$i$te nello $cri+ere il rogramma rinci ale in C e collegarlo a mo&"li $critti in A$$embl, c!iamati &al C attra+er$o /"n(ioni. 9e roce&"re $critte in A$$embl, $i &o+ranno com ortare come $e /o$$ero $tate $critte in C% er c"i * im ortante ca ire bene come il C c!iama le $"e /"n(ioni% come a$$a a& e$$e i arametri e come ne "tili((a i ri$"ltati. Il ling"aggio C non o$$ie&e i$tr"(ioni &i+er$e er /"n(ioni e roce&"re% come $"cce&e in ;a$cal e 5ASIC% ma !a $olo /"n(ioni% anc!e $e )"elle &e/inite come #+oi&# $ono &i /atto roce&"re% non ro&"cen&o +alori in ritorno. Il C a$$a i arametri alle roce&"re $em re e $olo attra+er$o lo $tacF e rice+e il ri$"ltato &elle /"n(ioni $em re e $olo attra+er$o regi$tri. Il ri$"ltato &ella /"n(ione +iene ritornato nel regi$tro A9 $e * &ella l"ng!e((a &i "n b,te 4 .e$ c!ar6% nel regi$tro AH $e * &i 1? bit 4int6% in AH e AH $e * &i K2 bit 4long6% con la arte ba$$a in AH e l1alta in AH. Nella maggioran(a &ei com ilatori C e C-- i nomi $imbolici &elle /"n(ioni e &elle +ariabili globali +engono $al+ati nel. l1O5G mantenen&o le mai"$cole e min"$cole e& ante onen&o al $imbolo il carattere #M# 4$ottolineat"ra% "n&er$core6.
Duesto non T sem)re +ero )erchU ).es. le s)eci*iche :5' )er i *ile =BV )re+edono che i nomi rimangano immutati (il *ormato :5' T usato dai com)ilatori *ree-are 49;0 nel 3.=. 5inu%).
'na /"n(ione re$tit"i$ce "n +alore &el ti o &ic!iarato nel $"o #prototipo#. Nel rototi o &ella /"n(ione $ono in&icati an. c!e il n"mero e& il ti o &ei arametri &i ingre$$o &ella /"n(ione. In generale il rototi o &i "na /"n(ione in T"rbo C-- $i e$ rime in )"e$ta /orma8 [extern] ["C" | "Pascal"] <tipo del valore di ritorno> [near | far] <nome della funzione> ( <lista dei parametri> ); <lista dei parametri> : . 4 &i 9 <tipo del parametro> [far] [!]<nome del parametro>" ## 2001-01-0@ 1? ASM C.o&t
C e ASM
www.ingmonti.it
Il $egno .. $igni/ica c!e ci< c!e lo rece&e "< e$$ere ri et"to a iacimento. 9a cla"$ola eNtern% o (ionale% in&ica c!e la /"n(ione non * &e/inita all1interno &el rogetto C corrente% ma c!e &e+e e$$e. re collegata &al linFer. eNtern $i &o+r3 "$are $e la /"n(ione * reali((ata in "n mo&"lo A$$embl, $e arato. 9a cla"$ola /ar% o (ionale% in&ica c!e il ri/erimento &e+e e$$ere a 20 bit $egmentato% com o$to &a 1? bit &i o//$et e 1? bit &i $egmento. Ci< +ale $ia er i ri/erimenti al co&ice% er i )"ali il C generer3 "na call /ar% c!e er i ri/erimenti a loca. (ioni &i &ati% er le )"ali il C a$$er3 $ia l1in&iri((o &i o//$et c!e )"ello &i $egmento. 9a re$en(a% o (ionale% &ell1a$teri$co rima &el nome &el arametro $igni/ica c!e &e+e e$$ere a$$ato l1in&iri((o in+ece c!e il +alore &el arametro. Al o$to &i Onome &el arametroP ci "< anc!e e$$ere "na co$tante. 'n rogramma in C a$$a i $"oi arametri in &"e mo&i8 er +alore o er in&iri((o. Il passaggio per valore * )"ello $tan&ar&% c!e $i "$a $em re erc!: iJ #$ic"ro#. In )"e$to ca$o il rogramma C co ia nello $tacF il +alore corrente &i t"tti i arametri in&icati% oi /a la c!iamata alla roce&"ra. A"n)"e il C% rima &i /are "na #CA99# all1in&iri((o &ella roce&"ra% /ar3 "na $erie &i #;'SQ#. 91or&ine con il )"ale i arametri +engono me$$i nello $tacF * &all1"ltimo &ella li$ta al rimo. '$an&o )"e$to or&ine% c!e "< $embrare $trano% * iJ /acile reali((are /"n(ioni c!e abbiano "n n"mero +ariabile &i arametri. In/atti% &ato c!e lo $tacF /"n(iona in mo&o 9I0O% il arametro c!e #emerge# &allo $tacF rima &ella c!iamata * il rimo &ella li$ta &el rototi o% cio* l1"ltimo c!e * $tato me$$o nello $tacF. Se al momento &ella c!iamata manca )"alc"no &ei arametri lo $tacF $ar3 # iJ +"oto#% ma i arametri c!e ci $ono a+ranno $em re la $te$$a o$i(ione relati+a. Ci< non ac. ca&rebbe $e i arametri /o$$ero a$$ati nello $tacF in or&ine &al rimo. In T"rbo C * o$$ibile obbligare il com ilatore a $cri+ere i arametri nello $tacF nell1or&ine con c"i $ono $critti nella li. $ta &ei arametri /ormali. ;er ottenere )"e$to e//etto ba$ta $cri+ere # a$cal# 4/ra +irgolette6 nel rototi o &ella /"n(ione% rima &ella &ic!iara(ione &el $"o ti o D$em io8
e%tern ?)ascal? int Erocedura3critta6nEascal (int 5unicoEarametro) ;)
>e&iamo ora "n e$em io c!e ill"$tra come il C a$$a i arametri er +alore. Mo$treremo "n rogramma in C e la $"a tra&"(ione in A$$embl,% otten"ta "$an&o l1o (ione -S &el com ilatore8 ;rogramma in C8
int )ro+a(int n)aram0 char BercaDuesto0 long int ,a:la"orare); int E0 <; main() { 2 )assa a )ro+a il +alore di una +aria"ile di !6 "it0 il carattere A ed una costante di 3H "it0 scritta con la nota#ione del B )er i numeri esadecimali 2 < = )ro+a(E0 AAA0 $%A$B$B$,$); >
come gi3 +i$to nel rimo +ol"me in T"rbo C--% com ilatore er H@? &a 1? bit% il ti o int !a "na l"ng!e((a &i 2 b,te% c!ar * &a @ bit e long &a K2. Aate )"e$te #&imen$ioni# er i arametri $i $ iegano le "$! c!e com aiono nel co&ice $e. g"ente8 Tra&"(ione in A$$embl, &el brano &i rogramma C8
mo+ a%0 4!!36 ; !6 "it alti del numero di 3H "it (A$B$h) mo+ d%0 4W36$ ; !6 "it "assi del numero di 3H "it (B$,$h) )ush a% ; )arte alta nello stacP )ush d% ; )arte "assa nello stacP mo+ al0 65 ; 65 T il codice A3B66 di ?A? )ush a% ; )ush di AAA0 in A5 (anche )ush di AX() )ush -ord )tr .OE/ ; )ush del +alore corrente di E call near )tr O)ro+a ; chiamata alla )rocedura add s)08 ; sistema#ione dello stacP do)o il ritorno mo+ -ord )tr .O</0 a% ; assegna#ione del risultato a < 2 (notaI il codice )rodotto dal com)ilatore T stato leggermente modi*icato0 )er renderlo )iY com)rensi"ile) 2
1? ASM C.o&t
. R &i 9
Ing. Gabriele MONTI Si noti come i ri/erimenti alle +ariabili ; e S $iano cambiati in M; e MS.
www.ingmonti.it
9e rime rig!e mettono nello $tacF la co$tante 0NA050C0A0% n"mero &i K2 bit e$ re$$o in e$a&ecimale. 9a "$! AH% c!e +iene &o o a+er me$$o in A9 il co&ice ASCII &i A% a$$a 1A1 alla roce&"ra. Si noti c!e +iene me$$o nello $tacF anc!e AQ 4 "$! AH6% erc!: con "n @0@? le ;'SQ o$$ono e$$ere $olo a 1? bit. ;eraltro AQ a$$"mer3 "n +alore non &eterminato% &ato c!e non +iene mo&i/icato &al co&ice c!e re ara i arametri er la roce&"ra. 9a ;'SQ $"cce$$i+a mette nello $tacF il +alore corrente &ella +ariabile ; rele+an&olo &alla loca(ione &i memoria c!e gli * $tata ri$er+ata 4 "$! wor& tr TM;U6. 9a $it"a(ione &ello $tacF )"an&o la roce&"ra M ro+a ren&e il controllo * &"n)"e la $eg"ente8 S; I; &i ritorno CS &i ritorno S; - 2 >alore corrente &i ; S; - 4 +ariabile ; Non "$ato 1A1 S; - @ co$tante c!ar C0! A0! S; - 10 co$tante A0! 50! S; - 12 &i K2 bit 4memoria ra re$entata a wor&% arte alta &ella wor& a $ini$tra6 Ao o il ritorno &ella roce&"ra $ono &"e le co$e im ortanti &a notare% c!e $i e+i&en(iano nelle &"e i$tr"(ioni &o o la CA99. 9a rima i$tr"(ione 4a&& $ %@6 ci $ iega come il C aggi"$ta lo $tacF &o o a+erlo "$ato er a$$are i arametri alla ro. ce&"ra8 lo rimette a o$to #gettan&o +ia# t"tti i &ati c!e a+e+a a$$ato. Ao o c!e la roce&"ra * ritornata aggi"nge allo $tacF ointer il n"mero &i b,te "$ati come arametri% nell1e$em io erano otto. Ci< toglie e//etti+amente i arametri &allo $tacF% anc!e $e non li cancella &alla memoria. In/atti i +ecc!i +alori non otranno e$$ere iJ letti con o erc!: )"e$te i$tr"(ioni la+oreranno al n"o+o in&iri((o "ntato &a S; e +erranno /i$icamente $o+ra$critti con le ro$$ime ;'SQ. D$aminiamo ora il passaggio per indirizzo. D$$o $i "$a )"an&o $i +"ole c!e la roce&"ra la$ci &elle mo&i/ic!e erma. nenti alle +ariabili c!e +engono a$$ate come arametri% mo&i/ican&o il conten"to &elle loca(ioni &i memoria corri$ on. &enti. Si "$a il a$$aggio er in&iri((o anc!e )"an&o il arametro * tro o #ingombrante# er e$$ere a$$ato attra+er$o lo $tacF% come * il ca$o &egli arra, e &elle $tring!e. 9a $inta$$i er ottenere in C "n a$$aggio er in&iri((o con$i$te nel &ic!iarare "n "ntatore nella li$ta &ei arametri &el rototi o% ante onen&o "n a$teri$co 4$tar6 al $"o nome8 *Onome &el arametro /ormaleP. Nella c!iamata e//etti+a bi$ogna in+ece "tili((are l1in&iri((o &ella +ariabile c!e $i +"ole a$$are% ante onen&o al $"o nome "na e commerciale 4am er$an&68 &Onome &el arametro e//etti+oP. >e&iamo "n e$em io &i &ic!iara(ione e& "tili((a(ione &i "na /"n(ione c!e a$$a "n arametro er in&iri((o8
9ome del *ile che contiene Cuesto )rogrammaI L6E:Z5:9.BEE int *ar Li)eA9,len(char *ar 2stringa); char 5a,e+oBancellare./ = ?!H3456&8?; main() { cout << 5a,e+oBancellare << A A; 2 Li)eA9,len conta il numero dei caratteri della stringa che +iene )assata e mentre conta la cancella0 riem)iendola di caratteri "lanP (? ? A3B66 = 3H) 2 cout << Li)eA9,len(5a,e+oBancellare); (2) cout << 5a,e+oBancellare; return $; > (2) nella chiamata non si mette Z )rima di 5a,e+oBancellare )erchU essa T una stringa0 che +iene )assata comunCue )er indiri##o.
Si noti c!e la &e/ini(ione &el rototi o com ren&e la cla"$ola #/ar#% c!e /a com ilare "na CA99 0AS. 9a &ic!iara(ione &el "ntatore * /ar 4c!ar /ar L$tringa6% ci< $igni/ica c!e nello $tacF +iene memori((ato $ia l1o//$et c!e il $egmento &ell1in&iri((o &el rimo carattere &ella $tringa. >e&iamo come +iene tra&otto )"e$to rogramma8
)ush ds ; )assaggio del segmento della stringa (T in ,3) ; )assaggio dellAo**set della stringaI mo+ a%0 o**set .O5a,e+oBancellare/ )ush a%
. ? &i 9
2001-01-0@
1? ASM C.o&t
C e ASM
www.ingmonti.it
chiamata della *un#ione )uli#ia di una -ord dallo stacP )uli#ia dellAaltra -ord dallo stacP sal+ataggio del +alore di OLi)eA9,len nellAarea di memoria delle +aria"ili automatiche
Anc!e in )"e$to ca$o i nomi $imbolici $ono &i+entati MBi eANAlen e M9aAe+oCancellare% a+en&o ac)"i$tato "na $ot. tolineat"ra all1ini(io. 9a $it"a(ione &ello $tacF )"an&o la roce&"ra MBi eANAlen ren&e il controllo * &"n)"e la $eg"ente8 S; I; &i ritorno CS &i ritorno S; - 2 o//$et &i M9aAe+oCancellare S; - 4 +ariabile a$$ata er $egmento &i M9aAe+oCancellare S; - ? In&iri((o 4memoria ra re$entata a wor&% arte alta &ella wor& a $ini$tra6
T"tto il re$to &el rogramma in C rimane "g"ale. Seg"e il te$to &el mo&"lo A$$embl,% c!e &o+r3 e$$ere com ilato e collegato a )"ello in C8
; 9ome del *ile che contiene Cuesta )roceduraI 37<694'9.A3G E;B56B OLi)eA9,len E<=B 'A< ; )rologo della )roceduraI sal+ataggio del contesto E;3X BE ; sal+a BE Ache )unta allAhea) del B E;3X ,3 ; sal+a ,3 )erchU il )untatore che +iene )assato T *ar ; e non T detto che la stringa che mi +iene )assata sia ; nello stesso segmento del ,3 corrente G=J BE0 3E ; Barica il )untatore alla stringa0 che T di ti)o 'A<I G=J BK0 .BE @ 8/ ; lAo**set ; il registro di segmentoI G=J AK0 .BE @ !$/ G=J ,30 AK ; cancella il conteggio dei caratteri in AKI K=< AK0 AK ; mette s)a#i in tutta la stringa0 *ino a che non tro+a il null0 ; contem)oraneamente conta con AKI Eer7utta5a3tringaI G=J "1te )tr .BK/0 ? ? ; mette un "lanP 69B BK ; incrementa il )untatore nella stringa 69B AK ; incrementa il contatore di caratteri della stringa BGE "1te )tr .BK/0 $
1? ASM C.o&t
. V &i 9
www.ingmonti.it
Si noti c!e il nome c!e $i &e+e "tili((are er la roce&"ra * MBi eANAlen. Si &e+e inoltre /are in mo&o c!e e$$a $ia +i$ibile &all1e$terno% come $ eci/icato &alla &iretti+a ;'59IC% in mo&o c!e il linFer o$$a collegare )"e$to rogramma A$$embl, al rogramma rinci ale in C. 9a roce&"ra $al+a $"bito AS e 5; nello $tacF% er c"i la $it"a(ione &ello $tacF cambia ri$ etto a )"anto +i$to rima8 $o. ra a& I; &i ritorno ci $ono ora 5; e AS% come ill"$trato &al $eg"ente $c!ema8 5; &el c!iamante AS &el c!iamante I; &i ritorno CS &i ritorno O//$et &i M9aAe+oCancellare Segmento &i M9aAe+oCancellare S; S; - 2 S; - 4 S; - ? S; - @ S; - 10
E"e$ta roce&"ra * "n e$em io &i )"anto o$$a e$$ere "tile collegare al C roce&"re A$$embl,. Con oco $/or(o abbia. mo otten"to "na roce&"ra c!e $+olge #contem oraneamente# &"e /"n(ioni% cancella "na $tringa e ne conta anc!e il n". mero &i caratteri. '$an&o le librerie $tan&ar& &el C o &el C-- non * o$$ibile /are entrambe le i$tr"(ioni in "na $ola +ol. ta e bi$ogna c!iamare &"e /"n(ioni &i+er$e% con la er&ita &i e//icien(a &el rogramma c!e ne con$eg"e. 'na +olta terminati i rogrammi er com ilarli e collegarli $i "$a TCC8
BI> tcc L6E:Z5:9 37<694'9.A3G
9ancian&o TCC con )"e$ti arametri entrambi i rogrammi +engono com ilati% "no &al C com iler e l1altro &a TASMC oi +iene a"tomaticamente c!iamato il linFer c!e collega i &"e O5G a ena generati e gli e+ent"ali altri O5G &i libreria. Il ri$"ltato * il /ile e$eg"ibile BI;DW9DN.DHD. Se $i +"ole e//ett"are "n &eb"gging $imbolico $i "< com ilare con l1o (ione -+ rima &el rimo nome &i /ile e oi "$are il T"rbo Aeb"gger 4TA BI;DW9DN6. Anc!e in )"e$to ca$o $i o$$ono com ilare i mo&"li C in mo&o c!e +engano re$i in A$$embl,% "$an&o l1o (ione -S. C"rio$it3 "na can(one &a #T!e Dmbe&&e& M"$e#% &i GacF Gan$$le% &a cantare $"l moti+o &i #9et it be# &ei 5eatle$8 Brite in C 4Sing to t!e 5eatle1$ t"ne #9et it 5e#6 B!en I /in& m, co&e in ton$ o/ tro"ble% 0rien&$ an& colleag"e$ come to me% S eaFing wor&$ o/ wi$&om8 #Brite in C.# A$ t!e &ea&line /a$t a roac!e$% An& b"g$ are all t!at I can $ee% Somew!ere% $omeone w!i$ er$8 #Brite in C.# Brite in C% Brite in C% Brite in C% o!% Brite in C. 9OGO1$ &ea& an& b"rie&% Brite in C. I "$e& to write a lot o/ 0OSTSAN% . @ &i 9 2001-01-0@ 1? ASM C.o&t
Ing. Gabriele MONTI 1999 - 2004 0or $cience it worFe& /lawle$$l,. Tr, "$ing it /or gra !ic$X Brite in C. I/ ,o"1+e ="$t $ ent nearl, K0 !o"r$% Aeb"gging $ome a$$embl,% Soon ,o" will be gla& to Brite in C. Brite in C% Brite in C% Brite in C% ,ea!% Brite in C. 5ASIC1$ not t!e an$wer. Brite in C. Brite in C% Brite in C Brite in C% o!% Brite in C. ;a$cal won1t )"ite c"t it. Brite in C.
C e ASM
www.ingmonti.it
1? ASM C.o&t
. 9 &i 9