ARM指令CMP詳解

2021-08-09 01:57:49 字數 1610 閱讀 5797

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    小於等於(有符號數)

ARM指令CMP詳解

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為立即...

CMP比較指令詳解

cmp compare 指令進行比較兩個運算元的大小 例 cmp oprd1,oprd2 為第乙個操作減去第二個運算元,但不影響第兩個運算元的值 它影響flag的cf,zf,of,af,pf 我們怎麼判斷大小呢?若執行指令後 zf 1 這個簡單,則說明兩個數相等,因為zero為1說明結果為0 當無符...

彙編cmp比較指令詳解

剛剛看到了cmp指令,一開始有點暈。後來上網找了些資料,終於看明白了,為了方便初學者,我就簡單寫下我的思路吧。高手繞過,謝謝!cmp compare 指令進行比較兩個運算元的大小 例 cmp oprd1,oprd2 為第乙個操作減去第二個運算元,但不影響第兩個運算元的值 它影響flag的cf,zf,...