在 C++ 中创建虚拟寄存器的最佳方法
Best way to create virtual registers in C++
我正在尝试创建一个只能为高中项目执行 x86 汇编代码的准系统 VM,并且我想使用结构创建所有寄存器。我已经实现了所有的指令、操作码和操作数逻辑,但我担心随着项目的发展,这种创建 CPU 寄存器的拙劣做法从长远来看不会很好,我是如果这不是实现虚拟寄存器的最佳方式,我最担心的是,更不用说我编写的所有重复代码看起来都很丑陋。如果有人可以让它变得更好或更有效率,那将非常有帮助。
#include <iostream>
#include <cstdlib>
// 64-bit registers
struct ULL_REGISTER_STRUCT {
int64_t RAX; // accumulator
int64_t RCX; // counter
int64_t RDX; // data
int64_t RBX; // base
int64_t RSP; // stack pointer
int64_t RBP; // stack base pointer
int64_t RSI; // source index
int64_t RDI; // destination index
} ULL_REGISTERS;
// 32-bit registers
struct UL_REGISTER_STRUCT {
int32_t EAX;
int32_t ECX;
int32_t EDX;
int32_t EBX;
int32_t ESP;
int32_t EBP;
int32_t ESI;
int32_t EDI;
} UL_REGISTERS;
// 16-bit
struct SHORT_REGISTER_STRUCT {
int16_t AX;
int16_t CX;
int16_t DX;
int16_t BX;
int16_t SP;
int16_t BP;
int16_t SI;
int16_t DI;
} SHORT_REGISTERS;
// 8-bit registers
struct CHAR_REGISTER_STRUCT {
int8_t AH;
int8_t AL;
int8_t CH;
int8_t CL;
int8_t DH;
int8_t DL;
int8_t BH;
int8_t BL;
int8_t SPL;
int8_t BPL;
int8_t SIL;
int8_t DIL;
} CHAR_REGISTERS;
我最近用c++写了一个PDP11模拟器我就是这样做的
uint16_t registers[8];
uint16_t &PC = registers[0];
uint16_t &R1 = registers[1];
.....
即创建一个寄存器数组,以便我可以将它们保存为一个块或其他任何内容,但为每个寄存器创建具有众所周知名称的引用
我正在尝试创建一个只能为高中项目执行 x86 汇编代码的准系统 VM,并且我想使用结构创建所有寄存器。我已经实现了所有的指令、操作码和操作数逻辑,但我担心随着项目的发展,这种创建 CPU 寄存器的拙劣做法从长远来看不会很好,我是如果这不是实现虚拟寄存器的最佳方式,我最担心的是,更不用说我编写的所有重复代码看起来都很丑陋。如果有人可以让它变得更好或更有效率,那将非常有帮助。
#include <iostream>
#include <cstdlib>
// 64-bit registers
struct ULL_REGISTER_STRUCT {
int64_t RAX; // accumulator
int64_t RCX; // counter
int64_t RDX; // data
int64_t RBX; // base
int64_t RSP; // stack pointer
int64_t RBP; // stack base pointer
int64_t RSI; // source index
int64_t RDI; // destination index
} ULL_REGISTERS;
// 32-bit registers
struct UL_REGISTER_STRUCT {
int32_t EAX;
int32_t ECX;
int32_t EDX;
int32_t EBX;
int32_t ESP;
int32_t EBP;
int32_t ESI;
int32_t EDI;
} UL_REGISTERS;
// 16-bit
struct SHORT_REGISTER_STRUCT {
int16_t AX;
int16_t CX;
int16_t DX;
int16_t BX;
int16_t SP;
int16_t BP;
int16_t SI;
int16_t DI;
} SHORT_REGISTERS;
// 8-bit registers
struct CHAR_REGISTER_STRUCT {
int8_t AH;
int8_t AL;
int8_t CH;
int8_t CL;
int8_t DH;
int8_t DL;
int8_t BH;
int8_t BL;
int8_t SPL;
int8_t BPL;
int8_t SIL;
int8_t DIL;
} CHAR_REGISTERS;
我最近用c++写了一个PDP11模拟器我就是这样做的
uint16_t registers[8];
uint16_t &PC = registers[0];
uint16_t &R1 = registers[1];
.....
即创建一个寄存器数组,以便我可以将它们保存为一个块或其他任何内容,但为每个寄存器创建具有众所周知名称的引用