为什么有人会在 C 中用 16 位掩码按位与 8 位值?
Why would someone bitwise AND an 8-bit value with a 16-bit mask in C?
我正在尝试在 C# 中复制 Javidx9 的 NES/MOS6502 CPU 代码作为学术练习,但我无法理解零页寻址模式实施背后的逻辑。具体来说,我正在看这个 code:
// Address Mode: Zero Page
// To save program bytes, zero page addressing allows you to absolutely address
// a location in first 0xFF bytes of address range. Clearly this only requires
// one byte instead of the usual two.
uint8_t olc6502::ZP0()
{
addr_abs = read(pc);
pc++;
addr_abs &= 0x00FF;
return 0;
}
我很难理解为什么 addr_abs &= 0x00FF;
在那里,uint16_t addr_abs
是 16 位但是
uint8_t read(uint16_t a);
returns 无论如何,一个 8 位值,所以高 8 位(MOS6502 是小端)默认为 00?我是不是漏掉了 C compiler/x86 ISA 的工作原理?
你说得对 addr_abs &= 0x00ff
不需要。
uint16_t x = n
其中 n
是一个无符号的 8 位数字(这里就是这种情况)。 x
会清除它的高 8 位。正如@tadman 所述,之前可能使用了一种不同的方法将值存储到 addr_abs
中,但没有清除高 8 位。
我正在尝试在 C# 中复制 Javidx9 的 NES/MOS6502 CPU 代码作为学术练习,但我无法理解零页寻址模式实施背后的逻辑。具体来说,我正在看这个 code:
// Address Mode: Zero Page
// To save program bytes, zero page addressing allows you to absolutely address
// a location in first 0xFF bytes of address range. Clearly this only requires
// one byte instead of the usual two.
uint8_t olc6502::ZP0()
{
addr_abs = read(pc);
pc++;
addr_abs &= 0x00FF;
return 0;
}
我很难理解为什么 addr_abs &= 0x00FF;
在那里,uint16_t addr_abs
是 16 位但是
uint8_t read(uint16_t a);
returns 无论如何,一个 8 位值,所以高 8 位(MOS6502 是小端)默认为 00?我是不是漏掉了 C compiler/x86 ISA 的工作原理?
你说得对 addr_abs &= 0x00ff
不需要。
uint16_t x = n
其中 n
是一个无符号的 8 位数字(这里就是这种情况)。 x
会清除它的高 8 位。正如@tadman 所述,之前可能使用了一种不同的方法将值存储到 addr_abs
中,但没有清除高 8 位。