ARM指令CMP详解

1、加减指令

    add  r1, r2, #1    /*r1 = r2 + 1 */

    sub  r1, r2, #1    /*r1 = r2 - 1 */


2、adr指令

    adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令。可实际上adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立即数或一个地址到指定的寄存器中。到这儿就会看到其中的区别了。如果在程序中想加载某个函数或者某个在联接时候指定的地址时请使用adr,例如在lds中需要重新定位的地址。当加载32为的立即数或外部地址时请用ldr。

3、CMP
      假设现在AX寄存器中的数是0002H,BX寄存器中的数是0003H。
执行的指令是:CMP  AX,  BX

   执行这条指令时,先做用AX中的数减去BX中的数的减法运算。

列出二进制运算式子:


           0000 0000 0000 0010
      -  0000 0000 0000 0011
_________________________________
(借位1) 1111 1111 1111 1111


所以,运算结果是 0FFFFH
根据这个结果,各标志位将会被分别设置成以下值:
         CF=1,因为有借位
         OF=0,未溢出
         SF=1,结果是负数
         ZF=0,结果不全是零
      还有AF, PF等也会相应地被设置。

    CMP 比较指令做了减法运算以后,根据运算结果设置了各个标志位。标志位设置过以后,0FFFFH这个减法运算的结果就没用了,它被丢弃,不保存。执行过了CMP指令以后,除了CF,ZF,OF, SF,等各个标志位变化外,其它的数据不变。


对照普通的减法指令 SUB   AX,  BX,它们的区别就在于:

     SUB指令执行过以后,原来AX中的被减数丢了,被换成了减法的结果。
     CMP指令执行过以后,被减数、减数都保持原样不变。


cmp r0, #0
beq LABEL1 ; r0==0那么向前跳转到LABEL1处执行
bne LABEL2 ; 否则向后跳转到LABEL2处执行


4、控制流指令

    转移指令(branch)
        说明:无条件转移B,BAL
        举例:    B      LABEL        ; LABEL为某个位置
    条件转移
        说明:
            BEQ    相等
            BNE    不等
            BPL    非负
            BMI    负
            BCC    无进位
            BCS    有进位
            BLO    小于(无符号数)
            BHS    大于等于(无符号数)
            BHI    大于(无符号数)
            BLS    小于等于(无符号数)
            BVC    无溢出(有符号数)
            BVS    有溢出(有符号数)
            BGT    大于(有符号数)
            BGE    大于等于(有符号数)
            BLT    小于(有符号数)
            BLE    小于等于(有符号数)

你可能感兴趣的:(嵌入式开发)