这道题我觉得加法这里比较难懂,和分成高字和低字,分别存放在寄存器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;
}
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/27/1320702.html,如需转载请自行联系原作者