bitwise.c

来自「虚拟机设计与实现——C/C++」· C语言 代码 · 共 89 行

C
89
字号
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                                   +
+  bitwise.c - this file implements bitwise instructions            +
+				AND, OR, XOR, NOT, BT, BS                           +
+                                                                   +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/* AND $r1, $r2, $r3*/

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

/* OR $r1, $r2, $r3*/

#define HANDLE_OR();		DBG_RUN0("Optimized HANDLE_OR\n"); \
						R[RAM[R[$IP]+1]] = R[RAM[R[$IP]+2]] | R[RAM[R[$IP]+3]];\
						R[$IP]=R[$IP]+4;

/* XOR $r1, $r2, $r3*/

#define HANDLE_XOR();	DBG_RUN0("Optimized HANDLE_XOR\n"); \
						R[RAM[R[$IP]+1]] = R[RAM[R[$IP]+2]] ^ R[RAM[R[$IP]+3]];\
						R[$IP]=R[$IP]+4;

/* NOT $r1, $r2*/

#define HANDLE_NOT();	DBG_RUN0("Optimized HANDLE_NOT\n"); \
						R[RAM[R[$IP]+1]] = ~R[RAM[R[$IP]+2]];\
						R[$IP]=R[$IP]+3;

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

/* BT $r1, $r2, $r3  $r1=1 if $r3rd bit in $r2 is set, else 0*/

void handleBT()
{
	int index;
	U8 mask;
	U8 bit; /* 0-63 */

	DBG_RUN0("handleBT\n"); 
	bit = R[RAM[R[$IP]+3]]; 
	if(bit > 63)
	{
		ERROR0_LVL2("handleBT(): bit index is out of range");
		bit = 63;
	}
	mask = (U8)0x1;
	for(index=0;index<bit;index++)
	{
		mask = mask*2;
	}
	mask = R[RAM[R[$IP]+2]] & mask;
	if(mask > 0){ R[RAM[R[$IP]+1]] = 0x1; }
	else{ R[RAM[R[$IP]+1]] = 0x0; }
	R[$IP]=R[$IP]+4;
	return;

}/*end handleBT*/

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

/* BS $r1, $r2	set $r2th bit in $r1 */

void handleBS()
{
	int index;
	U8 mask;
	U8 bit; /* 0-63 */

	DBG_RUN0("handleBS\n"); 
	bit = R[RAM[R[$IP]+2]];
	if(bit > 63)
	{
		ERROR0_LVL2("handleBS(): bit index is out of range");
		bit = 63;
	}
	mask = (U8)0x1;
	for(index=0;index<bit;index++)
	{
		mask = mask*2;
	}
	R[RAM[R[$IP]+1]] = R[RAM[R[$IP]+1]] | mask;
	R[$IP]=R[$IP]+3;
	return;

}/*end handleBS*/

⌨️ 快捷键说明

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