全部评论 3

  • 2026-07-28 来自 浙江

    0
  • 懦夫!\text{\Huge\color{red}\fbox{懦夫!}}

    2026-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

热门讨论