BITCS2016程序设计 | 29. 微处理器模拟
来源:互联网 发布:测量长度的软件 编辑:程序博客网 时间:2024/05/31 18:31
29. 微处理器模拟
成绩10开启时间2016年09月22日 星期四 12:00折扣0.8折扣时间2016年09月27日 星期二 23:55允许迟交否关闭时间2016年10月10日 星期一 23:55
描述
考虑一个具有以下特性的的小型微处理器:
- 每个字有四位。
- 地址是两个字。 高字在前。 也就是说两个字组成的地址中的高字总是在低字的内存前。
- 内存占有256个字。
- 有两个累加器,A和B, 每个存储一个字。
- 一个有9个指令代码。每个指令需要至少一个字来存储代表这条指令的代码。有四条指令有参数并需要额外的两字。
每个四位代表的数字可以有值0~15,包括0和15在内,10进制。我们会以常见的十六进制的行式编写代码。也就是说A代表10,B代表11……
下面是9条指令:
代 码字数描述
03LD:装载指令中参数代表的地址的内容到累加器A13ST:向指令中参数代表的地址写入累加器A的内容21SWP:交换A和B的内容31ADD:将A和B中的内容相加,并将结果的低字写入A,高字写入B41INC:A中数加1,允许向上溢出,也就是说F+1-->051DEC:A中数减1,允许向下溢出,也就是说0-1-->F63BZ:如果A=0,下一个要执行的命令是在参数代表的地址的指令;如果A不是0,则参数被忽略不执行。73BR:下一条要执行的指令在参数指定的地址。81STP:程序中止执行。微处理器每次都从00处的代码开始执行,并一直执行直到遇到中止的命令。
以下的例子表现了部分的程序并描述了它们的功效。
程序描述01A8将在1A(10进制26)处的内容装入A,并终止。01A512F8将在1A(10进制26)处的内容装入A,A减1,把结果保存在2F处,并终止。输入
在输入中将包含由正好256个字符组成的数行。每一行都代表内存的内容,地址00到FF。
如果一行代码的00处是8,程序结束输入。程序运行的过程中不会从内存中溢出,也就是说不会有F0到FF的指令让你去执行。
输出
对于给出的每一种内存状况,你必须从00开始模拟执行,当遇到停止命令时,将当时的内存中的内容输出成一行256个字符的串(由16进制表示)。
- 0102011311321128FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000↵
- 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000↵
- 0102011311321128FF1E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000↵
字符串处理,将复杂的题目要求写下然后实现即可。
代码:
#include "stdio.h"#include "string.h"int letter2value( char a ){if( a >= '0' && a <= '9' )return a - '0';return a - 'A' + 10;}char value2letter( int a ){if( a >= 0 && a <= 9 )return a + '0';return a - 10 + 'A';}int main(){char input[ 260 ] = { 0 };int A, B, addr, tmp;while( 1 ){gets( input );if( input[ 0 ] == '8' )break;A = B = 0;for( int i = 0; i < 256; i ++ ){if( input[ i ] == '8' )break;else if( input[ i ] == '0' ){addr = letter2value( input[ i + 1 ] ) * 16 + letter2value( input[ i + 2 ] );A = letter2value( input[ addr ] );i += 2;}else if( input[ i ] == '1' ){addr = letter2value( input[ i + 1 ] ) * 16 + letter2value( input[ i + 2 ] );input[ addr ] = value2letter( A );i += 2;}else if( input[ i ] == '2' ){tmp = A;A = B;B = tmp;}else if( input[ i ] == '3' ){tmp = A + B;A = tmp % 16;B = tmp / 16;}else if( input[ i ] == '4' ){A ++;A %= 16;}else if( input[ i ] == '5' ){A --;A = ( A + 16 ) % 16;}else if( input[ i ] == '6' ){if( !A ){addr = letter2value( input[ i + 1 ] ) * 16 + letter2value( input[ i + 2 ] );i = addr - 1;}elsei += 2;}else if( input[ i ] == '7' ){addr = letter2value( input[ i + 1 ] ) * 16 + letter2value( input[ i + 2 ] );i = addr - 1;}}puts( input );}return 0;}
结果:
题外话:
实话说,是不是因为是今年程设的最后一篇博客所以给了我再次编辑的机会。刚才因为手误,不小心把所有没有保存的内容清楚了= =。
引用一句正在看的电影的台词“当事情真的真的很好笑时,我们就会笑”。这是我今年程设的最后一道题目,虽然没有30题全部做完,但是每道题目都重新让我开始思考,并且我收获了很多。在做题的过程中我找到了四年前做题的感觉。大二的程设,无疑对我的本科生涯带来很多东西,有辛苦,有疲惫,但更多是对于编程的热爱。已经很久没有,因为一道题目,一个样例,绞尽脑汁思考,尝试,然后解决问题。相信每个认真经历过这样一段时期的人都能体会到,当看见自己努力的方向出现一点点转机时内心的感动。那种成就感,可能就是继续向前的意义。
四年后的这个秋天,2016年,再一次,因为程设我又重新收获。感谢这份专注,也希望今后的学弟学妹们,认认真真的做题,你们会发现其中的乐趣,前进的动力和意义。Good luck!
1 0
- BITCS2016程序设计 | 29. 微处理器模拟
- 网教29. 微处理器模拟
- BITCS2016程序设计 | 3. 扫雷
- BITCS2016程序设计 | 5. 传送带
- BITCS2016程序设计 | 1. 球体问题
- BITCS2016程序设计 | 2. 修剪草坪
- BITCS2016程序设计 | 4. 合并果子
- BITCS2016程序设计 | 7. 蜜汁序列
- BITCS2016程序设计 | 8. a+b
- BITCS2016程序设计 | 11. 识别条形码
- BITCS2016程序设计 | 12. 编程珠玑
- BITCS2016程序设计 | 16. 电话号码问题
- BITCS2016程序设计 | 21. 穿越矩阵
- BITCS2016程序设计 | 23. 暗算2.0
- BITCS2016程序设计 | 24. 波兰表达式
- BITCS2016程序设计 | 26. 完美序列
- BITCS2016程序设计 | 27. 序列极限
- BITCS2016程序设计 | 6. 贪婪的你
- 线段树,方差,数学(Variance,玲珑杯 Round#5 H lonlife 1063)
- poj 3641 Pseudoprime numbers
- reactjs学习手记(2)
- reactjs学习手记(3)
- 动态代理和静态代理
- BITCS2016程序设计 | 29. 微处理器模拟
- 【工具】[Listary]好用到哭的快速搜索工具
- 21.无限分类表的数据库设计
- java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
- Spark在爱奇艺的应用实践
- Ural1982-Electrification Plan
- MyBatis批量更新
- volley笔记--dispatcher们(NetworkDispatcher和CacheDispatcher)
- 习题2-4 子序列之和