我正在制作一个 6502 模拟器(之后我将模拟它周围的其他 NES 组件以拥有一个功能齐全的 NES 模拟器),并且我遇到了条件分支指令(相对)。现在,我想知道的是,该字节是否被认为保存为二进制补码,或者保存为常规负字节?这就是我的意思:
在 6502 文档之一(当然是非官方的)中给出了这个示例:
BEQ $A7 ;Branch-on-equal with value 0xA7
$F0 $A7 ;Translation into hex
文档中说0xA7应该取-39,表示如下:
1 0 1 0 0 1 1 1 ;-39 dec
如果第 7 位(从 0 开始)是 0,那么它就是 39:
0 0 1 0 0 1 1 1 ;39 dec
我想知道这个文档是否正确,或者我应该使用二进制补码,意思是:
1 0 1 0 0 1 1 1
实际上是-89?
我问这个问题是因为我正在用Java对模拟器进行编程,并且字节以二进制补码解释,并且我在很多指令中都看到了这种方式,现在我感到困惑.
最佳答案
哇,在这台机器上设置了返回机器!早在 70 年代和 80 年代,我就曾在 '02 系列的 Atari VCS、计算机系列和投币街机游戏上进行汇编编程。好的,我记得所有 BEQ(相等分支)指令所做的就是检查“零标志”的状态,并在设置时进行分支。根据比较和数学函数设置/清除零标志。
由于您询问的是 '02 上的 +/- 数字,您可能需要 BPL(如果是正则分支)或 BMI(如果是负则分支),它们基于符号“N”标志,本质上只是 的第 7 位累加器。因此,递减 0 会得到 $ff 并设置减号“N”标志。您可以将此 $ff 解释为 -1,即 2 的补码。
更新: 是的,我的回答可能有点迂回。所以,是的,它是 2 的补码,偏移量是从将要获取的下一个操作码的地址开始的,这意味着 -2 或 $fe 会让你回来到您的“BEQ”。所以 $F0 $A7 实际上会从 BEQ 地址前面 2 个字节的地址向后分支 89 个字节
关于java - 带符号字节的 6502 的条件分支指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16875378/