關於ARM中的tst、cmp、bne、beq指令



一、關於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指令執行過以后,被減數、減數都保持原樣不變。



二、tst、cmp、bne、beq指令

1、tst:邏輯處理指令,用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標志位的值。當前運算結果為1,則Z=0;當前運算結果為0,則Z=1
  cmp:算數處理指令,用於把一個寄存器的內容和另一個寄存器的內容或立即數進行減法比較,不存儲結果,都會更改標志位
  bne: 數據跳轉指令,標志寄存器中Z標志位不等於零時, 跳轉到BNE后標簽處
  beq: 數據跳轉指令,標志寄存器中Z標志位等於零時, 跳轉到BEQ后標簽處


2、實例
tst r0 , #0x2         //進行and運算,如果bit_2為1,zero==0,如果bit_2為0,則zero==1,即該指令測試bit_2是否為0
bne led_blink         //非零則跳轉,若zero==1,跳轉到led_blink處執行;若zero==0,則繼續執行下一步指令

3、實例
sub r1 , r1 , #1     //r1=r1-1
cmp r1 , #0          //r1是否等於0,並更改標志位     
bne led_blink       //zero==1時跳轉至led_blink處,zero==0時則繼續執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM