任务 2

编写一个模拟 MASSEY 机器的 C++ 程序。程序必须接收表单中的输入由 MASSEY 机器代码指令组成的文本文件。然后你的程序模拟机器运行,即它通过机器代码指令(以正确的顺序)改变根据需要设置寄存器和内存位置的值。您必须设计适当的输出以帮助机器代码程序员查看机器代码指令发生了什么。你应该显示项目,例如程序计数器、指令寄存器、最近更改的寄存器的值,以及最近更改的内存位置的值。确保您通读以下所有部分。

Section A - input

程序的输入是一个包含 MASSEY 机器代码程序的文本文件。
例如,这是一个典型的输入文件,其中每一行都是一条机器代码指令:

1102
1203
6012
40FF
E000

Notes about the input:

  1. 使用模拟的程序员可以给文件起任何他们喜欢的名字。 最好阅读在您启动时的文件名中。 典型的文件名是“prog1.txt”。
  2. 文件的每一行是一条机器码指令。 文件中没有其他文本。
  3. 制作几个(至少五个)不同的文件,每个文件都有不同的机器代码程序。 测试你的
    程序在各种机器代码程序上。
  4. 不要试图检查无效输入。 假设每个程序都包含正确的机器代码指令,尽管程序可能有逻辑错误,例如 说明顺序不正确。

(Hints:首先编写一个程序来读取文件并在屏幕上显示每一行。这是为了在继续执行程序的其余部分之前检查您的输入是否正常工作)。

Section B – program design

您的程序必须使用以下全局变量:

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:

  1. 研究笔记中的 MASSEY 机器代码指令。
  2. 确保您的程序正确执行和有效的机器代码指令。
  3. 您不必执行指令 5(浮点加法)——忽略指令 5。
  4. 不要检查无效指令。 只处理有效的指令。
  5. 你的程序中必须至少有两个函数。
  6. 广泛测试。 确保您已经测试了每条指令(5 条指令除外)。 使用笔记中的机器码程序作为测试数据

(Hints:让你的程序运行一些指令,也许是输入示例中的那些指令。当这些指令正常工作时,扩展程序以处理其他指令。)

Section C - output

输出必须满足以下要求:

  • 在执行程序之前显示完整程序(显示内存位置)
  • 确定在执行指令期间要显示的重要项目
  • 为每条机器代码指令显示一行(显示任何更改)
    例如,您的显示可能如下所示:
Enter the file name of the MASSEY machine code: program1.txtMemory[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:

  1. 为每条机器代码指令显示一行输出——就在它被执行之后。
  2. 在每一行上,显示当前指令和程序计数器(装载有下一条指令的地址)。
  3. 在每一行上,显示任何已更改的寄存器。 例如。 上面的第一条指令加载 R1 所以显示 R1 中的值。
  4. 在每一行上,显示任何已更改的内存位置。 例如。 上面的第四条指令将一个值加载到内存位置 FF 中,以便显示 memory[FF] 中的值。

(Hints:首先,让您的程序读取文件,将指令加载到内存中,然后显示内存位置和指令——输出的第一部分。 一旦这工作,那么展开输出以显示指令的结果。)

Answer:

总是有不止一种可能的解决方案。以下是一种可能的解决方案——它不是唯一的解决方案。

#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 hexpc = 0;working = true;while (working) {ir = memory[pc];pc++;execute(ir);}
}void loadprogram() {// loads the program into memoryfstream 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 digitd2 = instr >> 8;  // second hex digit// mask to remove all bits except the last 4d2 = d2 & 0x000F;d3 = instr >> 4;  // third hex digit// mask to remove all bits except the last 4d3 = d3 & 0x000F;d4 = instr;  // fourth hex digit// mask to remove all bits except the last 4d4 = 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 arithmeticcase 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;
}
怎么样,答对了吗?
不过不管如何,只剩下最后一个任务了,加油!

C++程序设计(二:机器模拟)相关推荐

  1. 如何防止机器模拟请求

    Token机制,防止页面重复提交 业务要求:页面的数据只能被点击提交一次 发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交 解决办法: 集群环境:采用 token ...

  2. 滤波器设计(二)模拟到数字

    系列文章目录 [音频处理]如何"认识"一个滤波器? [音频处理]IIR滤波器设计(一) [音频处理]IIR滤波器设计(二)模拟到数字 文章目录 系列文章目录 前言 一.模拟信号滤波 ...

  3. MFC Windows 程序设计[二十八]之字体样式(附源码)

    MFC Windows 程序设计[二十八]之字体样式 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C ...

  4. MFC Windows 程序设计[二十五]之五彩十六宫格(附源码)

    MFC Windows 程序设计[二十五]之五彩十六宫格 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries), ...

  5. [就酱的新征程]数字处理仿真与应用实验二:模拟低通 Butterworth 滤波器 IIR 滤波器(Matlab)

    @数字处理仿真与应用实验二:模拟低通 Butterworth 滤波器 IIR 滤波器(Matlab) 这学期数字处理仿真与应用实验的记录 不多说,进入正题吧~ 实验要求 利用模拟滤波器原型设计 IIR ...

  6. c语言程序二级模拟试卷,C语言程序设计二级考试模拟题集.doc

    C语言程序设计二级考试模拟题集 (6套试题) 全国高校联合计算机等级考试广西考区 非计算机专业学生计算机水平考试(二级C语言)模拟试卷1 (本试卷包括第一卷和第二卷,答卷时间总共120分钟) 第一卷 ...

  7. 实战二、模拟火车订票系统

    实战二.模拟火车订票系统 详细编程要求如下: 应用到的知识点 1)访问列表元素: print(listname[n]) 2)通过键值访问字典: print(dictionary["键值&qu ...

  8. C++程序设计(Massey机器模拟)

    Assigment2复盘 写在开始: 1.刚开始时有大致思路,没有头绪.沉淀大概一个星期后,又看到别人代码思路自己试着理解形成大致思路. 2.将思路要求等付诸纸面,看一看自己需要解决那些问题,将一个大 ...

  9. 机器模拟共情,情感AI正踏足诸多行业

    作者 | 平凡 来源 | CSDN 作者简介:平凡,诺桑比亚大学计算机科学博士 情感AI是一个跨学科领域,涉及计算机科学. 心理学和认知科学,旨在研发能够识别.解释.处理.模拟人类情感的系统.[虽然该 ...

  10. C语言程序设计简谐运动的模拟,C语言课程设计简谐振动实验的模拟.doc

    C语言课程设计简谐振动实验的模拟 <C语言程序设计> 课程设计报告 题 目简谐振动实验的模拟姓 名 学 号 同组人员 学 号 年级专业09电子信息工程(2)班指导教师 完成日期2010年6 ...

最新文章

  1. Javaweb 第15天 web练习和分页技术
  2. C#使用 System.Net.Mail发送邮件功能
  3. 电商常用同义词库_【福利】不可错过的电商设计神器,提高工作效率
  4. pcl点云库python实现_如何有效地将ROS PointCloud2转换为pcl点云并在python中将其可视化...
  5. MSDN最新的2007年6月的中文版本发布了
  6. hierbernate 关闭缓存设置_CDN与其他层面缓存
  7. ios html清除缓存图片,iOS 清理文件缓存(示例代码)
  8. select设置默认的option
  9. Android基础整合项目之节日群发助手(一)
  10. 爬虫基础_01——正则
  11. App云测试平台免费功能汇总
  12. 《BPF( 伯克利数据包过滤器 ) Performance Tools》 第六章 CPU
  13. java个人理财代码_基于JavaEE的个人理财系统
  14. 2.10 窗口的拆分与隐藏 [原创Excel教程]
  15. 数据结构大作业——银行排队系统
  16. C++ 中的指针参数传递和引⽤参数传递
  17. Foucsky演示工具使用教程入门(笔记)
  18. 北航软件学院2013级数据库期末试题
  19. 全新H5视频付费点播打赏影视网站系统程序源码搭建
  20. 常用坐标系及坐标系之间的变换

热门文章

  1. 机器学习基础算法13-回归实例-时间序列分析ARIMA
  2. bert处理英文的词根处理
  3. 白板推导系列Pytorch-期望最大(EM)算法
  4. Java丨Ele实验室“疫情传播仿真程序”的代码实现
  5. SQL Azure 服务器端架构
  6. python模块:时间处理模块
  7. 怎样调整input框背景颜色_还在用百度搜索PPT背景图?7个高大上的图片网站,个个都是高清免费无版权!...
  8. 三维旋转矩阵_线性代数的本质(4)--矩阵乘法与复合变换
  9. React + leaflet 地图瓦片 加载错乱 不能正常显示
  10. 归类常用控件GroupBox、TabControl、Expander