雷霆虚拟机《震撼原创》个蛋(豆包的)
2026-09-10 17:55:09
发布于:广东
4阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
// ========== 顶配自研虚拟机 V2.0 ==========
// 架构:4寄存器 + 256字节内存 + 栈空间 + 程序计数器 + 标志位
// 支持指令:
// mov / add / sub / mul / div
// cmp 比较、jeq 等于跳转、jne 不等跳转、jmp 无条件跳转
// push / pop 栈操作
// out / exit
// 支持完整循环、分支、算法执行
struct VM{
// 寄存器组 r0~r3
int reg[4];
// 虚拟机内存 256字节
int mem[256];
// 栈空间
int stk[128];
int sp; //栈指针
int pc; //程序计数器
// 状态标志位
bool flag_eq; //相等
bool flag_lt; //小于
bool flag_gt; //大于
// 程序指令
vector<string> code;
VM(){
memset(reg,0,sizeof(reg));
memset(mem,0,sizeof(mem));
memset(stk,0,sizeof(stk));
sp=0;
pc=0;
flag_eq=flag_lt=flag_gt=false;
}
void load(vector<string> c){
code=c;
pc=0;
sp=0;
}
int getReg(char c){
return c-'0';
}
// 切割字符串
vector<string> split(string s){
vector<string> res;
stringstream ss(s);
string tmp;
while(ss>>tmp) res.push_back(tmp);
return res;
}
void run(){
while(pc < code.size()){
vector<string> op = split(code[pc]);
pc++;
// 赋值指令 mov r0 10
if(op[0]=="mov"){
int r=getReg(op[1][1]);
int val=stoi(op[2]);
reg[r]=val;
}
// 加法 add r0 r1
else if(op[0]=="add"){
int a=getReg(op[1][1]);
int b=getReg(op[2][1]);
reg[a] += reg[b];
}
// 减法 sub
else if(op[0]=="sub"){
int a=getReg(op[1][1]);
int b=getReg(op[2][1]);
reg[a] -= reg[b];
}
// 乘法 mul
else if(op[0]=="mul"){
int a=getReg(op[1][1]);
int b=getReg(op[2][1]);
reg[a] *= reg[b];
}
// 除法 div
else if(op[0]=="div"){
int a=getReg(op[1][1]);
int b=getReg(op[2][1]);
if(reg[b]!=0) reg[a]/=reg[b];
}
// 比较 cmp r0 r1
else if(op[0]=="cmp"){
int a=getReg(op[1][1]);
int b=getReg(op[2][1]);
flag_eq = (reg[a]==reg[b]);
flag_lt = (reg[a]<reg[b]);
flag_gt = (reg[a]>reg[b]);
}
// 无条件跳转 jmp
else if(op[0]=="jmp"){
int pos=stoi(op[1]);
pc=pos;
}
// 相等跳转 jeq
else if(op[0]=="jeq"){
int pos=stoi(op[1]);
if(flag_eq) pc=pos;
}
// 不等跳转 jne
else if(op[0]=="jne"){
int pos=stoi(op[1]);
if(!flag_eq) pc=pos;
}
// 栈压入
else if(op[0]=="push"){
int r=getReg(op[1][1]);
stk[sp++]=reg[r];
}
// 栈弹出
else if(op[0]=="pop"){
int r=getReg(op[1][1]);
if(sp>0) reg[r]=stk[--sp];
}
// 输出
else if(op[0]=="out"){
int r=getReg(op[1][1]);
cout<<reg[r]<<endl;
}
// 退出
else if(op[0]=="exit"){
break;
}
}
}
};
int main(){
// 测试:虚拟机跑【1~10累加求和】
vector<string> program = {
"mov r0 0", // r0 = 总和
"mov r1 1", // r1 = 计数器
"mov r2 11", // r2 = 终止值
// 循环体
"add r0 r1",
"add r1 r0",
"cmp r1 r2",
"jne 3",
"out r0",
"exit"
};
VM vm;
vm.load(program);
vm.run();
return 0;
}
这里空空如也








有帮助,赞一个