ZOJ1072 Microprocessor Simulation
这道题我觉得加法这里比较难懂,和分成高字和低字,分别存放在寄存器A和B中。
#include <iostream>
using namespace std;
const int MAXSIZE = 256;//内存最多有个字
const int WORDWIDTH = 4;//每个字位
int memory[MAXSIZE];//内存
//9种指令
typedef enum
{
LD ,
ST ,
SWP ,
ADD ,
INC ,
DEC ,
BZ ,
BR ,
STP
};
int main(void)
{
char ch;
int i;
while (true)
{
//输入数据
memset(memory,0,MAXSIZE);//初始化内存
ch = getchar();
while((ch < '0' || ch > '9') && (ch < 'A' || ch > 'F'))
cin>>ch;
if(ch == '8')
break;
//输入内存数据
for (i=1;i<MAXSIZE;++i)
{
cin>>ch;
if (ch>='0'&&ch<='9')
{
memory[i] = ch-'0';
}
else if (ch>='A'&&ch<='F')
{
memory[i] = ch-'A'+10;
}
}
int curOpt,accumA=0,accumB=0,high,low,pos,sum,pc=0;
bool bFinished = false;
while (!bFinished)
{
curOpt = memory[pc++];//当前指令
switch(curOpt)
{
case LD:
{//加载数据到寄存器A
high = memory[pc++];//高字位
low = memory[pc++];//低字位
pos = (high<<WORDWIDTH)+low;//实际位置
accumA = memory[pos];
}
break;
case ST:
{//将寄存器A中数据存到内存
high = memory[pc++];//高字位
low = memory[pc++];//低字位
pos = (high<<WORDWIDTH)+low;//实际位置
memory[pos] = accumA;
}
break;
case SWP:
{//交换两个数(这种方式避免内存溢出)
accumA = accumA^accumB;
accumB = accumA^accumB;
accumA = accumA^accumB;
}
break;
case ADD:
{//寄存器A和寄存器B中数据相加,低字放在A中,高字放在B中
sum = (accumA + accumB) % 0x100;
accumA = sum & 0x0f;
accumB = (sum & 0xf0) >> WORDWIDTH;
}
break;
case INC:
{//寄存器A中数据自增
if (++accumA==16)
{
accumA = 0;
}
}
break;
case DEC:
{//寄存器A中数据自减
if (accumA==0)
{
accumA = 15;
}
else
--accumA;
}
break;
case BZ:
{//寄存器A中数据等于则跳转
high = memory[pc++];
low = memory[pc++];
pos = (high << WORDWIDTH) + low;
if(accumA == 0)
pc = pos;//程序计数器指向指定跳转位置
}
break;
case BR://pc自增
pc = memory[pc+1];//指向下一个位置
break;
case STP://停止执行
bFinished = true;
break;
}
}
//显示最终内存快照
for (i=0;i<MAXSIZE;++i)
{
if (memory[i]<10)
{
cout<<memory[i];
}
else
{
ch = memory[i]-10+'A';
cout<<ch;
}
}
cout<<endl;
}
return 0;
}
using namespace std;
const int MAXSIZE = 256;//内存最多有个字
const int WORDWIDTH = 4;//每个字位
int memory[MAXSIZE];//内存
//9种指令
typedef enum
{
LD ,
ST ,
SWP ,
ADD ,
INC ,
DEC ,
BZ ,
BR ,
STP
};
int main(void)
{
char ch;
int i;
while (true)
{
//输入数据
memset(memory,0,MAXSIZE);//初始化内存
ch = getchar();
while((ch < '0' || ch > '9') && (ch < 'A' || ch > 'F'))
cin>>ch;
if(ch == '8')
break;
//输入内存数据
for (i=1;i<MAXSIZE;++i)
{
cin>>ch;
if (ch>='0'&&ch<='9')
{
memory[i] = ch-'0';
}
else if (ch>='A'&&ch<='F')
{
memory[i] = ch-'A'+10;
}
}
int curOpt,accumA=0,accumB=0,high,low,pos,sum,pc=0;
bool bFinished = false;
while (!bFinished)
{
curOpt = memory[pc++];//当前指令
switch(curOpt)
{
case LD:
{//加载数据到寄存器A
high = memory[pc++];//高字位
low = memory[pc++];//低字位
pos = (high<<WORDWIDTH)+low;//实际位置
accumA = memory[pos];
}
break;
case ST:
{//将寄存器A中数据存到内存
high = memory[pc++];//高字位
low = memory[pc++];//低字位
pos = (high<<WORDWIDTH)+low;//实际位置
memory[pos] = accumA;
}
break;
case SWP:
{//交换两个数(这种方式避免内存溢出)
accumA = accumA^accumB;
accumB = accumA^accumB;
accumA = accumA^accumB;
}
break;
case ADD:
{//寄存器A和寄存器B中数据相加,低字放在A中,高字放在B中
sum = (accumA + accumB) % 0x100;
accumA = sum & 0x0f;
accumB = (sum & 0xf0) >> WORDWIDTH;
}
break;
case INC:
{//寄存器A中数据自增
if (++accumA==16)
{
accumA = 0;
}
}
break;
case DEC:
{//寄存器A中数据自减
if (accumA==0)
{
accumA = 15;
}
else
--accumA;
}
break;
case BZ:
{//寄存器A中数据等于则跳转
high = memory[pc++];
low = memory[pc++];
pos = (high << WORDWIDTH) + low;
if(accumA == 0)
pc = pos;//程序计数器指向指定跳转位置
}
break;
case BR://pc自增
pc = memory[pc+1];//指向下一个位置
break;
case STP://停止执行
bFinished = true;
break;
}
}
//显示最终内存快照
for (i=0;i<MAXSIZE;++i)
{
if (memory[i]<10)
{
cout<<memory[i];
}
else
{
ch = memory[i]-10+'A';
cout<<ch;
}
}
cout<<endl;
}
return 0;
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
分类:
ACM
, C/C++/VC++
posted on 2008-10-27 20:25 Phinecos(洞庭散人) 阅读(671) 评论(5) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2007-10-27 MapReduce简介