赞
踩
编写一个模拟 MASSEY 机器的 C++ 程序。程序必须接收表单中的输入由 MASSEY 机器代码指令组成的文本文件。然后你的程序模拟机器运行,即它通过机器代码指令(以正确的顺序)改变根据需要设置寄存器和内存位置的值。您必须设计适当的输出以帮助机器代码程序员查看机器代码指令发生了什么。你应该显示项目,例如程序计数器、指令寄存器、最近更改的寄存器的值,以及最近更改的内存位置的值。确保您通读以下所有部分。
程序的输入是一个包含 MASSEY 机器代码程序的文本文件。
例如,这是一个典型的输入文件,其中每一行都是一条机器代码指令:
1102
1203
6012
40FF
E000
Notes about the input:
- 使用模拟的程序员可以给文件起任何他们喜欢的名字。 最好阅读在您启动时的文件名中。 典型的文件名是“prog1.txt”。
- 文件的每一行是一条机器码指令。 文件中没有其他文本。
- 制作几个(至少五个)不同的文件,每个文件都有不同的机器代码程序。 测试你的
程序在各种机器代码程序上。- 不要试图检查无效输入。 假设每个程序都包含正确的机器代码指令,尽管程序可能有逻辑错误,例如 说明顺序不正确。
(Hints:首先编写一个程序来读取文件并在屏幕上显示每一行。这是为了在继续执行程序的其余部分之前检查您的输入是否正常工作)。
您的程序必须使用以下全局变量:
int memory[256];
int reg[16]; // note: "register" is a reserved word
int pc, ir;
数组“memory”代表MASSEY机器的内存。
数组“registers”代表 MASSEY 机器的寄存器。
变量“pc”是程序计数器,“ir”是指令寄存器。
您程序的基本算法是:
• 从文件中读取指令并将它们加载到内存中
• 运行指令并正确执行每条指令
Notes about the program design:
- 研究笔记中的 MASSEY 机器代码指令。
- 确保您的程序正确执行和有效的机器代码指令。
- 您不必执行指令 5(浮点加法)——忽略指令 5。
- 不要检查无效指令。 只处理有效的指令。
- 你的程序中必须至少有两个函数。
- 广泛测试。 确保您已经测试了每条指令(5 条指令除外)。 使用笔记中的机器码程序作为测试数据
(Hints:让你的程序运行一些指令,也许是输入示例中的那些指令。当这些指令正常工作时,扩展程序以处理其他指令。)
输出必须满足以下要求:
Enter the file name of the MASSEY machine code: program1.txt
Memory[0] = 1102
Memory[1] = 1203
Memory[2] = 6012
Memory[3] = 40FF
Memory[4] = E000
1102 R1 = 0002 PC = 1
1203 R2 = 0003 PC = 2
6012 R0 = 0005 PC = 3
40FF Memory[FF] = 0005 PC = 4
Halt
Notes about the output:
- 为每条机器代码指令显示一行输出——就在它被执行之后。
- 在每一行上,显示当前指令和程序计数器(装载有下一条指令的地址)。
- 在每一行上,显示任何已更改的寄存器。 例如。 上面的第一条指令加载 R1 所以显示 R1 中的值。
- 在每一行上,显示任何已更改的内存位置。 例如。 上面的第四条指令将一个值加载到内存位置 FF 中,以便显示 memory[FF] 中的值。
(Hints:首先,让您的程序读取文件,将指令加载到内存中,然后显示内存位置和指令——输出的第一部分。 一旦这工作,那么展开输出以显示指令的结果。)
总是有不止一种可能的解决方案。以下是一种可能的解决方案——它不是唯一的解决方案。
#include <iostream> #include <cstdlib> #include <fstream> #include <string> using namespace std; int memory[256]; int reg[16]; // note: "register" is a reserved word int pc, ir; bool working; void loadprogram(); void execute(int instr); void display(int pc, int instr, int r, int m); //int convert(string s); int main(){ loadprogram(); cout << hex << uppercase << endl; // display hex pc = 0; working = true; while (working) { ir = memory[pc]; pc++; execute(ir); } } void loadprogram() { // loads the program into memory fstream inputfile; int hexnumber, i; string filename; cout << "Enter file name of your MASSEY machine code: "; cin >> filename; inputfile.open(filename.c_str(), fstream::in); if (inputfile.is_open() == false) { cout << "ERROR: not able to open " << filename << endl; exit(2); } else { i = 0; cout << hex << uppercase << endl; while (inputfile >> hex >> hexnumber) { memory[i] = hexnumber; cout << "Memory[" << i << "] = " << memory[i] << endl; i++; } } inputfile.close(); } void execute(int instr) { int op, d2, d3, d4, num; op = instr >> 12; // first hex digit d2 = instr >> 8; // second hex digit // mask to remove all bits except the last 4 d2 = d2 & 0x000F; d3 = instr >> 4; // third hex digit // mask to remove all bits except the last 4 d3 = d3 & 0x000F; d4 = instr; // fourth hex digit // mask to remove all bits except the last 4 d4 = d4 & 0x000F; num = d3*16 + d4; // last 2 digits as a number // cout << hex << op << " " << hex << d2 << " "; // cout << hex << d3 << " " << hex << d4 << " " << num << endl; switch (op) { case 1 : reg[d2] = num; display(pc, instr, d2, -1); break; case 2 : reg[d3] = reg[d4]; display(pc, instr, d3, -1); break; case 3 : reg[d2] = memory[num]; display(pc, instr, d2, num); break; case 4 : memory[num] = reg[d2]; display(pc, instr, d2, num); break; // case 5 : floating arithmetic case 6 : reg[d2] = reg[d3] + reg[d4]; display(pc, instr, d2, -1); break; case 7 : reg[d3] = -1 * reg[d3]; display(pc, instr, d3, -1); break; case 8 : reg[d2] = reg[d2] >> num; display(pc, instr, d2, -1); break; case 9 : reg[d2] = reg[d2] << num; display(pc, instr, d2, -1); break; case 10 : reg[d2] = reg[d3] & reg[d4]; display(pc, instr, d2, -1); break; case 11 : reg[d2] = reg[d3] | reg[d4]; display(pc, instr, d2, -1); break; case 12 : reg[d2] = reg[d3] ^ reg[d4]; display(pc, instr, d2, -1); break; case 13 : if (reg[d2] == reg[0]) { display(num, instr, d2, -1); pc = num; // jump to location num } else { display(pc, instr, d2, -1); } break; case 14 : working = false; cout << "Halt\n\n"; break; } } void display(int pc, int instr, int r, int m) { cout << instr << " Register[" << r << "] = "; cout.fill('0'); cout.width(4); cout << right << reg[r]; if (m >= 0) { cout << " Memory[" << m << "] = "; cout.fill('0'); cout.width(4); cout << memory[m]; } cout << " PC = " << pc << endl; }
怎么样,答对了吗?
不过不管如何,只剩下最后一个任务了,加油!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。