这道题我觉得加法这里比较难懂,和分成高字和低字,分别存放在寄存器A和B中。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include<iostream>
usingnamespacestd;
constintMAXSIZE=256;//内存最多有个字
constintWORDWIDTH=4;//每个字位
intmemory[MAXSIZE];//内存
//9种指令
typedefenum
{
LD,
ST,
SWP,
ADD,
INC,
DEC,
BZ,
BR,
STP
};
intmain(void)
{
charch;
inti;
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';
}
elseif(ch>='A'&&ch<='F')
{
memory[i]=ch-'A'+10;
}
}
intcurOpt,accumA=0,accumB=0,high,low,pos,sum,pc=0;
boolbFinished=false;
while(!bFinished)
{
curOpt=memory[pc++];//当前指令
switch(curOpt)
{
caseLD:
{//加载数据到寄存器A
high=memory[pc++];//高字位
low=memory[pc++];//低字位
pos=(high<<WORDWIDTH)+low;//实际位置
accumA=memory[pos];
}
break;
caseST:
{//将寄存器A中数据存到内存
high=memory[pc++];//高字位
low=memory[pc++];//低字位
pos=(high<<WORDWIDTH)+low;//实际位置
memory[pos]=accumA;
}
break;
caseSWP:
{//交换两个数(这种方式避免内存溢出)
accumA=accumA^accumB;
accumB=accumA^accumB;
accumA=accumA^accumB;
}
break;
caseADD:
{//寄存器A和寄存器B中数据相加,低字放在A中,高字放在B中
sum=(accumA+accumB)%0x100;
accumA=sum&0x0f;
accumB=(sum&0xf0)>>WORDWIDTH;
}
break;
caseINC:
{//寄存器A中数据自增
if(++accumA==16)
{
accumA=0;
}
}
break;
caseDEC:
{//寄存器A中数据自减
if(accumA==0)
{
accumA=15;
}
else
--accumA;
}
break;
caseBZ:
{//寄存器A中数据等于则跳转
high=memory[pc++];
low=memory[pc++];
pos=(high<<WORDWIDTH)+low;
if(accumA==0)
pc=pos;//程序计数器指向指定跳转位置
}
break;
caseBR://pc自增
pc=memory[pc+1];//指向下一个位置
break;
caseSTP://停止执行
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;
}
return0;
}
usingnamespacestd;
constintMAXSIZE=256;//内存最多有个字
constintWORDWIDTH=4;//每个字位
intmemory[MAXSIZE];//内存
//9种指令
typedefenum
{
LD,
ST,
SWP,
ADD,
INC,
DEC,
BZ,
BR,
STP
};
intmain(void)
{
charch;
inti;
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';
}
elseif(ch>='A'&&ch<='F')
{
memory[i]=ch-'A'+10;
}
}
intcurOpt,accumA=0,accumB=0,high,low,pos,sum,pc=0;
boolbFinished=false;
while(!bFinished)
{
curOpt=memory[pc++];//当前指令
switch(curOpt)
{
caseLD:
{//加载数据到寄存器A
high=memory[pc++];//高字位
low=memory[pc++];//低字位
pos=(high<<WORDWIDTH)+low;//实际位置
accumA=memory[pos];
}
break;
caseST:
{//将寄存器A中数据存到内存
high=memory[pc++];//高字位
low=memory[pc++];//低字位
pos=(high<<WORDWIDTH)+low;//实际位置
memory[pos]=accumA;
}
break;
caseSWP:
{//交换两个数(这种方式避免内存溢出)
accumA=accumA^accumB;
accumB=accumA^accumB;
accumA=accumA^accumB;
}
break;
caseADD:
{//寄存器A和寄存器B中数据相加,低字放在A中,高字放在B中
sum=(accumA+accumB)%0x100;
accumA=sum&0x0f;
accumB=(sum&0xf0)>>WORDWIDTH;
}
break;
caseINC:
{//寄存器A中数据自增
if(++accumA==16)
{
accumA=0;
}
}
break;
caseDEC:
{//寄存器A中数据自减
if(accumA==0)
{
accumA=15;
}
else
--accumA;
}
break;
caseBZ:
{//寄存器A中数据等于则跳转
high=memory[pc++];
low=memory[pc++];
pos=(high<<WORDWIDTH)+low;
if(accumA==0)
pc=pos;//程序计数器指向指定跳转位置
}
break;
caseBR://pc自增
pc=memory[pc+1];//指向下一个位置
break;
caseSTP://停止执行
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;
}
return0;
}
本文介绍了一个简单的寄存器系统,演示了如何通过加载数据到寄存器、执行加法运算,并将结果存回内存的过程。该系统支持多种指令,包括加载(LD)、存储(ST)、交换(SWP)、加法(ADD)等,通过这些基本操作实现数据处理。
146

被折叠的 条评论
为什么被折叠?



