Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
1.1.Wywoływaniefunkcjiwjęzykach(bardzo)niskiegopoziomu
Zdefiniujmynapoczątekkilkapodstawowychpojęćodnoszącychsiędoarchitekturx86ix86-64,którymibędziemysięposługiwaćwtym
rozdziale:
wywołaniefunkcjiprzekazaniekontrolidoinnegomiejscawkodziezjednoczesnymodłożeniemnastosadresunastępnejinstrukcji;
powrótzfunkcjipobraniezestosuwartościIPorazwykonanieskokupodtenadres;
caller
wywołującyokreślamiejscewywołaniadanejfunkcji;
callee
wywoływanyokreślafunkcję,którajestwywoływana.
1.1.1.CALL,RETikonwencjewywołań
Podczasanalizykodumaszynowego(przetłumaczonegonaasembler)trzebazapomniećo„dobrodziejstwach”,jakieniosązasobąjęzyki
wyższegopoziomu,zaczynającjużodpewnychpodstawowychpojęć,takichjakfunkcje.Dużołatwiejzrozumiećdziałanieprocesora,jeżeli
kod(któryjestmudostarczonydowykonania)potraktujemyjakobliżejniepogrupowanyszereginstrukcji.Wtymmiejscunależy
wspomniećotym,żeprawiekażdaarchitekturadostarczaprymitywnychnamiastekfunkcjonalności„wywoływaniafunkcji”.Wkażdym
znanymmiprzypadkuograniczasięonadoinstrukcjiCALLlubrównoważnej,którejdziałaniemożnapodzielićnadwaetapy:zapisanie
(wpewnymmiejscu)adresunastępnejinstrukcji,anastępnieskokpodadrespodanyjakoparametrinstrukcji.Wprzypadkux86/64
„miejscem”tymjeststos.InstrukcjąkomplementarnądoCALLjestinstrukcjaRET.ZdejmujeonazestosuwartośćrejestruIP,odłożoną
tamwcześniejpodczaswywoływaniafunkcji.Dodatkowo,jeżelidlainstrukcjiRETzostałpodanyparametrN,wskaźnikstosuSPzostanie
zwiększonyowartośćpozdjęciuadresupowrotu(cojestrównoznacznezezdjęciemNbajtówzestosu).
Wlistingu1.1przedstawionyzostałkodźródłowytestowegoprogramu„ex01”.Przełącznik-O0jestużywanyprzykompilacji,aby
kompilatornieoptymalizowałkodu.Przełącznik-m32wymuszazkoleiwygenerowaniekodu32-bitowego.
//Kompilacja:gccex01.c-oex01.exe-O0-m32
intfunc1(void){
return42;
}
intmain(void){
returnfunc1();
}
Listing1.1.Kodprogramu„ex01”
Rysunek1.1.ParametrwskazujenowemiejscewkodzieprzedwywołanieminstrukcjiCALL
Nasuwasiępytanie,jakzatemprzyużyciutak„ubogiego”mechanizmumożnawywołaćfunkcjęw„nowoczesny”sposób,np:
x=moja_funkcja(1,2,"string",&wskaznik_gdziekolwiek);
czyliprzekazaćwieleparametrówróżnegotypuorazodczytaćzwróconąprzezniąwartość?
Możnatoosiągnąćnawielesposobów,korzystajączdostępnychnarzędzi,czylirejestrówprocesoraipamięci(wszczególnościstosu).
Problemzaczynasię,kiedyznaszego(binarnego)kodumusiskorzystaćktośinny.Wtedynależymudostarczyćpewienopisinterfejsu,
tzw.ABI(
ApplicationBinaryInterface
),zawierającyinformację,wjakisposóbautorkoduoczekujewywoływaniajegofunkcjiczyli
konwencjęwywołań(ang.
callingconvention
).Wszczególnościtakakonwencjazawiera: