当NES使用的6502上的减法运算(sbc asm指令)期间发生借位(即进位标志被清除)时?是每次结果是否定的(-1到-128)?
非常感谢! 谢谢 斯登
答案 0 :(得分:5)
在6502上SBC n
与ADC (n EOR $FF)
完全相同 - 这是一个补码。因此,当A + (operand ^ 0xff) + existing carry
小于256时,进位是明确的。
编辑:所以,如果设置了进位,那么减法就会在没有借位的情况下发生。如果进位是明确的,那么借用减法就会发生。因此,如果在减法后设置了进位,那么就没有借用。如果结转是明确的,那么借钱。
如果您想测试结果是否为负数,请通过BMI
或BPL
隐式检查符号位。
如果在通用6502上使用十进制模式但是NES变体没有十进制模式,那么它会比你读到的任何内容都要复杂一点。
澄清re:以下评论;如果您将数字视为已签名,则127
为+127
,128
为-128
,等等。正常的二进制补码。没什么特别的。 E.g。
LDA #-63 ; i.e. 1100 0001
SEC
SBC #65 ; i.e. 0100 0001
; result in accumulator is now -128, i.e. 1000 0000,
; and carry remains set because there was no borrow
BPL somewhere ; wouldn't jump, because -128 is negative
BMI somewhereElse ; would jump, because -128 is negative
以下内部工作方式完全相同:
LDA #-63 ; i.e. 1100 0001
SEC ; ... everything the same up until here ...
ADC #65 ; i.e. 1011 1110 (the complement of 0100 0001)
; result = 1100 0001 + 1011 1110 + 1 = [1] 0111 1111 + 1 = [1] 1000 0000
; ^
; |
; carry
; = -128
因此,如上所述,根据6502手册和“坐在累加器中的东西”的普通程序意义定义“结果”,您可以测试结果是正面还是负面,如上所述,例如
SBC $23
BMI resultWasNegative
resultWasPositive: ...
如果您对完整结果是否定感兴趣(即它是否适合累加器)感兴趣,那么您还可以检查溢出标志。如果设置了溢出,那么这意味着由于8位限制,累加器中的任何内容都有错误的符号。因此,您可以在溢出和符号之间执行等效的异或:
SBC $23
BVC signIsTheOpposite
BMI resultWasNegative
JMP resultWasPositive
signIsTheOpposite:
BPL resultWasNegative
JMP resultWasPositive
答案 1 :(得分:0)
不,结果也可能是积极的。
示例:
lda #$10
sec
sbc #$f0
之后Carry将会清楚,累积器将是20美元。
为了测试减法后的正/负值,使用状态寄存器的N(egative) - 标志和评估它的分支(BMI / BPL)。
答案 2 :(得分:0)
汤米的回答是正确的,但我有一种更简单的方式来看待它。
6502的ALU中的操作都是8位,所以你可以想到这样的减法(65美元和64美元):
01100101
-01100100
========
00000001
我所做的是想象减法是一个9位(无符号)运算,累加器的第9位设置为1,所以$ 65 - $ 64看起来像这样:
1 01100101
- 01100100
==========
1 00000001
64美元 - 65美元看起来像这样
1 01100100
- 01100101
==========
0 11111111
新的进位位是结果的第9位。
本质上,当操作数被解释为无符号数大于被解释为无符号数的累加器时,进位被置位。
时要迂腐 A < operand - 1 + oldcarry