POJ 2410 Simple Computers
来源:互联网 发布:js 过滤前后空格 编辑:程序博客网 时间:2024/05/29 09:15
题目大意:
现要求你模拟一台简单的计算机,只有8中机器指令,以及一个只有32字节的内存(MM)和一个8字节的累加器(AC),程序计数器(PC)的长度为5字节,用于保存下一条指令的地址,内存既可以存数据也可以存指令。
每条指令只有1字节,其中:
000XXXXX STA X:将AC中的值压入X地址内存单元内
001XXXXX LDA X:将内存单元X处的数据压入AC内
010XXXXX BEQ X:如果AC为0则将X覆盖至PC
011----- NOP :空操作
100----- DEC :AC--
101----- INC :AC++
110XXXXX JMP X:将X覆盖至PC
111----- HLT :程序终止
现有多个测例(测例数不确定),每个测例中初始时,AC和PC为0,此时PC指向MM的0号字节,然后先将32条指令读入MM中,接着就顺序执行指令直至程序结束(假设所有程序都是会终止的),对于每个测例输出程序执行完毕后AC的内容,所有的输入输出都是二进制的,并且左边为高位右边为低位。
题目链接
注释代码:
/* * Problem ID : POJ 2410 Simple Computers * Author : Lirx.t.Una * Language : C * Run Time : 0 ms * Run Memory : 156 KB */#include <memory.h>#include <stdio.h>//byte length//一个字节的长度#defineBYTEL8//number of byte//表示主存有多少个字节#defineBYTEN32//instruction,获取指令部分#defineINST( MM[PC] >> 5 )//address,获取地址部分#defineADDR( MM[PC] & 0x1F )//PC++,即PC前移一位#definePCPP( PC = ++PC & 0x1F )typedefunsigned charbyte;//一定要用unsigned//否则右移的时候会补1!!!enum INSTRUCTION {//枚举指令STA,LDA,BEQ,NOP,DEC,INC,JMP,HLT};byteMM[BYTEN];byteAC;bytePC;charbs[BYTEN][BYTEL + 1];//bit string,位流,用于结束输入的字符串voidEXCU(void) {//执行指令intx;while (1) {switch (INST) {case STA :MM[ADDR] = AC;PCPP;break;case LDA :AC = MM[ADDR];PCPP;break;case BEQ :AC ? PCPP : ( PC = ADDR );break;case NOP :PCPP;break;case DEC :AC--;PCPP;break;case INC :AC++;PCPP;break;case JMP :PC = ADDR;break;case HLT :for ( x = BYTEL - 1; x >= 0; x-- )//程序结束后输出ACprintf("%d", ( AC >> x ) & 1);//从高位到低位输出putchar('\n');return;default : return;}}}intmain() {inti, j;while ( ~scanf("%s", *bs ) ) {for ( i = 1; i < BYTEN; i++ )scanf("%s", bs[i]);memset(MM, 0, sizeof(MM));for ( i = 0; i < BYTEN; i++ )//将位流解析成实际的数据for ( j = 0; j < BYTEL; j++ )MM[i] = ( MM[i] << 1 ) | ( bs[i][j] - '0' );PC = 0;//初始化AC = 0;EXCU();}return 0;}
无注释代码:
#include <memory.h>#include <stdio.h>#defineBYTEL8#defineBYTEN32#defineINST( MM[PC] >> 5 )#defineADDR( MM[PC] & 0x1F )#definePCPP( PC = ++PC & 0x1F )typedefunsigned charbyte;enum INSTRUCTION {STA,LDA,BEQ,NOP,DEC,INC,JMP,HLT};byteMM[BYTEN];byteAC;bytePC;charbs[BYTEN][BYTEL + 1];voidEXCU(void) {intx;while (1) {switch (INST) {case STA :MM[ADDR] = AC;PCPP;break;case LDA :AC = MM[ADDR];PCPP;break;case BEQ :AC ? PCPP : ( PC = ADDR );break;case NOP :PCPP;break;case DEC :AC--;PCPP;break;case INC :AC++;PCPP;break;case JMP :PC = ADDR;break;case HLT :for ( x = BYTEL - 1; x >= 0; x-- )printf("%d", ( AC >> x ) & 1);putchar('\n');return;default : return;}}}intmain() {inti, j;while ( ~scanf("%s", *bs ) ) {for ( i = 1; i < BYTEN; i++ )scanf("%s", bs[i]);memset(MM, 0, sizeof(MM));for ( i = 0; i < BYTEN; i++ )for ( j = 0; j < BYTEL; j++ )MM[i] = ( MM[i] << 1 ) | ( bs[i][j] - '0' );PC = 0;AC = 0;EXCU();}return 0;}
单词解释:
processor:n, 处理器
accumulator:n, 累加器,蓄电池
Von Neumann Architecture:n, 冯·诺依曼体系
optional:adj. 可选的
operand:n, 操作数,运算对象
semantics:n, 语义,语义学
subtract:vt, 减去,扣掉
fetch:vt, 拿,取
prior:adj/adv, 优先的,在先的
- poj 2410 Simple Computers
- POJ 2410 Simple Computers
- POJ 2410 Simple Computers 笔记
- POJ 2410:Simple Computers 模拟题
- Simple Computers
- Simple Computers
- acm.jlu.edu.cn-1099-Simple Computers
- Computers
- poj 3486 Computers dp的思想
- POJ 3486 & HDU 1913 Computers(dp)
- POJ 1126 Simple Syntax
- poj 2601 Simple calculations
- poj 3850 Simple Polygon
- poj-2601Simple calculations
- POJ 1396 Simple Arithmetics
- POJ 1396 Simple Arithmetics
- poj 2601 Simple calculations
- POJ 2601 Simple calculations
- 从零开始学习OpenGL ES之五 – 材质
- Android Binder设计与实现 - 设计篇
- Zigbee的一些名词解释
- 在Fedora14中安装 Virtual Box Guest Additions
- 一大早接到初恋的约见电话,去还是不去
- POJ 2410 Simple Computers
- C++中输入输出函数
- maven实战(5)-- settings.xml的配置
- i2c_client,i2c_adapter和I2C-core的简介
- 【娱见】乐视开始折腾路由器,小米与极路由还会好过吗?
- C/C++简单知识点
- Rescue The Princess (数学水题)
- poj 2001 Trie树 模板题
- 青春,应当怎样度过?