//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两标志位的状态就是参加与操作的存储单元的最高两位状态

这些指令在通讯程序中用的相当多,大家要给予足够的重视,是很有用的指令