Toimintokutsu

Yleinen muoto

Ohjelmassa toimintorunko suoritetaan kutsumalla toimintoa, ja prosessi on samanlainen kuin aliohjelmakutsut muilla kielillä.

InClanguage-funktion yleinen muoto:

Toiminnon nimi (todellinen parametriluettelo)

Whencallingafunctionwithoutparameters,thereisnoactualparameterlist..Theparametersintheactualparametertablecanbeconstants,variables,orotherstructureddataandexpressions.Separateeachactualparameterwithacomma.

Käyttäjätila (käyttäjätila) ja ydintila (ydintila)

Käyttöjärjestelmän prosessitila voidaan jakaa käyttäjätilaan ja ydintilaan, jotka vaativat erilaisia ​​suoritusoikeuksia. Toimintokutsu suoritetaan käyttäjätilassa.

Sisältää sisällön

Funktiolauseke

Funktiot näkyvät lausekkeina yhtenä lausekkeena, ja funktioidenpalautusarvot osallistuvat lausekkeiden laskemiseen. Tämä menetelmä edellyttää, että

Functionstatement

Yleinen funktiokutsun ja puolipisteen muoto muodostaa funktiolausekkeen.Esimerkki:printf("%d",a);scanf("%d",&b);kaikki funktiolausekkeiden muodossa olevat kutsutoiminnot.

FunctionArguments

Thefunctionappearsastheactualparameterofanotherfunctioncall.Inthiscase,thereturnvalueofthefunctionistransmittedasanactualparameter,sothefunctionmusthaveareturnvalue.Forexample:printf("%d",max(x,y));Thatis,thereturnvalueofthemaxcallisusedastheactualparameteroftheprintffunction.Anotherissuethatshouldbepaidattentiontoinfunctioncallsistheorderofevaluation.Theso-calledevaluationorderreferstowhetherthequantitiesintheactualparametertableareusedfromlefttorightorfromrighttoleft.Inthisregard,theregulationsofeachsystemarenotnecessarilythesame.Ithasbeenmentionedintheintroductionoftheprintffunction,andIwillemphasizeitagainfromtheperspectiveoffunctioncalls.

[Esimerkki]

pää()

{inti=8;printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);}

Jos arvotaan oikealta vasemmalle.Käyntituloksen pitäisi olla:

8

7

7

8

Esimerkiksi tulostetussaflatementissa++i,--i,i++,i--arvioi vasemmalta oikealle,tuloksen pitäisi olla:

9

8

8

9

Itshouldbenotedthatwhetheritisevaluatedfromlefttorightorfromrighttoleft,theoutputorderisthesame,thatis,theoutputorderisalwaysTheorderoftheactualparametersisthesameasintheactualparameterlist.SinceTurboCiscurrentlyevaluatedfromrighttoleft,theresultis8,7,7,8.Ifyoustilldon’tunderstandtheabovequestions,youwillunderstandafteratryonthecomputer.

Declarationandfunctionprototypeofthecalledfunction

Beforecallingafunctioninthemaincallingfunction,thecalledfunctionshouldbeexplained(declared),whichisthesameasbeforeusingvariables.Thevariabledescriptionisthesame.Thepurposeofexplainingthecalledfunctioninthecallingfunctionistomakethecompilersystemknowthetypeofthereturnvalueofthecalledfunction,sothatthereturnvaluecanbeprocessedaccordinglyinthecallingfunctionaccordingtothistype.

Yleinen muoto:

Tyyppimäärityksiä kutsutaanfunktionimi(tyyppiparametri,tyyppiparametri...);

Tai:

Tyyppimäärityksessä kutsutaanfunktionimi(tyyppi,tyyppi...);

Thetypeandnameoftheformalparameteraregivenintheparentheses,oronlythetypeoftheformalparameterisgiven.Thisfacilitateserrordetectionbythecompilersystemtopreventpossibleerrors.

Esimerkiksipäätoiminnon maksimitoiminnon kuvaus on:

intmax(int​​a,intb);

Kirjoitukset:

intmax(int,int);

TheClanguagealsostipulatesthatthefunctiondescriptionofthecalledfunctioninthecallingfunctioncanbeomittedinthefollowingsituations.

1)Ifthereturnvalueofthecalledfunctionisanintegerorcharactertype,youcancallthecalledfunctiondirectlywithoutexplainingit.Atthistime,thesystemwillautomaticallytreatthereturnvalueofthecalledfunctionasaninteger.ThisisthecasewhenthefunctionsisnotdescribedinthemainfunctionofExample8.2anditiscalleddirectly.

2)Whenthefunctiondefinitionofthecalledfunctionappearsbeforethecallingfunction,thecallingfunctioncanalsobecalleddirectlywithoutfurtherexplainingthecalledfunction.Forexample,inExample8.1,thedefinitionofthefunctionmaxisplacedbeforethemainfunction,sothefunctiondescriptionofthemaxfunctioncanbeomittedinthemainfunctionintmax(inta,intb).

3)Ifthetypeofeachfunctionisspecifiedoutsidethefunctionbeforethedefinitionofallthefunctions,theninthesubsequentcallingfunctions,thecalledfunctioncannolongerbedescribed.Forexample:

charstr(inta);

floatf(kellukeb);

pää()

{……}

charstr(inta)

{……)

floatf(floatb)

{……}

Thefirstandsecondlineshavepre-explainedthestrfunctionandtheffunction.Therefore,thestrandffunctionscanbecalleddirectlyinthefollowingfunctionswithoutfurtherexplanation.

4)Thecallofthelibraryfunctiondoesnotneedtobeexplained,buttheheaderfileofthefunctionmustbeincludedinthefrontofthesourcefilewiththeincludecommand.

Nestedcall

NestedfunctiondefinitionsarenotallowedinClanguage.Therefore,thefunctionsareparallel,andthereisnoproblemoftheupperlevelfunctionandthenextlevelfunction.ButtheClanguageallowsacalltoanotherfunctiontoappearinthedefinitionofafunction.Inthisway,nestedcallsoffunctionsappear.Thatis,otherfunctionsarecalledinthecalledfunction.Thisissimilartothenestingofsubroutinesinotherlanguages.Therelationshipcanberepresentedasshowninthefigure.

Thefigureshowsatwo-levelnestingsituation.Theexecutionprocessis:whenthestatementthatcallsfunctionainthemainfunctionisexecuted,functionaisswitchedto,whenfunctionbiscalledinfunctiona,functionbisswitchedtoexecution,andfunctionbisexecutedtoreturntothebreakpointoffunctionatocontinueExecute,theexecutionoftheafunctioniscompleteandreturntothebreakpointofthemainfunctiontocontinueexecution.

[Esimerkki]Laskee=2∧2!+3∧2!

Thisquestioncanwritetwofunctions,oneisthefunctionf1usedtocalculatethesquarevalue,andtheotherisThefunctionf2usedtocalculatethefactorialvalue.Themainfunctionfirstadjustsf1tocalculatethesquarevalue,andthentakesthesquarevalueinf1astheactualparameter,callsf2tocalculatethefactorialvalue,andthenreturnstof1,thenreturnstothemainfunction,andcalculatesthecumulativesumintheloopprogram.

longf1(intp)

{intk;

pidempi;

pitkäf2(int);

k=p*p;

r = f2(k);

palautus;}

pitkäf2(intq)

p>

{longc=1;

inti;

for(i=1;i<=q;i++)

c=c*i;

palautus;}

pää()

{inti;

pitkät=0;

p>

for(i=2;i<=3;i++)

s=s+f1(i);

printf("\ns=%ld\n",s);}

Intheprogram,thefunctionsf1andf2arebothlongintegers,whicharedefinedbeforethemainfunction,sothereisnoneedtoexplainf1andf2inthemainfunction.Inthemainprogram,theexecutionloopprogramsequentiallycallsthevalueofiastheactualparametertocallthefunctionf1toobtainthevalueofi2.Inf1,acalltofunctionf2occursagain.Atthistime,thevalueofi2isusedasanactualparametertoadjustf2,andthecalculationofi2!iscompletedinf2.Afterf2isexecuted,theCvalue(iei2!)isreturnedtof1,andthenf1returnstothemainfunctiontoachieveaccumulation.Sofar,therequirementoftheproblemisrealizedbythenestedcallofthefunction.Becausethevalueisverylarge,thetypesoffunctionsandsomevariablesaredeclaredaslongintegers,otherwiseitwillcausecalculationerrors.

Todellinen käyttöönotto

Osoittimen rekisteröinti

EBP

EBPistheso-calledframepointer,pointingtothecurrentactivityAbovetherecord(thebottomofthepreviousactivityrecord)

ESP

ESPistheso-calledstackpointer,whichpointstothebottomofthecurrentactivityrecord(bottomAnactivityrecordtobeinsertedatthetop)

Thevalueofthesetwopointersspecifiesthepositionofthecurrentactivityrecord

Parametrien välitys

Painafunktioparametrit Pino:moveax,dwordptr[n];(nisaparametriargumentti)

pusheax

Toiminta

Toimintokutsu suorittaa seuraavat toiminnot:

⒈Työnnäkehysosoitinpinoon:pushebp

⒉Tee kehyksen osoittimesta yhtä suuri kuin pinoosoitin:movebp,esp

⒊makethestackpointerdecrement,Thememoryaddressobtainedbysubtractionshouldbeableto(enough)beusedtostorethelocalstateofthecalledfunction:subesp,0CCh

Huomaa:0CChis0xCC,joka vaihtelee toiminnon mukaan.

Passinsavestate

pushebx;tallenna arvoebxregister

pushesi;tallennarekisterin arvo

pushedi;Tallennarekisterin arvo

Ladattu

leaedi,[ebp-0CCh];0cchistesizeofcurrentactivetietue.

EDIon määränpäähakemisto.

saatavan omaisuuden palauttaminen

00411417popedi

00411418popesi

popebx

pinoMovethepointeruptorestorespace

addesp,0CCh

Functionreturnstorleasespace

Kunfunktiopalauttaa, kääntäjä ja laitteisto suorittavat seuraavat toiminnot:

⒈Tee pinopisteestä kehysosoittimen:movesp,ebp

⒉Poptheoldframepointer-pinosta:popebp

⒊Return:ret

Esimerkki1

;voidfunction(intn);{pushebp

movebp,esp

subesp,0CCh

pushebx

pushesi

pushedi

leaedi,[ebp-0CCh]

movecx,33h

moveax,0CCCCCCCCh

repstosdwordptres:[edi]

;chara=1;

movbyteptr[a],1

;jos(n==0)palautus;

cmdwordptr[n],0

jnefunction+2Ah(4113CAh)

jmpfunction+77h(411417h)

;printf("%d\t(0x%08x)\n",n,&n);

movesi, esim

leaeax,[n]

pusheax

movecx,dwordptr[n]

pushecx

pushoffsetstring"%d\t(0x%08x)\n"(415750h)

calldwordptr[__imp__printf(4182B8h)]

addesp,0Ch

cmpesi, esim

soita@ILT+305(__RTC_CheckEsp)(411136h)

;funktio(n-1);

moveax,dwordptr[n]

subeax,1

pusheax

puhelutoiminto (411041h)

addesp,4

;printf("----%d\t(0x%08x)\n",n,&n);

movesi, esim

leaeax,[n]

pusheax

movecx,dwordptr[n]

pushecx

pushoffsetstring"----%d\t(0x%08x)\n"(41573Ch)

calldwordptr[__imp__printf(4182B8h)]

addesp,0Ch

cmpesi, esim

soita@ILT+305(__RTC_CheckEsp)(411136h);}

popedi

popesi

popebx

addesp,0CCh

cmpebp,esp

soita@ILT+305(__RTC_CheckEsp)(411136h)

movesp,ebp

popebp

ret

Esimerkki2

117:bR=t1(p);

Kokoonpanokoodi on seuraava:

00401FB8movecx,dwordptr[ebp-8];laita parametri ecx-rekisteriin

00401FBBpushecx;parametri pinoon

00401FBCcall@ILT+10(t1)(0040100f);Functioncall,senextlineaddress00401FC1työnnetään pinoon

00401FC1addesp,4;Funktion palauttaa,pinon osoitin kasvaa 4:llä ja palautuu arvoon00401FB8

00401FC4movdwordptr[ebp-10h],eax;Ota funktiopaluuarvokorkean tason kielelläkeskiarvostaja asetabMuuttujaan

Thet1functiononseuraava:

125:BOOLt1(tyhjä*p)

126:{

00402030pushebp;ebpinto-pinoon

00402031movebp,esp;ebppointtothestackattopofthittime

00402033subesp,44h;esppienenee yhdellä arvolla ja vapaatavarastoalue

p>

00402036pushebx;Laita kolmen rekisterin arvot pinoon,jotta voit käyttääfunktiossa

00402037pushesi;

00402038pushedi;

00402039leaedi, [ebp-44h];

0040203Cmovecx, 11h;

00402041moveax,0CCCCCCCCh;

00402046repstosdwordptr[edi];

127:int*q=(int*)p;;

00402048moveax,dwordptr[ebp+8];ebp+8toimintopistettäparametrin pienin bittiosoite;

;ifitisebp+4,se osoittaa funktionpaluuosoitteen00401FC1 alhaisimpaan bittiin,arvo onC1

0040204Bmovdwordptr[ebp-4],eax;

128:return0;

0040204Exoreax,eax;Palautusarvo on sijoitettu eax-rekisteriin

129:}

00402050popedi;Kolme rekisteröijää ponnahtaa pinosta

00402051popesi;

00402052popebx;

00402053movesp,ebp;esprestore

00402055popebp;ebppops pinosta,ja sen arvo on palautettu

00402056ret;Palaa tällä kertaa pinon yläosaan tallennettuun koodiosoitteeseen:00401FC1

;soifyouareunluckyIfthereturnaddressismodified,theprogramwillbeunexpected

Ylläolevan kokoonpanokoodin on koonnut VC++6.0.

ThesituationofthestackaftertheEBPisputintothestack:

Lowandhigh

↓↓

Muistiosoitepino

┆┆

0012F600├───────┤←edi=0012F600

││

0012F604├─┄┄┄┄─┤

││

││

┆44hspace┆

┆┆

││

││

0012F640├─┄┄┄┄─┤

││

0012F644├───────┤←Ebpiostettu osoittamaan tätä yksikköä,tthistimeebp=0012F644

│ACF61200│ebpisannettu arvoon ennen

0012F648├────────┤

│C11F4000│Palautusosoite

0012F64C├─────────┤←ebp+8

│A0F61200│Toimintoparametrin arvo p;

0012F650├─────────┤

││

├────────┤

┆┆

Note:Thememorystoragespacestackisarrangedfromhightolow,andtheaddressmarkedontheleftisthelowestaddressofthestorageunitatthebottomright.Forexample,0012F644pointstotheACbyteof0012F6AC,andACisatthetopofthestack.Thecontentinthememoryinthefigureiswrittenfromlowtohigh,"ACF61200"=0x0012F6AC

Selitys

(1)Acprogramiscomposedofoneormoreprogrammodules,Eachprogrammoduleasasourceprogramfile.Forlargerprograms,yougenerallydon'twanttoputallthecontentinonefile,butputtheminseveralsourcefiles,andacprogramiscomposedofseveralsourceprogramfiles.Thismakesiteasytowriteandcompileseparately,andimprovedebuggingefficiency.Asourceprogramfilecanbesharedbymultiplecprograms.

(2)Asourceprogramfileiscomposedofoneormorefunctionsandotherrelatedcontent(suchasinstructions,datadeclarationsanddefinitions,etc.).Asourceprogramfileisacompilationunit,andthesubprogramiscompiledintheunitofthesourceprogramfile,notintheunitofthefunction.

(3)Theexecutionofthecprogramstartsfromthemainfunction.Ifyoucallotherfunctionsinthemainfunction,theprocessreturnstothemainfunctionafterthecall,andthewholeprogramendsinthemainfunction.

(4)Allfunctionsareparallel,thatis,whendefiningfunctions,theyareperformedseparatelyandareindependentofeachother.Afunctionisnotsubordinatetoanotherfunction,thatis,functionscannotbenesteddefinitions.Functionscancalleachother,butcannotcallthemainfunction.Themainfunctioniscalledbytheoperatingsystem.

(5)Käyttäjän näkökulmasta toimintoja on kahdenlaisia

a:libraryfunctions,whichareprovidedbythesystem,andusersdonotneedtodefinethembythemselves,butcanusethemdirectly.Itshouldbenotedthatthenumberandfunctionsoflibraryfunctionsprovidedbydifferentclanguagecompilationsystemswillbesomewhatdifferent,ofcourse,manybasicfunctionsarecommon.

b:Käyttäjän määrittämä toiminto.Tämä on toiminto, joka vastaa käyttäjien tiettyihin tarpeisiin.

(6)Funktion muodosta funktiot on jaettu kahteen luokkaan.

a: Funktio ilman parametreja. Ei parametrifunktioita voi palauttaa tai ei palauttaa funktioarvoja, mutta yleensä on enemmän funktioarvoja, joita ei palauteta.

b:Functionwithparameters.Whencallingafunction,thecallingfunctionpassesdatatothecalledfunctionthroughparameterswhencallingthecalledfunction.Undernormalcircumstances,afunctionvaluewillbeobtainedwhenthecallingfunctionisexecuted,whichcanbeusedbythecallingfunction.

Related Articles
TOP