第一题答案是啥,发一下
原题链接:135482.Hello World2026-07-24 17:24:53
发布于:新疆
啦啦啦啦,第一题答案
全部评论 3
?
2026-07-28 来自 浙江
02026-07-28 来自 浙江
0#include <cstdint> #include <vector> #include <array> #include <iostream> #include <stdexcept> class VM32{ public: using u32=uint32_t; enum Registers{EAX,EBX,ESP,EIP,REG_COUNT}; enum OpCode:u32{HALT=0x00000000,IN=0x0B000000,OUT=0x0C000000,ADD_REG=0x04000000}; static constexpr size_t MEM_SIZE=16*1024*1024; VM32(){ registers.fill(0); registers[ESP]=MEM_SIZE-4; memory.resize(MEM_SIZE,0); } void load_program(const std::vector<u32>&p,size_t s){ if(s>memory.size())throw std::runtime_error("Program too large"); for(size_t i=0;i<s;++i)memory[i]=p[i]; } void run(){ while(1){ u32 eip=registers[EIP]; if(eip>=memory.size())throw std::runtime_error("EIP out of bounds"); u32 inst=memory[eip];registers[EIP]+=1; u32 op=inst&0xFF000000;u32 args=inst&0x00FFFFFF; switch(op){ case HALT:return; case IN:{u32 r=args&0xFF;if(r>=REG_COUNT)throw std::runtime_error("Invalid reg");u32 v;std::cin>>v;registers[r]=v;break;} case OUT:{u32 r=args&0xFF;if(r>=REG_COUNT)throw std::runtime_error("Invalid reg");std::cout<<registers[r]<<std::endl;break;} case ADD_REG:{u32 s=(args>>16)&0xFF;u32 d=args&0xFF;if(s>=REG_COUNT||d>=REG_COUNT)throw std::runtime_error("Invalid reg");registers[d]+=registers[s];break;} default: throw std::runtime_error("Invalid opcode"); } } } private: std::array<u32,REG_COUNT>registers; std::vector<u32>memory; }; int main(){ try{ VM32 vm; std::vector<VM32::u32>p={0x0B000000|VM32::EAX,0x0B000000|VM32::EBX,0x04000000|(VM32::EBX<<16)|VM32::EAX,0x0C000000|VM32::EAX,0x00000000}; vm.load_program(p,5);vm.run(); }catch(const std::exception&e){ std::cerr<<"VM Error: "<<e.what()<<std::endl; return 1; } return 0; }2026-07-24 来自 上海
0























有帮助,赞一个