加法和减法(Addition & Subtraction)
6502芯片提供了8位的加减指令和一个进/借位标志来实现加减法计算。
为了实现16位加法,程序员必须编写两对加法;一个用于最低有效字节,一个用于最高有效字节。在第一次添加之前必须清除进位标志,以确保不执行额外的自增操作。
; 16 bit Binary Addition
CLC ;Ensure carry is clear
LDA VLA+0 ;Add the two least significant bytes
ADC VLB+0
STA RES+0 ;... and store the result
LDA VLA+1 ;Add the two most significant bytes
ADC VLB+1 ;... and any propagated carry bit
STA RES+1 ;... and store the result
减法也遵循同样的模式,但是必须在第一对字节被减法以获得正确的结果之前设置进位。
; 16 bit Binary Subtraction
SEC ;Ensure carry is set
LDA VLA+0 ;Subtract the two least significant bytes
SBC VLB+0
STA RES+0 ;... and store the result
LDA VLA+1 ;Subtract the two most significant bytes
SBC VLB+1 ;... and any propagated borrow bit
STA RES+1 ;... and store the result
通过对另外两个字节的数据重复LDA/ADC/STA或LDA/SBC/STA模式,加法和减法算法都可以扩展到32位。
取反(Negation)
对一个采用补码的2进制数进行取反操作,典型的操作方法是所有位取反(通过EOR指令将操作数和$FF进行异或操作),然后加1,如下所示。
; 8 bit Binary Negation
CLC ;Ensure carry is clear
EOR #$FF ;Invert all the bits
ADC #1 ;... and add one
这种技术适用于累加器中已有的单个字节,但不适用于更大的数字。有了这些,从0减去它们会更简单。
; 16 bit Binary Negation
SEC ;Ensure carry is set
LDA #0 ;Load constant zero
SBC SRC+0 ;... subtract the least significant byte
STA DST+0 ;... and store the result
LDA #0 ;Load constant zero again
SBC SRC+1 ;... subtract the most significant byte
STA DST+1 ;... and store the result
网友评论