⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 load.c

📁 虚拟机设计与实现——C/C++
💻 C
字号:
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                                   +
+  load.c - this file implements load instructions                  +
+				LBI, LWI, LDI, LQI, LF1I, LF2I						+
+				LAD, LAI											+
+               LB, LW, LD, LQ, LF1, LF2			     			+
+                                                                   +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  macros                                                           +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*#define DBG_RUN		1*/

#ifdef DBG_RUN
#define DBG_RUN0(str);				printf("run(): "); printf(str);
#define DBG_RUN1(str,arg1);			printf("run(): "); printf(str,arg1);
#else
#define DBG_RUN0(str);
#define DBG_RUN1(str,arg1);				
#endif	

/*
	LBI $r1, byte constant ->  BBB  
	
	first byte	= instruction
	second byte = register to put constant into
	third byte	= constant to place in register
*/

#define HANDLE_LBI();	DBG_RUN0("Optimized HANDLE_LBI\n"); \
						R[RAM[R[$IP]+1]]=(S1)RAM[R[$IP]+2]; R[$IP]=R[$IP]+3;
					  
/*-----------------------------------------------------------------*/


#define HANDLE_LWI();	DBG_RUN0("Optimized HANDLE_LWI\n"); \
						R[RAM[R[$IP]+1]]=(S2)*((S2*)&RAM[R[$IP]+2]);R[$IP]=R[$IP]+4;

/*-----------------------------------------------------------------*/


#define HANDLE_LDI();	DBG_RUN0("Optimized HANDLE_LDI\n"); \
						R[RAM[R[$IP]+1]]=(S4)*((S4*)&RAM[R[$IP]+2]);R[$IP]=R[$IP]+6;

/*-----------------------------------------------------------------*/


#define HANDLE_LQI();	DBG_RUN0("Optimized HANDLE_LQI\n"); \
						R[RAM[R[$IP]+1]]=(S8)*((S8*)&RAM[R[$IP]+2]);R[$IP]=R[$IP]+10;

/*-----------------------------------------------------------------*/

#define HANDLE_LF1I();	DBG_RUN0("Optimized HANDLE_LF1I\n"); \
						Rf[RAM[R[$IP]+1]]=(F4)*((F4*)&RAM[R[$IP]+2]);R[$IP]=R[$IP]+6;

/*-----------------------------------------------------------------*/

#define HANDLE_LF2I();	DBG_RUN0("Optimized HANDLE_LF2I\n"); \
						Rd[RAM[R[$IP]+1]]=(F8)*((F8*)&RAM[R[$IP]+2]);R[$IP]=R[$IP]+10;

/*-----------------------------------------------------------------*/

/* LAD $r1, address */ 

#define HANDLE_LAD();	DBG_RUN0("Optimized HANDLE_LAD\n"); \
						R[RAM[R[$IP]+1]]=(U8)*((U8*)&RAM[R[$IP]+2]);\
						badAddress(R[RAM[R[$IP]+1]],R[$IP]); R[$IP]=R[$IP]+10;

/*-----------------------------------------------------------------*/

/* LAI $r1, $r2, qword*/ 

#define HANDLE_LAI();	DBG_RUN0("Optimized HANDLE_LAI\n"); \
						R[RAM[R[$IP]+1]]=(R[RAM[R[$IP]+2]])+((S8)*((S8*)&RAM[R[$IP]+3]));\
						badAddress(R[RAM[R[$IP]+1]],R[$IP]); R[$IP]=R[$IP]+11;

/*-----------------------------------------------------------------*/

/*
	LB $r1, $r2 ->  BBB  
	
	first byte = instruction
	second byte = register to put byte into
	third byte = register containing address where byte is located 
*/

#define HANDLE_LB();	DBG_RUN0("Optimized HANDLE_LB\n");\
						badAddress(R[RAM[R[$IP]+2]],R[$IP]); \
						R[RAM[R[$IP]+1]] = (S8)(*((S1*)&RAM[R[RAM[R[$IP]+2]]])); \
						R[$IP]=R[$IP]+3;

/*-----------------------------------------------------------------*/

#define HANDLE_LW();	DBG_RUN0("Optimized HANDLE_LW\n");\
						badAddress(R[RAM[R[$IP]+2]],R[$IP]); \
						R[RAM[R[$IP]+1]] = (S8)(*((S2*)&RAM[(U8)R[RAM[R[$IP]+2]]])); \
						R[$IP]=R[$IP]+3;

/*-----------------------------------------------------------------*/

#define HANDLE_LD();	DBG_RUN0("Optimized HANDLE_LD\n");\
						badAddress(R[RAM[R[$IP]+2]],R[$IP]); \
						R[RAM[R[$IP]+1]] = (S8)(*((S4*)&RAM[(U8)R[RAM[R[$IP]+2]]])); \
						R[$IP]=R[$IP]+3;

/*-----------------------------------------------------------------*/


#define HANDLE_LQ();	DBG_RUN0("Optimized HANDLE_LQ\n");\
						badAddress(R[RAM[R[$IP]+2]],R[$IP]); \
						R[RAM[R[$IP]+1]] = (S8)(*((S8*)&RAM[(U8)R[RAM[R[$IP]+2]]])); \
						R[$IP]=R[$IP]+3;

/*-----------------------------------------------------------------*/

/* LFI $f, $r */

#define HANDLE_LF1();	DBG_RUN0("Optimized HANDLE_LF1\n");\
						badAddress(R[RAM[R[$IP]+2]],R[$IP]); \
						Rf[RAM[R[$IP]+1]] = *((F4*)&RAM[(U8)R[RAM[R[$IP]+2]]]); \
						R[$IP]=R[$IP]+3;	

/*-----------------------------------------------------------------*/

/* LF2 $d, $r */

#define HANDLE_LF2();	DBG_RUN0("Optimized HANDLE_LF2\n");\
						badAddress(R[RAM[R[$IP]+2]],R[$IP]); \
						Rd[RAM[R[$IP]+1]] = *((F8*)&RAM[(U8)R[RAM[R[$IP]+2]]]); \
						R[$IP]=R[$IP]+3;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -