2

我已经“完成”了对 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........

4

1 回答 1

2

正如您所说的那样,如果结果不合适,则溢出用于签名操作。请注意,有符号字节可以保存 -128 和 +127 之间的值,因此 -1 非常适合该范围。它已经越过零与有符号溢出无关,因为 0 在可表示范围的中间。它只对未签名的进位感兴趣。对于溢出,边界位于 0x80 (-128) 处,而这又与无符号操作无关。

于 2013-06-07T14:58:15.663 回答