Objektum-orientált modellek
Esettanulmány
Budapesti Műszaki és Gazdaságtudományi Egyetem
ISA szimulátor – objektum-orientált modell (C++) Horváth Péter Elektronikus Eszközök Tanszéke
2015. február 12.
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
1/9
Objektum-orientált modellek
Esettanulmány
Alapok
Objektum-orientált programozás – alapfogalmak elnevezés: a probléma megoldása objektumok (adatszerkezetek és a rajtuk/általuk végzett műveletek) definiálásával történik az objektumok adatszerkezeteinek és műveleteinek egysége nyelvi szinten támogatott
nyelvi eszköztár: az objektum-orientált nyelvek elsődleges eszköze az osztály: egyazon tulajdonságokkal bíró objektumok absztrakt modellje osztály interfésze műveletek, amelyek az osztály egy példányán (objektum) elvégezhetők művelet: alprogram (lásd procedurális programozás) az osztály használója által közvetlenül hozzáférhető adatszerkezetek
osztály implementációja: az interfészt alkotó alprogramok implementációja és az osztály használója által közvetlenül nem hozzáférhető adatszerkezetek Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
2/9
Objektum-orientált modellek
Esettanulmány
C++ nyelvi eszközök
Osztály Az osztály olyan konstrukció, amely egyaránt magában foglalja a tervezési egységet leíró tulajdonságokat (tagváltozók) és a tervezési egységen vagy általa végezhető műveleteket (tagfüggvények). Az osztály belső konzisztenciájáról a publikus interfészt alkotó tagfüggvények gondoskodnak. Az osztály implementációja a felhasználó számára nem releváns. class circle { double r ; public : void set_r ( double const r ) { if ( r < 0 ) std :: cout << ERROR ! << std :: endl ; else this - > r = r ; } double get_r () { return this - > r ; } double get_area () { return this - > r * this - > r * 3.14259; } double get_perimeter () { return 6.28318 * this - > r ; } };
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
3/9
Objektum-orientált modellek
Esettanulmány
C++ nyelvi eszközök
Tagfüggvények implicit paramétere Minden tagfüggvénynek van egy implicit paramétere: a this pointer, amely mindig az osztály azon példányára mutat, amelyen a tagfüggvényt meghívtuk. Egy tagfüggvény nem hívható objektumtól függetlenül, mindig ismernünk kell a this pointert. A C modell esetén hasonló mechanizmust valósítottunk meg. Objektum-orientált nyelvek esetén automatikusan megvalósul. C++ modell C modell struct instruction the_i n st ru ct i on ; instr_init (& re ce n t_ in s tr u c t i o n );
executor the_executor ( the_programmers_view , t h e _ i n s t r u c t i o n _ c a c h e ); executor :: run_program (& the_executor );
⇓ the_executor . run_program ();
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
4/9
Objektum-orientált modellek
Esettanulmány
Az ISA szimulátor objektum-orientált modellje
Az ISA szimulátor működése A bemutatott ISA szimulátor assembly forráskód alapján modellezi egy mikroprocesszorban végbemenő folyamatokat. Az egyes utasítások végrehajtása debugger-ben, vagy debug információk szabványos kimenetre írásával követhető nyomon.
_div_routine i2rf 0 0 i2rf 1 1 i2rf 2 -1 i2rf 3 4 i2rf 4 2 i2rf 5 3 m2rf 15 0 0 m2rf 14 0 1 add 14 14 0 bz _L8 ...
... void run_program () { while ( true ) { t h e _ i n s t r u c t i o n _ c a c h e . at ( t h e _ p r o g r a m m e r s _ v i e w . the_ip ) - > execute (); # ifdef _DEBUG_ std :: cout << " instruction executed @ " << t h e _ p r o g r a m m e r s _ v i e w . the_ip << std :: endl ; # endif } } ...
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
5/9
Objektum-orientált modellek
Esettanulmány
Implementációs részletek
A modell ősosztályai asm_parser: Beolvassa az assembly forrásállományt és felépíti belőle az utasításokat tartalmazó vektort (instruction_cache). programmers_view: A mikroprocesszor belső erőforrásait és a külső erőforrásokra mutató leírókat (pointerek, referenciák) tartalmazza (programozói nézet). utasításmutató: the_ip regisztertömb: the_regfile zero flag: the_zero_flag az adatmemóriára mutató referencia: the_data_cache
instruction: Az utasításkészlet 9 gépi utasításból áll, ezek mindegyike egy-egy külön osztály. Az instruction osztály a gépi utasítások ősosztálya. Adattagjai: címke (the_label) operációs kód (the_opcode) referencia a programozói nézetre (the_programmers_view)
executor: Az utasítások felhozásáért és azok futtatásáért felelős osztály. Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
6/9
Objektum-orientált modellek
Esettanulmány
Implementációs részletek
A szimulátor architektúrája – osztálydiagram
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
7/9
Objektum-orientált modellek
Esettanulmány
Implementációs részletek
Az utasítások Az utasítások hierarchiája tartalmazza az assembly forráskódból kinyert információt. Az utasítások hierarchiájának gyermekosztályai (a konkrét gépi utasítások) "saját magukat hajtják végre" (execute()). Az utasítások "látják"a processzor belső erőforrásait, hiszen ezeken dolgoznak (the_programmers_view). void execute () { t h e _ p r o g r a m m e r s _ v i e w . the_regfile . at ( t h e _ d e s t i n a t i o n _ i n d e x ) = t h e _ p r o g r a m m e r s _ v i e w . the_regfile . at ( t h e _ o p e r a n d _ 1 _ i n d e x ) + t h e _ p r o g r a m m e r s _ v i e w . the_regfile . at ( t h e _ o p e r a n d _ 2 _ i n d e x ); if ( t h e _ p r o g r a m m e r s _ v i e w . the_regfile . at ( t h e _ d e s t i n a t i o n _ i n d e x ) == 0) t h e _ p r o g r a m m e r s _ v i e w . the_zero_flag = true ; else t h e _ p r o g r a m m e r s _ v i e w . the_zero_flag = false ; ++( t h e _ p r o g r a m m e r s _ v i e w . the_ip ); }
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
8/9
Objektum-orientált modellek
Esettanulmány
Implementációs részletek
Az executor osztály A gépi utasítások fent bemutatott viselkedéséből adódóan az executor osztálynak csak annyi a feladata, hogy az utasításokat felhozza a programtárból és meghívja az execute() függvényüket. A fetch végrehajtásához az executor oszálynak látnia kell magát az utasítás memóriát (the_instruction_cache) és az utasításmutatót (the_ip) tartalmazó programozói nézetet (the_programmers_view). void run_program () { while ( true ) { t h e _ i n s t r u c t i o n _ c a c h e . at ( t h e _ p r o g r a m m e r s _ v i e w . the_ip ) - > execute (); } }
Horváth Péter
ISA szimulátor – objektum-orientált modell (C++)
9/9