ARM Cortex-M3 學習筆記(4-1)
第四章 指令系統(tǒng)
基本語法
這里介紹的匯編語法是ARM匯編器的語法,如果采用其他的匯編器,比如gcc中的as,語法是不同的。
匯編指令的典型模式如下所示:
Label
opcode operand1, operand2, … ;comment
標號是可選的,如果有,它必須頂格寫,標號后面不需要“:”。
操作碼是指令的助記符,它的前面必須有至少一個空白符。
立即數(shù)必須以“#”開頭,16進制數(shù)字表示與C語言的方法相同,比如:
MOV R0, #0x12 ; R0 ? 0x12
使用EQU指示字來定義常數(shù):
NVIC_IRQ_SETEN0 EQU 0xE000E100 ; 注意:常數(shù)定義必須頂格寫
NVIC_IRQ0_ENABLE EQU 0x1
…
LDR R0, =NVIC_IRQ_SETEN0 ;在這里的LDR是個偽指令,它會被匯編器轉換成
;一條“相對PC的加載指令”
MOV R1, #NVIC_IRQ0_ENABLE ; 把立即數(shù)傳送到R1中
DCI 可以在匯編代碼中插入1 個half word (2個字節(jié)),通常用這條指令插入?yún)R編器不支持的指令。
DCB來定義一串字節(jié)常數(shù)
DCD來定義一串32位整數(shù)
比如下面的例子:
LDR R3, =MY_NUMBER ; R3= MY_NUMBER
LDR R4, [R3] ; R4= *R3
…
LDR R0, =HELLO_TEXT ; R0= HELLO_TEXT
BL PrintText ; 呼叫PrintText以顯示字符串,R0傳遞參數(shù)
…
MY_NUMBER
DCD 0x12345678
HELLO_TEXT
DCB ”Hellon”,0
指令后綴
后綴 | 含義 |
S | 要求更新APSR中的相關標志,例如: ADDS R0, R1 ; 根據(jù)加法的結果更新APSR中的標志 |
EQ,NE,LT,GT等 | 有條件地執(zhí)行指令。 EQ=Euqal, NE= Not Equal, LT= Less Than, GT= Greater Than,例如: BEQ |
統(tǒng)一匯編語言(UAL)
與Thumb-2指令集同時出現(xiàn)的還有新的匯編語法(統(tǒng)一匯編語言)。利用統(tǒng)一匯編語言的語法,我們可以方便的選擇當前的語句是被編譯為16位的指令還是編譯為32位的指令。
ADD R0, R1 ; 使用傳統(tǒng)的Thumb語法
ADD R0, R0, R1 ; 引入UAL后允許的等效寫法(R0=R0+R1)
如果使用傳統(tǒng)的Thumb語法,有些指令會默認地更新APSR。
如果使用UAL語法,則必須指定S后綴才會更新。例如:
AND R0, R1 ;傳統(tǒng)的Thumb語法
ANDS R0, R0, R1 ;等值的UAL語法(必須有S后綴)
.W(Wide)后綴指定32位指令,.N后綴制定采用16位指令。如果沒有給出后綴,匯編器會先試著用16位指令以給代碼瘦身,如果不行再使用32位指令。例如:
ADDS R0, #1 ;匯編器將為了節(jié)省空間而使用16位指令
ADDS.N R0, #1 ;指定使用16位指令(N=Narrow)
ADDS.W R0, #1 ;指定使用32位指令(W=Wide)
32位的Thumb-2指令可以half word 對齊。不用word對齊使得代碼中混用16位指令和32位指令變得很容易。
了。
評論