cmp bne 以及sub指令的詳解

之前看到過一個延時函數段:


delay:

     ldr r2, =7000000    

     ldr r3, =0x0        

 delay_loop:

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

     cmp r2, r3         //cmp會影響z標誌位,如果r2=r3,則Z=1;下一句中eq就會成立

     bne delay_loop      //

mov pc, lr              //函數返回  延時函數

 

現在我們來分析一下這個函數的各個指令。

1、cmp比較指令

假設現在AX寄存器中的數是0004H,BX寄存器中的數是0007H。

執行的指令是:CMP  AX,  BX

執行這條指令時,先做用AX中的數減去BX中的數的減法運算。各標誌位將會被分別設置成以下值:

  CF:是否有進位或者借位

  ZF:0標誌位,就是結果是否爲0

  OF:溢出標誌位,是否計算機結果溢出了

  SF:符號位,0爲正,1爲負

2、bne指令

  bne: 標誌寄存器中Z標誌位不等於零時, 跳轉到BNE後標籤處

  beq: 標誌寄存器中Z標誌位等於零時, 跳轉到BEQ後標籤處

 上面函數中,比較了r2和r3,它們相減,如果結果爲0,那麼Z標誌位置位,就不跳轉了,否則就會跳轉,形成循環

3、sub r2,r2,#1

  把r2裏的數減1,然後放回r2裏面。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章