C++作成簡易mips 32アセンブリ
24135 ワード
【シミュレーション】シミュレーションに基づく32ビット仮想コンピュータ設計とMips 32命令システムの実現
実装内容: Mips 32命令の指取り、復号、計算、アクセス、書き込みの5つのステップのソフトウェアシミュレーション を完了する.は、システム入力機器言語ソースプログラム のようにすることができる.は、内部レジスタを初期化することができる .は、プログラム を実行することができる.は運転結果を見ることができ、命令の実行過程 を反映することができる.シミュレーション5段流水線の実行過程 データ関連の問題を解決した は、パイプラインの実行プロセス を反映する.グラフィックインタフェースの開発が完了しました 以下のように実行します.
【注】本システムは機能の実現に重点を置いているため、いくつかの詳細な点でハードウェアと一致しない.
(一)類説明
Mips 32命令クラスの宣言
命令クラス初期化の対象はMisp 32命令である.(1)1つの命令は5つの段階を有する:指を取る、復号する、計算する、訪問する、書く、クラス関数で実現する.(2)Mips 32命令はいくつかのタイプ(他の文章のMips 32命令大全を参照できる)に分けられ,変数typeを利用して区別され,復号関数の実現が容易である.
五段流水線類の宣言
(1)同じ時間に5本のMips 32命令しか同時に実行できない(2)変数により命令実行の状態を判断する(e.g:IF_Used=0はこの命令の次の指取り段階を実行することを表す)
(二)グローバル変数の宣言
(三)五段流水線の実現
ソースアドレス:https://github.com/850552586/Mips32皆さん、たくさんstar~ありがとうございます.質問があればメッセージを残してもいいです.
実装内容:
【注】本システムは機能の実現に重点を置いているため、いくつかの詳細な点でハードウェアと一致しない.
(一)類説明
Mips 32命令クラスの宣言
class Mips32_instruction
{
public:
void init();
int IF();//
void ID();//
void EX();//
void MEM();//
void WB();//
char instruction[33];
string op;//6:
string rs;//5
string rt;//5
string rd;//5
string shamt;//5
string func;//6
string immediate;//16
string address;//26
char type;
int result;//
int add_result;//
int rs_num = 0;//rs
int rt_num = 0;//rt
int rd_num = 0;//rd
int shamt_num = 0;//shamt
int immediate_num = 0;//
int address_num = 0;//
int memory_address = 0;//
string order;
int rs_data, rt_data;//
};
命令クラス初期化の対象はMisp 32命令である.(1)1つの命令は5つの段階を有する:指を取る、復号する、計算する、訪問する、書く、クラス関数で実現する.(2)Mips 32命令はいくつかのタイプ(他の文章のMips 32命令大全を参照できる)に分けられ,変数typeを利用して区別され,復号関数の実現が容易である.
五段流水線類の宣言
class Pipeline
{
public:
Mips32_instruction Task[5];
int Task_Pro[5];
int IF_Used = 0, ID_Used = 0, EX_Used = 0, MEM_Used = 0, WB_Used = 0;
//
void System_Run();//
};
(1)同じ時間に5本のMips 32命令しか同時に実行できない(2)変数により命令実行の状態を判断する(e.g:IF_Used=0はこの命令の次の指取り段階を実行することを表す)
(二)グローバル変数の宣言
extern HDC g_hdc, g_mdc; //
extern HBITMAP g_hBackGround; //
extern wchar_t sz[100];
extern HWND edit_ip;
extern HWND Start_Button;//
extern HWND Help_Button;//
extern HWND End_Button;//
extern vector<char> Instruction_Memory;//
extern int Data_Memory[256];//
//
extern string Register_name[32];//
extern int reg_result[32];// , ,
extern int clock_cycle;//
extern int PC;//
extern int PC_Next;// ,
extern int PC_Len;//
extern int regis_init;//
// ,
extern string instruction_out;
extern string rt;
extern string rs;
extern char outtype;
extern int outimmediate;
extern int special;
(三)五段流水線の実現
int start = 0;
void Pipeline::System_Run()
{
instruction_out = "";
int i, sign = 0;
IF_Used = 0, ID_Used = 0, EX_Used = 0, MEM_Used = 0, WB_Used = 0;
if (clock_cycle == 0)
Task_Pro[0] = 0;
if (clock_cycle == 1)
Task_Pro[1] = 0;
if (clock_cycle == 2)
Task_Pro[2] = 0;
if (clock_cycle == 3)
Task_Pro[3] = 0;
if (clock_cycle == 4)
Task_Pro[4] = 0;
for (int k = 0; k < 5; k++)
{
i = (start + k) % 5;
switch (Task_Pro[i])
{
case 0://
if (IF_Used == 0)
{
if (Task[i].IF())
{
IF_Used = i + 1;
Task_Pro[i] = (Task_Pro[i] + 1) % 5;
}
}
break;
case 1://
if (ID_Used == 0)
{
Task[i].ID();
ID_Used = i + 1;
Task_Pro[i] = (Task_Pro[i] + 1) % 5;
}
break;
case 2://
if (EX_Used == 0)
{
Task[i].EX();
EX_Used = i + 1;
Task_Pro[i] = (Task_Pro[i] + 1) % 5;
}
break;
case 3://
if (MEM_Used == 0)
{
Task[i].MEM();
MEM_Used = i + 1;
Task_Pro[i] = (Task_Pro[i] + 1) % 5;
}
break;
case 4://
if (WB_Used == 0)
{
sign = 1;
Task[i].WB();
WB_Used = i + 1;
Task_Pro[i] = (Task_Pro[i] + 1) % 5;
}
break;
}
}
clock_cycle++;
if (sign)
start = (start + 1) % 5;
}
ソースアドレス:https://github.com/850552586/Mips32皆さん、たくさんstar~ありがとうございます.質問があればメッセージを残してもいいです.