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
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
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
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_instruction ; instr_init (& recent_instruction ); executor the_executor ( the_programmers_view, the_instruction_cache ); executor :: run_program (& the_executor ); the_executor. run_program (); Horváth Péter ISA szimulátor objektum-orientált modell (C++) 4 / 9
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 ) { the_instruction_cache. at( the_programmers_view. the_ip )-> execute (); # ifdef _DEBUG_ std :: cout << " instruction executed @" << the_programmers_view. the_ip << std :: endl ; # endif... Horváth Péter ISA szimulátor objektum-orientált modell (C++) 5 / 9
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
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
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 () { the_programmers_view. the_regfile. at( the_destination_index ) = the_programmers_view. the_regfile. at( the_operand_1_index ) + the_programmers_view. the_regfile. at( the_operand_2_index ); if ( the_programmers_view. the_regfile. at( the_destination_index ) == 0) the_programmers_view. the_zero_flag = true ; else the_programmers_view. the_zero_flag = false ; ++( the_programmers_view. the_ip ); Horváth Péter ISA szimulátor objektum-orientált modell (C++) 8 / 9
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 ) { the_instruction_cache. at( the_programmers_view. the_ip )-> execute (); Horváth Péter ISA szimulátor objektum-orientált modell (C++) 9 / 9