一个简单的虚拟机
来源:互联网 发布:win10公司网络视频屏蔽 编辑:程序博客网 时间:2024/06/06 08:30
一个简单的虚拟机,虚拟机有100个字的内存,几个寄存器——指令计数器、指令寄存器、操作码寄存器、内存地址寄存器、累加寄存器。可以——输入01、输出02、加载数据到寄存器03、存放数据到内存04、简单的加05减06乘07除08运算、转移09、小于零转移10、等于零转移11、终止12。程序输入完,输入0000结束。
打印两个数中的较大数
0120 //输入一个数到内存20
0121 //输入一个数到内存21
0320 //加载内存20的数据到累加器
0621 //累加器数据减去内存21 的数据
1007 //如果小于零转移到内存07
0220 //输出内存20的数据
1200 //终止
0221 //输出内存21的数据
1200 //终止
0000 //输入结束
运行
Virtual machine is booting...
Complete booting.
Please input your program.
00 0120
01 0121
02 0320
03 0621
04 1007
05 0220
06 1200
07 0221
08 1200
09 0000
Good job.
Virtual machine is loading the program...
Complete loading.
Virtual machine is printing the program...
00 0120
01 0121
02 0320
03 0621
04 1007
05 0220
06 1200
07 0221
08 1200
Complete printing.
Virtual machine is running the program...
opcode address
01 20
100
opcode address
01 21
200
opcode address
03 20
opcode address
06 21
opcode address
10 07
opcode address
02 21
200
Complete running
Virtual machine is shutting...
Complete shutting.
//leaf_core_test.cpp文件
#include <iostream>
#include "leaf_core_virtual_machine.hpp"
using namespace std;
int main(int argc, char *argv[])
{
CVirtualMachine virtual_machine; //创建虚拟机对象
int program[100]; //存放程序
int buffer;
//启动虚拟机
virtual_machine.boot();
//输入程序
cout<<"Please enter your program"<<endl;
cout<<"00/t";
cin>>buffer;
for (int index = 0; (program[index] = buffer)!=0; index++) {
cout<<(index+1)/10<<(index+1)%10<<"/t";
cin>>buffer;
}
cout<<"Good job./n"<<endl;
//加载程序到虚拟机内存
virtual_machine.load_program(program);
//打印程序
virtual_machine.print_program();
//运行程序
virtual_machine.run_program();
//关闭虚拟机
virtual_machine.shut();
char ch;
cout<<"Window closing"<<endl;
cin>>ch;
return 0;
}
//leaf_core_virtual_machine.hpp文件
#ifndef __leaf_core_virtual_machine_hpp__
#define __leaf_core_virtual_machine_hpp__
class CVirtualMachine {
private:
int m_memory[100]; //内存
int m_instruction_counter; //指令计数器
int m_instruction_register; //指令寄存器
int m_opcode; //操作码
int m_address; //内存地址
int m_accumulator; //寄存器
public:
//Virtual Machine操作码
static const int const_input = 1; //存放用户输入数据到内存
static const int const_print = 2; //输出内存数据到屏幕
static const int const_load = 3; //加载内存数据到寄存器
static const int const_store = 4; //存放寄存器数据到内存
static const int const_plus = 5; //寄存器数据加上内存数据
static const int const_minus = 6; //寄存器数据减去内存数据
static const int const_multiply = 7; //寄存器数据乘以内存数据
static const int const_divide = 8; //寄存器数据除以内存数据
static const int const_branch = 9; //转移
static const int const_branch_below = 10; //寄存器数据小于零转移
static const int const_branch_zero = 11; //寄存器数据等于零转移
static const int const_halt = 12; //终止
public:
CVirtualMachine();
~CVirtualMachine();
void boot(); //启动虚拟机
void shut(); //关闭虚拟机
void load_program(int *program); //加载程序到虚拟机内存
void print_program(); //打印程序
void run_program(); //运行程序
};
#endif
#include <iostream>
//leaf_core_virtual_machine.cpp文件
#include "leaf_core_virtual_machine.hpp"
using namespace std;
//初始化虚拟机
CVirtualMachine::CVirtualMachine()
{
m_instruction_counter = 0;
m_instruction_register = 0;
m_opcode = 0;
m_address = 0;
}
CVirtualMachine::~CVirtualMachine()
{
}
//启动虚拟机
void CVirtualMachine::boot()
{
cout<<"Virtual machine is booting..."<<endl;
cout<<"Complete booting./n"<<endl;
}
//关闭虚拟机
void CVirtualMachine::shut()
{
cout<<"Virtual machine is shutting..."<<endl;
cout<<"Complete shutting./n"<<endl;
}
//加载程序到虚拟机内存
void CVirtualMachine::load_program(int *program)
{
int index;
cout<<"Virtual machine is loading the program..."<<endl;
for (index = 0; index<100 && program[index]!=0; index++) {
m_memory[index] = program[index];
}
m_memory[index] = program[index];
cout<<"Complete loading./n"<<endl;
}
//打印程序
void CVirtualMachine::print_program()
{
int index;
cout<<"Virtual machine is printing the program..."<<endl;
for (index = 0; index<100 && m_memory[index]!=0; index++) {
cout<<index/10<<index%10<<"/t";
cout<<m_memory[index]/1000<<m_memory[index]%1000/100
<<m_memory[index]%100/10<<m_memory[index]%10<<endl;
}
cout<<"Complete printing./n"<<endl;
}
//运行程序
void CVirtualMachine::run_program()
{
int index;
cout<<"Virtual machine is running the program..."<<endl;
//取出指令
m_instruction_counter = 0;
m_instruction_register = m_memory[m_instruction_counter++];
//指令解码
m_opcode = m_instruction_register/100;
m_address = m_instruction_register%100;
for (index = 0; index<100 && m_opcode!=const_halt; index++) {
cout<<"opcode/taddress"<<endl;
cout<<m_opcode/10<<m_opcode%10<<"/t"<<m_address/10<<m_address%10<<endl;
//执行指令
switch (m_opcode) {
case const_input:
int buffer;
cin>>buffer;
m_memory[m_address] = buffer;
break;
case const_print:
cout<<m_memory[m_address]<<endl;
break;
case const_load:
m_accumulator = m_memory[m_address];
break;
case const_store:
m_memory[m_address] = m_accumulator;
break;
case const_plus:
m_accumulator += m_memory[m_address];
break;
case const_minus:
m_accumulator -= m_memory[m_address];
break;
case const_multiply:
m_accumulator *= m_memory[m_address];
break;
case const_divide:
m_accumulator /= m_memory[m_address];
break;
case const_branch:
m_instruction_counter = m_address;
break;
case const_branch_below:
if (m_accumulator<0) {
m_instruction_counter = m_address;
}
break;
case const_branch_zero:
if (m_accumulator==0) {
m_instruction_counter = m_address;
}
break;
default:
break;
}
cout<<endl;
//取出指令
m_instruction_register = m_memory[m_instruction_counter++];
//指令解码
m_opcode = m_instruction_register/100;
m_address = m_instruction_register%100;
}
cout<<"Complete running./n"<<endl;
}
- 一个简单的虚拟机
- 一个简单的虚拟机
- 虚拟机的简单使用
- 一个简单的方法,增加虚拟机red hat enterprise 5下硬盘容量
- Java虚拟机的简单介绍
- java虚拟机的简单介绍
- 写一个虚拟机的模型
- 大一 PROJECT REPORT#1 设计一个基于C的简单语言,并为其写编译器,汇编器,虚拟机
- 虚拟机启动的一个Bat文件(启动虚拟机.bat)
- 关于 OO 及虚拟机的简单认识
- 简单的反虚拟机测试代码
- 简单的扩展虚拟机磁盘文件大小实例
- 虚拟机安装archlinux的简单步骤
- Xshell连接虚拟机的最简单方式
- Hadoop在虚拟机简单的集群
- 虚拟机不能上网简单有效的解决办法
- pwn专用虚拟机的简单工具配置
- 虚拟机和linux一些简单的命令
- jQuery 事件方法
- SharePoint 2010 新体验7 - Managed Metadata (托管元数据)
- SharePoint 2010 新体验7 - Managed Metadata (托管元数据)
- 把ACCESS转成SQL2005数据库
- 40条优化php代码的小实例
- 一个简单的虚拟机
- rand生成随机数
- linux系统sar命令的使用
- Access Services故障排除
- jQuery 效果函数
- 编译x-load
- linux下fork的运行机制详细解析
- 整数分解成连续整数之和的方法
- SharePoint Server 2010 key