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

📄 test.cpp

📁 编译原理 一本关于编译原理的经典教材
💻 CPP
字号:
#include "VMachine.h"

#include <fstream>
#include <iostream>
#include <assert.h>
#include <string>
using namespace std;


static BYTE code[16000];
const char* srcName = "e:\\asm.txt";
TVMachine vm;

bool ReadFile(const char* name,BYTE* pCode);
bool Debug();

int main()
{
	if(!ReadFile(srcName,code))
	{
		assert(false);
	}
	vm.Run(code);
	
	Debug();
	
	return 0;
}

bool ReadFile(const char* name,BYTE* pCode)
{
	ifstream infile(name);
	if(infile.fail())
	{
		assert(false);
		return false;
	}

	while(!infile.eof())
	{
		char ins;
		infile>>ins;
		switch(ins)
		{
		case 'm':
			{
				*pCode = (BYTE)E_MOV;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		case 's':
			{
				*pCode = (BYTE)E_SET;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		case '+':
			{
				*pCode = (BYTE)E_ADD;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		case '-':
			{
				*pCode = (BYTE)E_SUB;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		case '%':
			{
				*pCode = (BYTE)E_END;
				pCode++;
			}
			break;

		case 'j': //jmp
			{
				*pCode = (BYTE)E_JMP;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		case 'z': //jz 
			{
				*pCode = (BYTE)E_JZ;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		case 't'://te
			{
				*pCode = (BYTE)E_TEQ;
				pCode++;
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
				infile>>*((DWORD*)pCode);
				pCode += sizeof(DWORD);
			}
			break;

		default:
			{
				assert(false);
			}
		}
	}

	return true;
}

bool Debug()
{
	cout<<"========DEBUG========="<<endl;
	cout<<"p to see pc"<<endl;
	cout<<"s to see sp"<<endl;
	cout<<"axxx to see value of add"<<endl;
	cout<<"q to quit"<<endl;
	cout<<"r to restart"<<endl;
	cout<<"======================"<<endl;

	char ins;
	cin>>ins;
	while(ins != 'q')
	{
		switch(ins)
		{
		case 'p':
			{
				cout<<"PC is "<<vm.GetPC()<<endl;
			}
			break;

		case 's':
			{
				cout<<"PC is "<<vm.GetPC()<<endl;
			}
			break;

		case 'a':
			{
				cout<<":";
				int num;
				cin>>num;
				if(num>=0)
				{
					cout<<endl<<"The address "<<num<<" is "<<vm.GetStackVar(num)<<endl;
				}
				else
				{
					cout<<"Invalid address"<<endl;
				}
			}
			break;

		case 'r':
			{
				if(!ReadFile(srcName,code))
				{
					assert(false);
				}
				vm.Run(code);
			}
			break;

		default:
			{
				assert(false);
			}
		}
		cout<<endl;
		cin>>ins;
	}
	return true;
}

⌨️ 快捷键说明

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