首页 > 解决方案 > 为什么有人会在 C 中按位 AND 一个带有 16 位掩码的 8 位值?

问题描述

我试图在 C# 中复制 Javidx9 的 NES/MOS6502 CPU 代码作为学术练习,但我无法理解零页寻址模式实现背后的逻辑。具体来说,我正在查看这段代码

// 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);无论如何返回一个 8 位值,所以高 8 位(MOS6502 是小端序)默认为 00?我是否遗漏了有关 C 编译器/x86 ISA 如何工作的信息?

标签: cemulation

解决方案


addr_abs &= 0x00ff是对的不需要。

uint16_t x = nwheren是一个无符号的 8 位数字(这里就是这种情况)。x会清除它的高 8 位。正如@tadman 所说,以前可能使用了一种不同的方法来存储addr_abs未清除高 8 位的值。


推荐阅读