天天看點

arm彙編, beq &b0

來自:http://blog.chinaunix.net/u2/66024/showart_2124238.html

1、

前陣子看cpu從sleep模式喚醒時,對tst bne和tst beq有些模糊。先記錄:

摘抄如下:

TST     R0, #0X8

BNE    SuspendUp ;BNE指令是“不相等(或不為0)跳轉指令”:

LDR   R1,#0x00000000

先進行and運算,如果R0的第四位不為1,則結果為零,則設定zero=1(繼續下面的LDR指令);

否則,zero=0(跳到SuspendUp處執行)。

還有:

有點模糊,在此記下。

tst r0,#02

bne sleep

ldr  r1,#0

解釋:位比較,先進行and運算,如果r0第2位不為1,則與的結果為0,設定标志位zero=1,繼續下面的ldr指令。反之,zero=0,跳轉到sleep執行。

bne指令: 非零則跳轉

個人總結:tst 和bne連用: 先是用tst進行位與運算,然後将位與的結果與0比較,如果不為0,則跳到bne緊跟着的标記(如bne sleep,則跳到sleep處)。

tst 和beq連用: 先是用tst進行位與運算,然後将位與的結果與0比較,如果為0,則跳到beq緊跟着的标記(如bne AAAA,則跳到AAAA處)。

2、

昨天在看arm彙編,其中有這樣的一段語句

         ldr    r3, [r0], #4

         str    r3, [r1], #4

         cmp r2, r0

         bne %B0

bne:不等于則調轉

但%B0 ,網上搜了一遍,還是未果。從最後的彙編語言來看,%B 代表,往前搜尋 lable為0的行,換句話說,就是指本條語句前,lable為0的位址。整條語句的意思就是,如果不相等則跳轉到lable為0的行。

同樣,有了bne %B0,也就有了bne %F1,這是向後搜尋lable為1的行。參考代碼:

; check if EIN0 button is pressed

       ldr       r0,=GPFCON

         ldr    r1,=0x0

         str    r1,[r0]

         ldr    r0,=GPFUP

         ldr    r1,=0xff

         ldr    r1,=GPFDAT

         ldr    r0,[r1]

       bic      r0,r0,#(0x1e<<1) ; bit clear

         tst    r0,#0x1

         bne %F1

(省略一些語句)

;Clear SDRAM End

1

                ;Initialize stacks

         bl      InitStacks

%B, %F可以這樣了解: B表示before,向前。F表示after,向後

繼續閱讀