没有合适的资源?快使用搜索试试~ 我知道了~
4.29MIPS模拟机1
需积分: 0 1 下载量 199 浏览量
2022-08-03
11:29:30
上传
评论 1
收藏 458KB PDF 举报
温馨提示
试读
13页
1.实验描述 1. 汇编器:输入汇编指令,转换成机器码模拟执行 2. 读入汇编好的机器码(二进制),显示对应的汇编指令(反汇编),并模拟执行 1. 模拟器运行界
资源详情
资源评论
资源推荐
MIPS模拟机
Name: 王子腾
StuID: 3180102173
Date: 2020/04/28
1.实验描述
以程序模拟MIPS运行,功能包括:
1. 汇编器:输入汇编指令,转换成机器码模拟执行。
2. 读入汇编好的机器码(二进制),显示对应的汇编指令(反汇编),并模拟执行。
1. 模拟器运行界面设计:可以命令行或窗口界面。列表显示32个寄存器。
2. 可执行多条指令。可观察寄存器、内存的变化。(命令行版可参考DEBUG)
DEBUG命令:
-->R-看寄存器,
-->D-数据方式看内存,
-->U-指令方式看内存,
-->A-写汇编指令到内存,
-->T-单步执行内存中的指令
2. 程序架构
2.1 MIPS类(模拟机)
class MIPS
{
private:
int PC; // Program Counter
int num; // num of instructions
Memory m;
Register reg;
Instruction ins;
public:
MIPS(int type);
~MIPS();
void Regshow();
void Addins();
void execute();
void Memshowdata();
void Memshowins();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.2 Memory类(内存)
2.3 Register类(32个寄存器)
2.4 Instruction类(指令系统)
class Memory
{
private:
const int capacity = 1024; // 1kb
int ptr = 0; // ins-ptr
string memory[1024]; // 32bit
int record[1024]; // 1: Instruction 2: Data
public:
void writedata(int pos, int type,string val);
string read(int pos);
int showadd(int pos);
void showdata();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
class Register
{
private:
const string reg[32] = {"zero", "at", "v0", "v1", "a0", "a1", "a2",
"a3", "t0", "t1", "t2", "t3", "t4","t5", "t6", "t7", "s0", "s1", "s2",
"s3", "s4", "s5", "s6", "s7", "t8", "t9", "k0", "k1", "gp", "sp",
"fp","ra"};
int val[32];
public:
Register();
~Register();
int regindex(string);
string regname(int);
void setval(int index, int v);
int getval(int);
void show();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Instruction
{
private:
vector<string> sins;
// vector<int> iins;
vector<string> bins;
vector<string> label;
public:
vector<string> option;
Instruction(int type); // 1: Assemble 2: Binary
~Instruction();
string getins(int type, int pos);
int getsize();
void showins(int);
void addins(string);
void compile(int,string); // Compile Unit
void reverse(int); // Reverse-Compile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
可执行指令
3. 核心代码
3.1 汇编指令编译
3.1.1 字符串预处理(标签 + 操作符 分割)
int findlabel(string); // Label-Check
};
19
20
add rd, rs, rt
addi rt, rs, dat
sub rd, rs, rt
beq rs, rt, label
bne rs, rt, label
j label
lw rt, dat(rs)
sw rt, dat(rs)
1
2
3
4
5
6
7
8
// Label Apart
regex e("^([a-z 0-9]+):"); // Label Process
smatch m;
bool found = regex_search(instruction,m,e);
if(found)
{
lab = m.str();
lab.erase(lab.end()-1);
int i = 0;
while(instruction[i]!=':')
i++;
instruction.erase(0,i+1);
}
else lab = "";
label.push_back(lab); // label
// clean space
while(instruction[0]==' ')
instruction.erase(instruction.begin());
string op;
int i;
// op
for(i = 0; instruction[i]!=' '; i++)
{
op+=instruction[i];
}
option.push_back(op);
// clean space
for(; i < instruction.length(); i++)
{
if(instruction[i]==' ')
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
剩余12页未读,继续阅读
7323
- 粉丝: 22
- 资源: 328
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0