emulation - 6502 仿真中 SBC 溢出后溢出标志被清除吗?

标签 emulation cpu-registers signed 6502

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

相关文章:

c# - “int” 和 “uint”/“long” 和 “ulong” 有什么区别?

c - 处理有符号 int 数组,就好像它包含无符号值一样

java - 在 Java 中确定 6502 仿真中的进位和溢出标志?

assembly - 哪个 x86 寄存器表示 movsb 指令中的源位置?

iphone - 是否可以在iPhone仿真器上下载并运行iPhone应用程序?

assembly - 为什么我们要在MMIX中保留一个全局寄存器?

c# - 为什么要对 String.Length 进行签名?

android - 如何让我的 android 模拟器更快?

lua - 业务鹰 2.1.1 : read ("*number") always returns 0 in Lua