c - 为什么有人会在 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 如何工作的信息?
解决方案
你addr_abs &= 0x00ff
是对的不需要。
uint16_t x = n
wheren
是一个无符号的 8 位数字(这里就是这种情况)。x
会清除它的高 8 位。正如@tadman 所说,以前可能使用了一种不同的方法来存储addr_abs
未清除高 8 位的值。
推荐阅读
- python - How can I do an efficient in-place sort on an arbitrary indexable collection?
- r - Getting the Total counts in each sample of a huge single cell dataframe
- php - array_filter() 和 strlen 函数中的问题
- azure - Azure Notification Hub cannot send push notification to specific Tag
- c++ - 即使已安装 Azure 管道也不使用指定的编译器
- hibernate - how to get queries from jpa-named-queries.properties
- javascript - 什么时候关闭mongodb中的连接?
- python - Django Like Syste --> RedirectView 不重定向到帖子
- javascript - 会话中的变量未在多个请求中更新
- c# - 如何将正则表达式匹配转换为字符串 c#