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(inta,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.