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;
}




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/27/1320702.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Python
Calculating Dates
Calculating Dates
29 1
|
7月前
Adjustable Precision Shunt Regulator
一、产品描述 The TL431 is a three-terminal adjustable regulator series with a guaranteed thermal stability over applicable temperature ranges. The output voltage may be set to any value between Vref and 36 volts with two external resistors. These device have a typical dynamic output impedance of 0.27Ω,
|
算法
uva 11549 CALCULATOR CONUNDRUM
题目链接 刘汝佳算法竞赛经典入门训练指南p42
38 0
UVa11549 - Calculator Conundrum (Floyd判圈法)
UVa11549 - Calculator Conundrum (Floyd判圈法)
60 0
HDU-1012,u Calculate e
HDU-1012,u Calculate e
|
C++
蓝桥杯 - C++ calculation
蓝桥杯 - C++ calculation
169 0
|
算法
HDOJ 1202 The calculation of GPA
HDOJ 1202 The calculation of GPA
123 0