C++作成簡易mips 32アセンブリ

24135 ワード

【シミュレーション】シミュレーションに基づく32ビット仮想コンピュータ設計とMips 32命令システムの実現
実装内容:
  • Mips 32命令の指取り、復号、計算、アクセス、書き込みの5つのステップのソフトウェアシミュレーション
  • を完了する.
  • は、システム入力機器言語ソースプログラム
  • のようにすることができる.
  • は、内部レジスタを初期化することができる
  • .
  • は、プログラム
  • を実行することができる.
  • は運転結果を見ることができ、命令の実行過程
  • を反映することができる.
  • シミュレーション5段流水線の実行過程
  • データ関連の問題を解決した
  • は、パイプラインの実行プロセス
  • を反映する.
  • グラフィックインタフェースの開発が完了しました
  • 以下のように実行します.
    【注】本システムは機能の実現に重点を置いているため、いくつかの詳細な点でハードウェアと一致しない.
    (一)類説明
    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~ありがとうございます.質問があればメッセージを残してもいいです.