//addr :代表8位地址 addr16:代表16位地址 data :立即数
//比较指令
1. CMP--累加器和存储器比较
符号码格式 | 指令操作码 | 寻址方式 |
CMP ($addr,X) | C1 | 先变址X后间址 |
CMP $addr | C5 | 零页寻址 |
CMP #$data | C9 | 立即寻址 |
CMP $addr16 | CD | 绝对寻址 |
CMP ($addr),Y | D1 | 后变址Y间址 |
CMP $addr,X | D5 | 零页X变址 |
CMP $addr16,Y | D9 | 绝对Y变址 |
CMP $addr16,X | DD | 绝对X变址 |
该指令也是做减法操作,将寄存器的内容减去存储器的内容,但它和减法指令有2点区别:
一是借位标志C不参加运算,所以在用CMP指令不必加指令SEC
二是减法的结果不送入寄存器A
该指令运行后,会影响标志位 C,Z,N.我们在实际中尤其要注意它是如何影响标志位C和标志位Z
若执行指令CMP后,C=1表示无借位,即A》M
若执行指令CMP后,C=0表示有借位,即A<M
若执行指令CMP后,Z=1表示A=M
从上面我们可以判断出A和M谁大谁小,或者A和M是不是相等
例://比较指令演示,演示如何判断A和M的大小
2000:LDA $2100 //地址2100的内容送寄存器A
2003:CMP $2101 //寄存器A的内容和地址2101的内容相比较
2006:BEQ $2016 //若标志位Z=1,那么程序就跳转到地址2016
2008:BCC $2010 //若标志位C=0,那么程序就跳转到地址2010
200A:LDA #$02 //若进位标志C=1,程序不跳转,顺序执行
200C:STA $2102 //若程序执行到这里,说明C=1,那么将立即数02送地址2102,作为地址2100的值>地址2101的值的标志
200F:RTS
2010:LDA #$01 //若标志位C=0,那么将立即数01送地址2102,作为地址2100的值<地址2101的值的标志
2012:STA $2102
2015:RTS
2016:LDA #$00 //若标志位Z=1,那么将立即数00送地址2102,作为地址2100的值=地址2101的值的标志
2018:STA $2102
201B:RTS
进入NCTOOLS,输入 A 2000,然后输入上面的程序,先用E命令 E 2100,输入0102,然后G 2000,然后看地址2102的值
这里因为(2100)=01,(2101)=02,显然01>02那么程序执行后,(2102)=02,你可以用D 2102,看看是不是这样.
你也可以输入别的数值,看看地址2102的内容是不是和预期的一样.
2. CPX--寄存器X的内容和存储器比较
符号码格式 | 指令操作码 | 寻址方式 |
CPX #$data | E0 | 立即寻址 |
CPX $addr | E4 | 零页寻址 |
CPX $addr16 | EC | 绝对寻址 |
这些指令和CMP指令相似,不过前者是寄存器A,后者是寄存器X,另外寻址方式也比较少.
这条指令用的比较多,特别是在循环时
例: //CPX在循环程序中的运用,该程序实现了将地址3000-30FF的内容发送到地址3100-31FF
2000:LDX #$00 //初始化寄存器X的值,一开始(X)=0
2002:LDA $3000,X //地址[3000+X]的内容送寄存器A
2005:STA $3100,X //寄存器A的内容送地址[3100+X]
2008:INX //寄存器X的内容加1
2009:CPX #$00 //如果寄存器X的内容=00,那么说明数据已经发送完了.注意:FF+01=00
200B:BNE 2002 //程序跳转到地址2002继续发送直到寄存器X的内容=00
200D:RTS
这里我们来为初学者分析一下代码运行过程:
第1次循环 (X)=00 地址[3000+00]=3000的内容送地址[3100+00]=3100
第2次循环 (X) =01 地址[3000+01]=3001的内容送地址[3100+01]=3101
第3次循环 (X) =02 地址[3000+02]=3002的内容送地址[3100+02]=3102
....
....
第256次循环 (X) =FF 地址[3000+FF]=30FF的内容送地址[3100+FF]=31FF
3. CPY--寄存器Y的内容和存储器比较
符号码格式 | 指令操作码 | 寻址方式 |
CPY #$data | C0 | 立即寻址 |
CPY $addr | C4 | 零页寻址 |
CPY $addr16 | CC | 绝对寻址 |
这些指令和CPX指令相似,不过前者是寄存器X,后者是寄存器Y.
4. BIT--位测试指令
符号码格式 | 指令操作码 | 寻址方式 |
BIT $addr | 24 | 零页寻址 |
BIT $addr16 | 2C | 绝对寻址 |
这条指令的功能和AND指令有相同之处,那就是把累加器A同存储器单元相与,但和AND指令不同的是相与的结果不送入累加器A
另外该指令对标志位的影响也和AND指令不同
若 结果=0,那么Z=1
若 结果<>0,那么Z=0
N=M的第7位
V=M的第6位
所以执行该指令后N,V两标志位的状态就是参加与操作的存储单元的最高两位状态
这些指令在通讯程序中用的相当多,大家要给予足够的重视,是很有用的指令