为什么 Chip8 减法操作码涉及位掩码和位移位?

问题描述 投票:0回答:1

我正在关注 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 个关于其工作原理的问题:

  1. 为什么我们在一种情况下用
    0x0F00u
    屏蔽操作码,在另一种情况下用
    0x00F0u
    屏蔽操作码?
uint8_t Vx = (opcode & 0x0F00u) >> 8u;
uint8_t Vy = (opcode & 0x00F0u) >> 4u;
  1. 为什么我们将 Vx 移位 8 位,将 Vy 移位 4 位?

请帮助我理解这是如何工作的。这不适用于任何类型的作业。我白天是一名 Web 开发人员,目前正在探索模拟器开发。

c++ emulation chip-8
1个回答
0
投票

CHIP-8 实现有 16 个寄存器,作为 16 元素数组实现。

在 SUB 指令中,保存操作数的寄存器由半字节 1 和 2 中的值指示,其中半字节 0 是最低有效半字节。

通过使用 0x0f00 进行掩码并右移 8 位,半字节 2 指示的寄存器将移动到半字节 0,在那里它可以用作寄存器数组的偏移量。

类似地,通过 0x00f0 掩码并右移四位来提取偏移量 为寄存器数组中的第二个操作数。

© www.soinside.com 2019 - 2024. All rights reserved.