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

📄 jopvm.c

📁 ALTERA的NIOS处理器!文件直接可以打开直接选择器件重新编译!
💻 C
📖 第 1 页 / 共 3 页
字号:
				val = stack[sp-1] * stack[sp];
				stack[--sp] = val;
				break;
			case 105 :		// lmul
				noim(105);
				break;
			case 106 :		// fmul
				noim(106);
				break;
			case 107 :		// dmul
				noim(107);
				break;
			case 108 :		// idiv
				val = stack[sp-1] / stack[sp];
				stack[--sp] = val;
				break;
			case 109 :		// ldiv
				noim(109);
				break;
			case 110 :		// fdiv
				noim(110);
				break;
			case 111 :		// ddiv
				noim(111);
				break;
			case 112 :		// irem
				val = stack[sp-1] % stack[sp];
				stack[--sp] = val;
				break;
			case 113 :		// lrem
				noim(113);
				break;
			case 114 :		// frem
				noim(114);
				break;
			case 115 :		// drem
				noim(115);
				break;
			case 116 :		// ineg
				stack[sp] = -stack[sp];
				break;
			case 117 :		// lneg
				noim(117);
				break;
			case 118 :		// fneg
				noim(118);
				break;
			case 119 :		// dneg
				noim(119);
				break;
			case 120 :		// ishl
				val = stack[sp-1] << stack[sp];
				stack[--sp] = val;
				break;
			case 121 :		// lshl
				noim(121);
				break;
			case 122 :		// ishr
				val = stack[sp-1] >> stack[sp];
				stack[--sp] = val;
				break;
			case 123 :		// lshr
				noim(123);
				break;
			case 124 :		// iushr
				val = stack[sp-1] >> stack[sp];
				stack[--sp] = val;
				break;
			case 125 :		// lushr
				noim(125);
				break;
			case 126 :		// iand
				val = stack[sp-1] & stack[sp];
				stack[--sp] = val;
				break;
			case 127 :		// land
				noim(127);
				break;
			case 128 :		// ior
				val = stack[sp-1] | stack[sp];
				stack[--sp] = val;
				break;
			case 129 :		// lor
				noim(129);
				break;
			case 130 :		// ixor
				val = stack[sp-1] ^ stack[sp];
				stack[--sp] = val;
				break;
			case 131 :		// lxor
				noim(131);
				break;
			case 132 :		// iinc
				idx = readOpd8u();
				stack[vp+idx] = stack[vp+idx]+readOpd8s();
				break;
			case 133 :		// i2l
				noim(133);
				break;
			case 134 :		// i2f
				noim(134);
				break;
			case 135 :		// i2d
				noim(135);
				break;
			case 136 :		// l2i
				val = stack[sp];	// low part
				--sp;				// drop high word
				stack[sp] = val;	// low on stack
				break;
			case 137 :		// l2f
				noim(137);
				break;
			case 138 :		// l2d
				noim(138);
				break;
			case 139 :		// f2i
				noim(139);
				break;
			case 140 :		// f2l
				noim(140);
				break;
			case 141 :		// f2d
				noim(141);
				break;
			case 142 :		// d2i
				noim(142);
				break;
			case 143 :		// d2l
				noim(143);
				break;
			case 144 :		// d2f
				noim(144);
				break;
			case 145 :		// i2b
				noim(145);
				break;
			case 146 :		// i2c
				stack[sp] = stack[sp] & 0x0ffff;
				break;
			case 147 :		// i2s
				noim(147);
				break;
			case 148 :		// lcmp
				noim(148);
				break;
			case 149 :		// fcmpl
				noim(149);
				break;
			case 150 :		// fcmpg
				noim(150);
				break;
			case 151 :		// dcmpl
				noim(151);
				break;
			case 152 :		// dcmpg
				noim(152);
				break;
			case 153 :		// ifeq
			case 198 :		// ifnull
				new_pc = pc-1;
				new_pc += readOpd16s(); /* Nils */
				sp--;
				if (stack[sp+1] == 0) pc = new_pc;
				break;
			case 154 :		// ifne
			case 199 :		// ifnonnull
				new_pc = pc-1;
				new_pc += readOpd16s(); /* Nils */
				sp--;
				if (stack[sp+1] != 0) pc = new_pc;
				break;
			case 155 :		// iflt
				new_pc = pc-1; 
				new_pc += readOpd16s(); /* Nils */
				sp--;
				if (stack[sp+1] < 0) pc = new_pc;
				break;
			case 156 :		// ifge
				new_pc = pc-1; 
				new_pc += readOpd16s();
				sp--;
				if (stack[sp+1] >= 0) pc = new_pc;
				break;
			case 157 :		// ifgt
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp--;
				if (stack[sp+1] > 0) pc = new_pc;
				break;
			case 158 :		// ifle
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp--;
				if (stack[sp+1] <= 0) pc = new_pc;
				break;
			case 159 :		// if_icmpeq
			case 165 :		// if_acmpeq
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp -= 2;
				if (stack[sp+1] == stack[sp+2]) pc = new_pc;
				break;
			case 160 :		// if_icmpne
			case 166 :		// if_acmpne
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp -= 2;
				if (stack[sp+1] != stack[sp+2]) pc = new_pc;
				break;
			case 161 :		// if_icmplt
				new_pc = pc-1;
				new_pc += readOpd16s(); /* Nils */
				sp -= 2;
				if (stack[sp+1] < stack[sp+2]) pc = new_pc;
				break;
			case 162 :		// if_icmpge
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp -= 2;
				if (stack[sp+1] >= stack[sp+2]) pc = new_pc;
				break;
			case 163 :		// if_icmpgt
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp -= 2;
				if (stack[sp+1] > stack[sp+2]) pc = new_pc;
				break;
			case 164 :		// if_icmple
				new_pc = pc-1;
				new_pc += readOpd16s();
				sp -= 2;
				if (stack[sp+1] <= stack[sp+2]) pc = new_pc;
				break;
			case 167 :		// goto
				new_pc = pc-1;
				new_pc += readOpd16s();
				pc = new_pc;
				break;
			case 168 :		// jsr
				noim(168);
				break;
			case 169 :		// ret
				noim(169);
				break;
			case 170 :		// tableswitch
				noim(170);
				break;
			case 171 :		// lookupswitch
				noim(171);
				break;
			case 176 :		// areturn
			case 174 :		// freturn
			case 172 :		// ireturn
				ireturn();
				break;
			case 173 :		// lreturn
				lreturn();
				break;
			case 175 :		// dreturn
				lreturn();
				break;
			case 177 :		// return
				vreturn();
				break;
			case 178 :		// getstatic
				getstatic();
				break;
			case 179 :		// putstatic
				putstatic();
				break;
			case 180 :		// getfield
				getfield();
				break;
			case 181 :		// putfield
				putfield();
				break;
			case 182 :		// invokevirtual
				invokevirtual();
				break;
			case 183 :		// invokespecial
				invokespecial();
				break;
			case 184 :		// invokestatic
				invokestatic();
				break;
			case 185 :		// invokeinterface
				noim(185);
				break;
			case 186 :		// unused_ba
				noim(186);
				break;
			case 187 :		// new
				jjvmConst(187);

/*	use function in JVM.java
				idx = readOpd16u();
				val = readMem(cp+idx);	// pointer to class struct
				writeMem(heap, val+2);	// pointer to method table on objectref-1
				++heap;
				val = readMem(val);		// instance size
// TODO init object to zero
				stack[++sp] = heap;		// objectref
				heap += val;
System.out.println("new heap: "+heap);
*/
				break;
			case 188 :		// newarray
				readOpd8u();		// ignore typ
				val = stack[sp--];	// count from stack
				writeMem(heap, val);
				++heap;
		 // geaendert in (Nils)
		 //	 writeMem(heap++, val);
				stack[++sp] = heap;	// ref to first element
				heap += val;
// System.out.println("newarray heap: "+heap);
				break;
			case 189 :		// anewarray
				jjvmConst(189);
				break;
			case 190 :		// arraylength
				ref = stack[sp--];	// ref from stack
				--ref;				// point to count
				stack[++sp] = readMem(ref);
				break;
			case 191 :		// athrow
				noim(191);
				break;
			case 192 :		// checkcast
				noim(192);
				break;
			case 193 :		// instanceof
				noim(193);
				break;
			case 194 :		// monitorenter
				sp--;		// we don't use the objref
				intEna = 0;
				++moncnt;
				// noim(194);
				break;
			case 195 :		// monitorexit
				sp--;		// we don't use the objref
				--moncnt;
				if (moncnt==0) {
					intEna = 1;
				}
				// noim(195);
				break;
			case 196 :		// wide
				noim(196);
				break;
			case 197 :		// multianewarray
				noim(197);
				break;
			case 200 :		// goto_w
				noim(200);
				break;
			case 201 :		// jsr_w
				noim(201);
				break;
			case 202 :		// breakpoint
				noim(202);
				break;
			case 203 :		// resCB
				noim(203);
				break;
			case 204 :		// resCC
				noim(204);
				break;
			case 205 :		// resCD
				noim(205);
				break;
			case 206 :		// resCE
				noim(206);
				break;
			case 207 :		// resCF
				noim(207);
				break;
			case 208 :		// jopsys_null
				noim(208);
				break;
			case 209 :		// jopsys_rd
				sysRd();
				break;
			case 210 :		// jopsys_wr
				sysWr();
				break;
			case 211 :		// jopsys_rdmem
				ref = stack[sp--];
				stack[++sp] = readMem(ref);
				break;
			case 212 :		// jopsys_wrmem
				ref = stack[sp--];
				val = stack[sp--];
				writeMem(ref, val);
				break;
			case 213 :		// jopsys_rdint
				ref = stack[sp--];
//
//	first variables in jvm.asm
//
//	mp		?		// pointer to method struct
//	cp		?		// pointer to constants
//	heap	?		// start of heap
//
//	jjp		?		// pointer to meth. table of Java JVM functions
//	jjhp	?		// pointer to meth. table of Java JVM help functions
//
//	moncnt	?		// counter for monitor

				if(ref == 0) 
					val = mp;
				else if(ref == 1) 
					val = cp;
				else if(ref == 2)
					val = heap;
				else if(ref == 3)
					val = jjp;
				else if(ref == 4)
					val = jjhp;
				else if(ref == 5)
					val = moncnt;
				else 
					val = stack[ref];
	
				stack[++sp] = val;
				break;
			case 214:		// jopsys_wrint
				ref = stack[sp--];
				val = stack[sp--];
				if(ref == 0) 
					mp = val;
				else if(ref == 1)
					cp = val;
				else if(ref == 2)
					heap = val;
				else if(ref == 3)
					jjp = val;
				else if(ref == 4)
					jjhp = val;
				else if(ref == 5)
					moncnt = val;
				else
					stack[ref] = val;
				break;
			case 215:		// jopsys_getsp
				val = sp;
				stack[++sp] = val;
				break;
			case 216:		// jopsys_setsp
				val = stack[sp--];
				sp = val;
				break;
			case 217:		// jopsys_getvp
				stack[++sp] = vp;
				break;
			case 218 :		// jopsys_setvp
				vp = stack[sp--];
				break;
			case 219 :		// jopsys_int2ext
// public static native void int2extMem(int intAdr, int extAdr, int cnt);
				a = stack[sp--];
				b = stack[sp--];
				c = stack[sp--];
				for(; a>=0; --a) {
					writeMem(b+a, stack[c+a]);
				}
				break;
			case 220 :		// jopsys_ext2int
// public static native void ext2intMem(int extAdr, int intAdr, int cnt);
				a = stack[sp--];
				b = stack[sp--];
				c = stack[sp--];
				for(; a>=0; --a) {
					stack[b+a] = readMem(c+a);
				}
				break;
			case 221 :		// jopsys_nop
				break;
			case 222 :		// resDE
				noim(222);
				break;
			case 223 :		// resDF
				noim(223);
				break;
			case 224 :		// resE0
				noim(224);
				break;
			case 225 :		// resE1
				noim(225);
				break;
			case 226 :		// resE2
				noim(226);
				break;
			case 227 :		// resE3
				noim(227);
				break;
			case 228 :		// resE4
				noim(228);
				break;
			case 229 :		// resE5
				noim(229);
				break;
			case 230 :		// resE6
				noim(230);
				break;
			case 231 :		// resE7
				noim(231);
				break;
			case 232 :		// resE8
				noim(232);
				break;
			case 233 :		// resE9
				noim(233);
				break;
			case 234 :		// resEA
				noim(234);
				break;
			case 235 :		// resEB
				noim(235);
				break;
			case 236 :		// resEC
				noim(236);
				break;
			case 237 :		// resED
				noim(237);
				break;
			case 238 :		// resEE
				noim(238);
				break;
			case 239 :		// resEF
				noim(239);
				break;
			case 240 :		// sys_int
				--pc;		// correct wrong increment on jpc
				invoke(jjhp);	// interrupt() is at offset 0
				break;
			case 241 :		// resF1
				noim(241);
				break;
			case 242 :		// resF2
				noim(242);
				break;
			case 243 :		// resF3
				noim(243);
				break;
			case 244 :		// resF4
				noim(244);
				break;
			case 245 :		// resF5
				noim(245);
				break;
			case 246 :		// resF6
				noim(246);
				break;
			case 247 :		// resF7
				noim(247);
				break;
			case 248 :		// resF8
				noim(248);
				break;
			case 249 :		// resF9
				noim(249);
				break;
			case 250 :		// resFA
				noim(250);
				break;
			case 251 :		// resFB
				noim(251);
				break;
			case 252 :		// resFC
				noim(252);
				break;
			case 253 :		// resFD
				noim(253);
				break;
			case 254 :		// sys_noim
				noim(254);
				break;
			case 255 :		// sys_init
				noim(255);
				break;
			default:
				noim(instr);
		}
	}
}


int main(int argc, char **arg)
{
	int i;
	if (sizeof(int) != 4) {
		printf("wrong int size\n");
		exit(-1);
	}
	init(arg[1]);
	interprete();
	return 0;
}

⌨️ 快捷键说明

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