來自: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,向後