我已经“完成”了 6502 处理器的模拟,现在正处于测试阶段。作为初学者,我已经在这个问题上停留了几个小时了。我正在跟踪一个 NES 测试,它基本上只是一个自制 ROM 和某人制作的日志,它说明了在遍历内存后每个寄存器中应该有什么值。我被困在日志显示溢出标志在立即 SBC 指令后被清除的部分,即使累加器的值为 0x40,并且第一个参数(内存 pc + 1)等于 0x41。这意味着 0x40 - 0x41 应该是 0xFF,即 -1,这意味着存在溢出,对吧?我读过一些关于溢出标志的文章,它指出,当一个值太大或太小而无法保存在有符号字节中时,就会产生溢出,因此溢出到另一侧(即 2 个 8 位正数变成 8位为负,反之亦然)。那么我的想法是错误的吗?这是日志行:
CBC6 E9 41 SBC #$41 A:40 X:AA Y:73 P:E5
之后的一行表明 P 寄存器已变为 0xA4,这意味着进位标志和溢出标志都被清除。我得到了进位部分,但没有得到溢出部分。如果注意的话,这是下一行:
CBC8 20 62 F9 JSR $F962 A:FF X:AA Y:73 P:A4
顺便说一句;第二行证明了我的观点:A寄存器确实变成了0xFF,而有符号字节中的0xFF将等于256 - 255 = -1........
最佳答案
正如您所说,如果结果不适合,则溢出是针对有符号操作的。请注意,有符号字节可以保存 -128 到 +127 之间的值,因此 -1 非常适合该范围。它越过零与有符号溢出无关,因为 0 位于可表示范围的中间。它只对未签名的进位有意义。对于溢出,边界位于 0x80 (-128),这与无符号运算无关。
关于emulation - 6502 仿真中 SBC 溢出后溢出标志被清除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986863/