用 0xFFFF 屏蔽 16 位值

Masking a 16-bit value with 0xFFFF

我正在关注 Gameboy 仿真 guide,在一段代码中我看到了以下内容:

while(true) 
{ 
  var op = MMU.rb(Z80._r.pc++); // Fetch instruction 
  Z80._map[op]();               // Dispatch 
  Z80._r.pc &= 65535;           // Mask PC to 16 bits 
  Z80._clock.m += Z80._r.m;     // Add time to CPU clock 
  Z80._clock.t += Z80._r.t; 
}

其中 pc 是一个 16 位程序计数器寄存器, 65535 十六进制是 0xFFFF ,用 0xFFFF 屏蔽 16 位值的目的是什么?据我所知这没有任何作用?还是跟符号位有关?

我认为重要的部分是您使用 JavaScript - 它只有一种数字类型 - 浮点数。但显然底层引擎可以识别何时应该使用整数 - 使用位掩码强烈建议我们将其用作整数,因为位操作通常对浮点数没有意义。它还将这个特定变量中所有使用的坑修剪为最后 16 个——你有什么保证早些时候它没有使用比最后 16 个更旧的位?如果所有后续操作都假设数字是 16 位,那么如果不使用掩码,您的假设很容易被打破。

简短的回答:它会丢弃除低 16 位以外的所有位。这样,当 运行 在 32/64 位机器上时,您将丢弃所有其他机器。

JS 使用 >16 位,为了确保您只使用 16 位,您通过与 0xFFFF(或 65535)进行与运算来丢弃其余部分。在此特定示例中,程序计数器在游戏机上为 16 位(显然是 :P ),当值达到 65536 时,'wrapped around' 变为 0。if (Z80._r.pc > 65535) Z80._r.pc = 0 会做同样的事情,但会 可能表现更差。这种"trick"在位操作代码中用的很频繁

what is the purpose of masking a 16-bit value

None。但是没有 16 位值 - 它只是 javascript 中的一个(浮点)数字。仅 使其模拟 一个 16 位值,此数字在程序计数器递增后被削减为 16 位 - 它没有从 ++ 溢出,但只是取值65536.

这也是评论所说的:// Mask PC <b><i>到</i></b> 16位