Sei sulla pagina 1di 9

Ing.

Gabriele MONTI 1999 - 2004

C e ASM

www.ingmonti.it

1 Programmazione mista C - Assembly


1.1.1 Assembly inline
Molti com ilatori C !anno al loro interno anc!e "n # iccolo# A$$embler% &etto A$$embler #inline#. 'tili((an&o )"e$to A$$embler * o$$ibile $cri+ere i$tr"(ioni A$$embl, in )"al$ia$i "nto &el $orgente C o C-- e $i o$$ono "tili((are &iret. tamente le +ariabili e le co$tanti &e/inite in C. 0re)"entemente l1A$$embler inline non * co$2 otente come "n A$$embler com leto% er c"i $ar3 $oggetto a& alc"ne limita(ioni. Ogni com ilatore C !a il $"o mo&o er in&icare la re$en(a &i "na arte &i co&ice $critta in A$$embl,% er c"i $ar3 ne. ce$$ario con$"ltare la $"a &oc"menta(ione er a re((arne i &ettagli.

Caratteristiche dell'Assembly inline del Turbo C++


In )"e$to aragra/o ill"$treremo il /"n(ionamento &ell1A$$embler inline &el com ilatore T"rbo C-- 4o 5orlan& C--6. In T"rbo C-- * molto $em lice /ar ca ire al com ilatore c!e "n blocco &i i$tr"(ioni * $critto in A$$embl, e non in C. 5a$ta /ar rece&ere la arente$i gra//a &i ini(io &el blocco &alla arola c!ia+e #a$m#. T"tto )"ello c!e c1* /ra #a$m 7# e la arente$i gra//a &i /ine blocco +err3 con$i&erato A$$embl, e com ilato come tale. Come e$em io $i ren&a il $eg"ente co&ice8
#include <iostream.h> unsigned int A; int B; main() { A = 65534; il numero massimo a !6 "it sen#a segno B = $%&'''; il numero massimo a !6 "it con segno asm { ( asm e la )arentesi gra**a de+ono stare nella stessa linea ( A,, -ord )tr .A/0 ! somma a !6 "it0 A di+iene 65535 A,, "1te )tr .B/0 ! 2 o)era#ione 3BA456A7A a 8 "it0 )roduce un carr1 = !. 9ella +aria"ile B *inisce il numero 8$$$h e non +iene segnalato 9:33;9 :<<=<: 2 > cout << ? A = ? << A << ? B = ? << B; A@@; 2 in A cAera 65534 @ ! ()er la A,,). 3e aggiungo ancora ! si *a un errore. ,i solito )rogramma com)ilato in B non si accorge di Cuesto errore. :A )eraltro )ossi"ile che il com)ilatore a""ia unAo)#ione )er generare un )rogramma che *a il controllo degli errori aritmetici a tem)o di esecu#ione. Dualora Cuesta o)#ione sia a"ilitata il B 36 E;=A ABB=<4:<: ,:55A:<<=<: e il )rogramma )uF essere "loccato( 9ella )arte A3G lAerrore non )uF essere GA6 rile+ato automaticamente 2 cout << ? A do)o ? << A; return $;

>

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

>er. 0.@.0 2001-01-0@

. 1 &i 9

Ing. Gabriele MONTI


;na5a"el,elBI asm { 69B L=<, E7< .A @ BK/ A,, BK 0 H +ado al )rossimo elemento del +ettore 5==E ;na5a"el,elB > cout << ? A.$/ = ? << A.$/ << ? A.!/ = ? << A.!/ << ? A.H/ = ? << A.H/; return $; >

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.

Compilazione Turbo C dalla linea di comando


Il rogramma TCC 4T"rbo C Com iler6 com ila il rogramma ric!ie$to% /ile &i incl"&e com re$i% e& "$a il linFer er collegare gli .O5G otten"ti con le librerie &el C. Il roce$$o &i linFing * $+olto in mo&o a"tomatico &al rogramma TCC% er c"i $i ottiene &irettamente "n /ile .DHD. ;er e$em io% er ottenere l1e$eg"ibile &al $orgente rogramm.c % $i &e+e $cri+ere8
BI> tcc M+ )rogramm.c))

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.

Caratteristiche dell'Assembler inline del MS Visual C++


Anc!e >i$"al C-- ammette l1"$o &ell1A$$embl, inline% con minori limita(ioni ri$ etto a T"rbo C--. 9a iJ im ortante &i//eren(a * c!e >i$"al C-- * "n com ilatore er C;' H@? a K2 bit% &all1@0K@? in oi% e erci< /"n. (iona con la C;' in # rotecte& mo&e#4L6% e& "tili((a i n"o+i regi$tri e le n"o+e i$tr"(ioni a K2 bit. Il /atto c!e la C;' $ia a K2 bit $i ri/lette anc!e nella &imen$ione &ei ti i &elle +ariabili C% come ill"$trato nella $eg"ente tabella8
7i)o char unsigned char short int unsigned short int int 7ur"o B e B@@ Eer K86 !6 "it 6ntero 8 "it con segno 6ntero 8 "it sen#a segno 6ntero 16 "it con segno 6ntero !6 "it senN #a segno 6ntero 16 "it con segno Jisual B e B@@ )er K86 3H "it 6ntero 8 "it con segno 6ntero 8 "it sen#a segno 6ntero 16 "it con segno 6ntero !6 "it senN #a segno 6ntero 32 "it con segno 49; B (gcc) )er 5inu% (ed alN tre) 6ntero 8 "it con segno 6ntero 8 "it sen#a segno 6ntero 16 "it con segno 6ntero !6 "it senN #a segno 6ntero 32 "it con segno

. 2 &i 9

2001-01-0@

1? ASM C.o&t

Ing. Gabriele MONTI 1999 - 2004


long int *loat dou"le long dou"le 6ntero 32 "it con segno Jirgola mo"ile 3H "it Jirgola mo"ile 64 "it Jirgola mo"ile 96 "it

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

Chiamata dal C di procedure scritte in Assembly

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

Ing. Gabriele MONTI 1999 - 2004

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

>er. 0.@.0 2001-01-0@

. 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

Ing. Gabriele MONTI 1999 - 2004


call )o) )o) mo+ *ar )tr OLi)eA9,len c% c% -ord )tr .")MH/0a% ; ; ; ; ;

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

Collegamento al C di procedure scritte in Assembly


9e regole $tabilite &al com ilatore C er c!iamare le $"e roce&"re &e+ono e$$ere ri$ ettate &a "n rogramma A$$embl, c!e &e+e e$$ere "$ato &al C% er c"i i nomi "$ati nel mo&"lo A$$embl, &o+ranno e$$ere "g"ali a )"elli &el C% anc!e come mai"$cole e min"$cole% con l1"nica &i//eren(a c!e ini(ieranno con "na $ottolineat"ra erc!:% come +i$to% il C l1in. $eri$ce all1ini(io &i t"tti gli i&enti/icatori. Ora c!e $a iamo come il C c!iama le $"e $te$$e /"n(ioni +e&iamo come $i o$$ono $cri+ere roce&"re A$$embl, c!e $i com ortano come $e /o$$ero $critte in C. ;ren&iamo come e$em io la roce&"ra Bi eANAlen% &e/inita nell1"ltimo e$em io. D$$a &e+e cancellare com letamente la $tringa c!e le +iene a$$ata% $o$tit"en&one t"tti i caratteri e contem oraneamente re$tit"ire come integer la l"ng!e((a &ella $tringa $te$$a. I regi$tri AH% 5H% CH% e AH o$$ono e$$ere "$ati liberamente all1interno &ella roce&"ra A$$embl, erc!: $e il T"rbo C ne !a bi$ogno li $al+a rima &i c!iamare. Gli altri regi$tri &e+ono e$$ere $al+ati e ri ri$tinati rima &ella SDT. ;er rima co$a * nece$$aria "na mo&i/ica al rototi o &ella /"n(ione in C. >i$to c!e il co&ice &ella /"n(ione non * iJ re$ente in /orma &i $orgente C $i &o+r3 &ic!iarare al com ilatore c!e e$$o * e$terno% con "na &iretti+a #eNtern# 4&a no. tare la e $ottolineata% c!e non * re$ente nella analoga &iretti+a &el TASM6. Se Bi eANAlen +iene &ic!iarata eNtern il com ilatore non $egnaler3 errori )"an&o non la tro+er3 e& e$$a otr3 e$$ere collegata in "n $econ&o tem o &al linFer. A"n)"e il rototi o &ella /"n(ione Bi eANAlen &i+err3 il $eg"ente8
9ome del *ile che contiene Cuesto )rogrammaI L6E:Z5:9.BEE .. e%tern ?B? int *ar Li)eA9,len(char *ar 2stringa); ..

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

>er. 0.@.0 2001-01-0@

. V &i 9

Ing. Gabriele MONTI


V9[ Eer7utta5a3tringa ; Cuando esce di Cui in AK cAT il numero di caratteri ; (T gi\ a )osto )erchU la *un#ione lo de+e restituire in AK) ; al )osto del loo) )recedente si )ote+a usare una istru#ione di stringa0 ; Cuale la 5=,3B ; e)ilogo della )roceduraI ri)ristino di Cuanto sal+ato ini#ialmenteI E=E ,3 E=E BE ; ri)ristina il BE del B <:7 OLi)eA9,len :9,E ;9otaI la )rocedura non T ottimi##ata0 )er *arlo si )otre""ero ; usare le *un#ioni di stringa

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

>ariabile a$$ata er In&iri((o

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

>er. 0.@.0 2001-01-0@

. 9 &i 9

Potrebbero piacerti anche