当NES使用的6502进行减法操作(sbc asm指令)时,借位(即进位标志被清除)是在什么情况下发生的?是每当结果为负数(-1到-128)时都会发生吗?
非常感谢! 谢谢 STeN
当NES使用的6502进行减法操作(sbc asm指令)时,借位(即进位标志被清除)是在什么情况下发生的?是每当结果为负数(-1到-128)时都会发生吗?
非常感谢! 谢谢 STeN
SBC n
操作与 ADC (n EOR $FF)
完全相同 —— 这是一种补码反码。因此,当 A + (operand ^ 0xff) + existing carry
小于256 时,进位标志被清除。BMI
或者 BPL
隐式地检查符号位。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
SBC $23
BMI resultWasNegative
resultWasPositive: ...
SBC $23
BVC signIsTheOpposite
BMI resultWasNegative
JMP resultWasPositive
signIsTheOpposite:
BPL resultWasNegative
JMP resultWasPositive
10/7
的结果是0
的人是“INCORRECT!”一样荒唐可笑。按照6502数据表和手册以及所有常识所定义的,结果就是累加器中的东西。我已经对溢出进行了扩展回答,以防你会感到高兴,但是,老实说,在你幼稚的喊叫声中,你只是在纠结于琐事。固定大小算术的一个简单事实是溢出和下溢可能会改变符号,但符号已经改变了。 - Tommy 01100101
-01100100
========
00000001
我的做法是将减法想象成一个9位(无符号)操作,累加器的第9位设为1,因此$65-$64看起来像这样:
1 01100101
- 01100100
==========
1 00000001
而 $64 - $65 会看起来像这样
1 01100100
- 01100101
==========
0 11111111
A < operand - 1 + oldcarry
不,结果也可能是正数。
例如:
lda #$10
sec
sbc #$f0
执行完后,Carry 标志将被清除,Accumulator 将为 $20。
在减法后测试正/负值,请使用状态寄存器的 N(Negative)标志和评估它的分支(BMI/BPL)。