我可以对 SUB 指令 gameboy 仿真使用两个补码吗?
Can I use two complement for SUB instruction gameboy emulation?
您好,我正在为 Game Boy 编写模拟器。
我正在为 SUB 指令而苦苦挣扎
SUB a, 0x92
给定 a = 0x90
.
我正在做的是:
0x90 + (-0x92)
我用2补法做减法。
-0x92 <=>
2_complement(0x92) <=>
2_complement(10010010) <=>
01101101 + 1 <=>
01101110
所以减法相当于下面的加法:
1001 0000 (0x90)
+0110 1110 (-0x92)
---------
1111 1110 (0xFE)
在这个过程中,没有进位也没有半进位,所以我没有设置标志。我认为这是一个错误,因为其他模拟器(如 BGB 也是如此。
注意结果是正确的,只有标志不正确。
所以我想真正的处理器不会使用 2 补码方法,因为没有自由的方法来检索进位和半进位。
不过,我可以使用两个补码来模拟带有标志处理的 SUB 指令,还是应该依赖 "classic" 减法逻辑?
您可以在此处找到 add/sub 工作原理和 carry/overflow 标志设置的答案:
My answer to: Overflow and Carry flags on Z80
My answer to: How does an adder perform unsigned integer subtraction?
真正的 CPU 在做减法时确实依赖于参数的反转。
首先请注意,二进制补码本身就是另一种加法(您在反转所有位后加 1),所以完全那样做会很慢。
让我们看看只添加一个反转的论点:
0x90 + (~0x92) = 0x90 + 0x6D = 0xFD 你没有进位。与正确结果相差 1。
要确定结果,您必须添加另一个,这可以通过将进位输入 = 1 传递给加法器来方便地完成。因此,您必须像对参数所做的那样反转传入的进位。
毫不奇怪,生成的进位也被反转。
一个例子:从0x34减去0x12:
0x34 + (~0x12) + 1(反向进位)= 0x34 + 0xED + 1 = 0x122:无进位(带反向输出进位)和正确的结果。
输入进位为 1:0x34+0xED+0 = 0x121(无进位,结果减 1)。
但是,有些 CPU 不会反转输入进位和结果进位:包括 6502(反转进位输入和输出 SBC 命令)和 32 位 ARM。他们只会颠倒论点。
您好,我正在为 Game Boy 编写模拟器。
我正在为 SUB 指令而苦苦挣扎
SUB a, 0x92
给定 a = 0x90
.
我正在做的是:
0x90 + (-0x92)
我用2补法做减法。
-0x92 <=>
2_complement(0x92) <=>
2_complement(10010010) <=>
01101101 + 1 <=>
01101110
所以减法相当于下面的加法:
1001 0000 (0x90)
+0110 1110 (-0x92)
---------
1111 1110 (0xFE)
在这个过程中,没有进位也没有半进位,所以我没有设置标志。我认为这是一个错误,因为其他模拟器(如 BGB 也是如此。 注意结果是正确的,只有标志不正确。
所以我想真正的处理器不会使用 2 补码方法,因为没有自由的方法来检索进位和半进位。
不过,我可以使用两个补码来模拟带有标志处理的 SUB 指令,还是应该依赖 "classic" 减法逻辑?
您可以在此处找到 add/sub 工作原理和 carry/overflow 标志设置的答案:
My answer to: Overflow and Carry flags on Z80
My answer to: How does an adder perform unsigned integer subtraction?
真正的 CPU 在做减法时确实依赖于参数的反转。
首先请注意,二进制补码本身就是另一种加法(您在反转所有位后加 1),所以完全那样做会很慢。
让我们看看只添加一个反转的论点:
0x90 + (~0x92) = 0x90 + 0x6D = 0xFD 你没有进位。与正确结果相差 1。
要确定结果,您必须添加另一个,这可以通过将进位输入 = 1 传递给加法器来方便地完成。因此,您必须像对参数所做的那样反转传入的进位。 毫不奇怪,生成的进位也被反转。
一个例子:从0x34减去0x12: 0x34 + (~0x12) + 1(反向进位)= 0x34 + 0xED + 1 = 0x122:无进位(带反向输出进位)和正确的结果。 输入进位为 1:0x34+0xED+0 = 0x121(无进位,结果减 1)。
但是,有些 CPU 不会反转输入进位和结果进位:包括 6502(反转进位输入和输出 SBC 命令)和 32 位 ARM。他们只会颠倒论点。