我正在关注 Austin Morlan 编写的 Chip8 指南:https://austinmorlan.com/posts/chip8_emulator/
在他对 SUB 操作码的描述中,他有这样的代码:
void Chip8::OP_8xy5()
{
uint8_t Vx = (opcode & 0x0F00u) >> 8u;
uint8_t Vy = (opcode & 0x00F0u) >> 4u;
if (registers[Vx] > registers[Vy])
{
registers[0xF] = 1;
}
else
{
registers[0xF] = 0;
}
registers[Vx] -= registers[Vy];
}
我有 2 个关于其工作原理的问题:
0x0F00u
屏蔽操作码,在另一种情况下用 0x00F0u
屏蔽操作码?uint8_t Vx = (opcode & 0x0F00u) >> 8u;
uint8_t Vy = (opcode & 0x00F0u) >> 4u;
请帮助我理解这是如何工作的。这不适用于任何类型的作业。我白天是一名 Web 开发人员,目前正在探索模拟器开发。
CHIP-8 实现有 16 个寄存器,作为 16 元素数组实现。
在 SUB 指令中,保存操作数的寄存器由半字节 1 和 2 中的值指示,其中半字节 0 是最低有效半字节。
通过使用 0x0f00 进行掩码并右移 8 位,半字节 2 指示的寄存器将移动到半字节 0,在那里它可以用作寄存器数组的偏移量。
类似地,通过 0x00f0 掩码并右移四位来提取偏移量 为寄存器数组中的第二个操作数。