6502上的减法操作(sbc asm指令)期间借用?

6502上的减法操作(sbc asm指令)期间借用?,6502,6502,NES使用的6502上的减法操作(sbc asm指令)期间发生借用(即清除进位标志)时?是不是每次结果都是负值(-1到-128) 非常感谢! 谢谢 6502SBC上的STeN与ADC(n EOR$FF)完全相同-它是一种补充。因此,当A+(操作数^0xff)+现有进位小于256时,进位是清除的 编辑:因此,如果设置了进位,则减法将在没有借用的情况下进行。如果清除了进位,则使用借入进行减法。因此,如果在减法后设置进位,则不存在借入。如果携带是明确的,那么就有借用 如果要测试结果是否为负,请通过BM

NES使用的6502上的减法操作(sbc asm指令)期间发生借用(即清除进位标志)时?是不是每次结果都是负值(-1到-128)

非常感谢! 谢谢
6502
SBC上的STeN

ADC(n EOR$FF)
完全相同-它是一种补充。因此,当
A+(操作数^0xff)+现有进位小于256时,进位是清除的

编辑:因此,如果设置了进位,则减法将在没有借用的情况下进行。如果清除了进位,则使用借入进行减法。因此,如果在减法后设置进位,则不存在借入。如果携带是明确的,那么就有借用

如果要测试结果是否为负,请通过
BMI
BPL
隐式检查符号位

这比在普通6502上使用十进制模式要复杂一点,但是NES变体没有十进制模式,所以忽略你读到的任何内容


澄清以下评论:;如果您将数字视为有符号的,那么
127
+127
128
-128
,等等。正常的二元补码。没什么特别的。例如

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

不,结果也可能是正面的

例如:

lda #$10
sec
sbc #$f0
在那之后,结转将被清除,累加器将为20美元


要测试减法后的正/负值,请使用状态寄存器的N(负)-标志和评估它的分支(BMI/BPL)。

Tommy的答案是正确的,但我有一种更简单的方法来看待它

6502的ALU中的操作都是8位的,因此您可以想到这样的减法(对于$65和$64):

我要做的是,假设减法是一个9位(无符号)运算,累加器的第9位设置为1,所以$65-$64如下所示:

 1 01100101
-  01100100
 ==========
 1 00000001 
而64-65美元看起来是这样的

 1 01100100
-  01100101
 ==========
 0 11111111
新进位是结果的假想第9位

本质上,进位是在解释为无符号数的操作数大于解释为无符号数的累加器时设置的。或是当你

 A < operand - 1 + oldcarry
A<操作数-1+进位

进位表示无符号。>如果要测试结果是否为负,请通过BMI或BPL隐式检查符号位。--不对!例如,(-128)减1仍然是负数,但在累加器中,您将得到正字节宽值+127。在这种情况下,应该检查溢出标志,如果设置了溢出标志,则标志(负)的值不正确(即反转)。@lvd我不同意您的评估,尤其是您的气质。这就像争论说任何用C写的人说
10/7
的结果是
0
是“不正确的!”。根据6502数据表和手册以及所有常识的定义,结果就是累加器中的东西。我已经扩展了答案来覆盖溢出的可能性,它会让你快乐,但是,老实说,在你的校园喊叫中,你仅仅是在吹毛求疵。固定大小算法的一个简单事实是溢出和下溢可能会改变符号,但符号会改变。(而且,根据编辑历史记录,我最初误读了lvd的评论;希望我已经纠正了我的错误)所问的问题显然是新手提出的。明智的做法是注意有符号计算中的溢出等细节。否则,第一次尝试汇编程序的人可能会以更不愉快的方式获得同样的体验。查看我的编辑历史,你会发现,尽管我坚持自己是能够回答问题的人,但我还是在你的评论中绊倒了自己。所以我认为你是对的。
 A < operand - 1 + oldcarry