用c++模拟cpu运行 跑从1+2+....+100

#include<iostream>
#include<string>//用字符串类
#include<fstream>//文件
#include<sstream>//将字符的数字转换成整形
#include<cstring>//strcpy 函数
//#include "计算机工作的高级语言实现.h"
using namespace std;
#define max 8
char s[max][100];//全局变量 用来存汇编代码
typedef std::uint64_t hash_t;//为了使用switch
constexpr hash_t prime = 0x100000001B3ull;
constexpr hash_t basis = 0xCBF29CE484222325ull;
hash_t hash_(char const* str)//将字符串转换成一个整数类型
{
    hash_t ret{ basis };

    while (*str) {
        ret ^= *str;
        ret *= prime;
        str++;
    }

    return ret;
}
constexpr hash_t hash_compile_time(char const* str, hash_t last_value = basis)
{
    return *str ? hash_compile_time(str + 1, (*str ^ last_value) * prime) : last_value;
};
void Get_txt()//读入文件的汇编代码
{
    ifstream fin("data.txt");//放入自己的文件名字
    int i = 0;
    while (fin.getline(s[i], 100))
    {
        i++;
    }
};
int main()
{
    Get_txt();
    int TF;//状态寄存器
    cout << "单步执行请按0,直接显示结果请按1:";
    cin >> TF;
    string IR, DR;//指令寄存器和数据寄存器(暂存器)
    int AR;//地址寄存器
    int ABUS, DBUS;//指令总线和数据总线
    int q=0;//中间变量
    int o_PC = 0;//程序计数器PC
    int n_PC = 1;//数据存储器的PC,起计数作用
    int RA=1, AC=0;//寄存器
    int num[102];//模拟数据存储器
    for (int i = 2; i <= 101; i++)//最后保存在101位置
        num[i] = i;
    int flag = 0;//标志位  用于判断循环
    while (flag!=1)
    {
        AR = o_PC;//PC传给地址寄存器
        o_PC++;//PC+1
        ABUS = AR;//地址寄存器给指令总线
        DR = s[AR];//将指令取出来送给数据寄存器
        IR = DR;//将指令送给指令寄存器
        char temp[4];
        strcpy(temp,IR.substr(0, 3).c_str());
        switch (hash_(temp))//判断是哪个指令
        {
        case hash_compile_time("MOV") :
        {
            char temp1[4];
            strcpy(temp1, IR.substr(4, 2).c_str());
            switch (hash_(temp1))
            {
            case hash_compile_time("RA"):
            {
                int d;
                stringstream ss;
                ss << IR.substr(7,1);
                ss >> d;
                DBUS = d;//将数据送给数据总线
                RA = DBUS;//将数据送给RA寄存器
                
            }break;
            case hash_compile_time("AC"):
            {
                int d;
                stringstream ss;
                ss << IR.substr(7, 1);
                ss >> d;
                DBUS = d;//将数据送给数据总线
                AC = DBUS;//将数据送给AC寄存器
                
            }break;
            }
            
        }break;
        case hash_compile_time("ADD"):
        {
            //暂存结果
            q=AC+RA;
            DBUS = q;//将数据送给数据总线
            AC = DBUS;//将运算后的数据送给AC寄存器
            
        }break;
        case hash_compile_time("INC"):
        {
            n_PC++;//从数据寄存器取出数据
            AR = n_PC;
            DBUS = num[AR];
            RA = DBUS;
            
        }break;
        case hash_compile_time("CMP"):
        {
            int d;
            stringstream ss;
            ss << IR.substr(7, 3);
            ss >> d;
            if (RA > d)
                o_PC = 6;
            else
                o_PC = 5;
            
        }break;
        case hash_compile_time("JNE"):
        {
            int d;
            stringstream ss;
            ss << IR.substr(4, 1);
            ss >> d;
            o_PC = d;//将要跳转的地址给PC
            
        }break;
        case hash_compile_time("RET"):
        {
            flag = 1;
        }break;
        defalut:break;
        }
        if (TF == 1)//一起输出
        {
            cout << "寄存器RA:" << RA
             << "  " << "寄存器AC:" << AC
                << "  " << "程序计数器PC:" << o_PC
                << endl;
        }
        if (TF == 0)//单步执行
        {
            cout << "寄存器RA:" << RA
                << "  " << "寄存器AC:" << AC
                << "  " << "程序计数器PC:" << o_PC
                << endl;
            system("pause");
            int get;
            cout << "修改寄存器RA的值请按1,否则请按0:";
            cin >> get;
            if (get == 1)
            {
                cout << "请输入你想改变的寄存器RA的值:";
                cin >> RA;
                o_PC = 4;
                n_PC = RA;
            }
        }
    }
    cout << AC << endl;
    system("pause");
}
 

代码在上面,计算机cpu工作原理我在这里灭有详细解释,好了废话不多说,我现在就解释下我的代码思路

首先要根据你自己的汇编指令对字符串进行处理,我这里主要使用了switch语句,分了几种情况,每种情况

之后还要考虑清楚程序计数器PC,也就是我的o_PC在哪个位置,跟你的汇编代码将要执行的语句是否一致

难度不大,就是会有点麻烦,变量比较多。

特别注意!!!(要用vs来运行)

c++中switch 在使用的时候,不能直接用字符串来判断,而是要用函数来求出字符串的整数值,因为switch只

能处理单个字符和整数,函数实现在上面,具体原理我也不懂,所以欢迎大神看明白来给我讲解,小白我虚

心聆听。函数的网址在这里https://blog.csdn.net/canguanxihu/article/details/45640999(引用别人的)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值