当借用(即清除携带标志)时,在NES使用的6502上减去操作(SBC ASM指令)时发生?是否每次结果为负(-1至-128)?
非常感谢!谢谢Sten
在6502 SBC n
上与 ADC (n EOR $FF)
完全相同 - 这是一个人的补充。因此,当A + (operand ^ 0xff) + existing carry
小于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
汤米的答案是正确的,但是我有一种更简单的方式来查看它。
在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
nope,结果也可能为正。
示例:
lda #$10
sec
sbc #$f0
随身携带将很清楚,累加器将为20美元。
在缩写后测试正/负值,使用n(egative) - 状态注册和评估其分支的分支(BMI/BPL)。