我正在用现代 C++ 为一个非常流行的手持控制台编写一个模拟器。
很明显,对于 RAM,我想使用
std::vector<std::byte>
,但我正在努力判断 std::byte
是否也是所有类型寄存器(CPU 寄存器、硬件寄存器等)的正确类型。对于 CPU 寄存器来说,它非常模糊,但我显然倾向于在这里使用 std::uint8_t
(和 std::uint16_t
),因为 CPU 寄存器主要用于算术。但也有一些“控制寄存器”不用于算术,而是存储标志或计数器。
std::byte
的另一种可能用法是存储当前指令(以一个或多个字节编码)。
我也遇到了不一致的问题,因为
std::byte
只保存 8 位。但控制寄存器也可以长于 8 位(例如 IA32 架构的 cr0
寄存器)。
也许我只是想太多了,但我不清楚这是否是
std::byte
的有效用法。标准说“std::byte
模拟了一个纯粹的位集合”,但我可以说寄存器显然不仅仅是一个“纯粹的位集合”,即使它是一个包含一个或多个位长的标志的控制寄存器.
硬件/CPU寄存器应使用与寄存器宽度相同的类型,而不是uint8_t的数组。
原因是超过一字节宽的 CPU 寄存器(通常)不能进行字节寻址。 如果你的寄存器是 32 位/4 字节宽,你不能只引用 reg1_[0],假设 reg_1 被定义为 4 个 uint8_t 的数组。 要从多字节寄存器中抓取一个字节,需要屏蔽并移位寄存器内容。
请注意,我基于 x86、PowerPC 等 CPU。 我不知道ARM。