在6502上借用减法运算(sbc asm指令)?

时间:2016-12-11 08:50:46

标签: 6502

当NES使用的6502上的减法运算(sbc asm指令)期间发生借位(即进位标志被清除)时?是每次结果是否定的(-1到-128)?

非常感谢! 谢谢 斯登

3 个答案:

答案 0 :(得分:5)

在6502上SBC nADC (n EOR $FF)完全相同 - 这是一个补码。因此,当A + (operand ^ 0xff) + existing carry小于256时,进位是明确的。

编辑:所以,如果设置了进位,那么减法就会在没有借位的情况下发生。如果进位是明确的,那么借用减法就会发生。因此,如果在减法后设置了进位,那么就没有借用。如果结转是明确的,那么借钱。

如果您想测试结果是否为负数,请通过BMIBPL隐式检查符号位。

如果在通用6502上使用十进制模式但是NES变体没有十进制模式,那么它会比你读到的任何内容都要复杂一点。

澄清re:以下评论;如果您将数字视为已签名,则127+127128-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