ARM編譯器通常都支持彙編語言的程序設計和C/C++語言的程序設計,以及二者的混合編程編程
ARM彙編語言程序裏,有一些特殊指令助記符,這些助記符與指令系統的助記符不一樣,沒有相對應的操做碼,一般稱這些特殊指令助記符爲僞指令,他們所完成的操做稱爲僞操做。僞指令在源程序中的做用是爲完成彙編程序做各類準備工做的,這些僞指令僅在彙編過程當中起做用,一旦彙編結束,僞指令的使命就完成。 spa
ARM的彙編程序中,有以下幾種僞指令:符號定義僞指令、數據定義僞指令、彙編控制僞指令、宏指令以及其餘僞指令。設計
數據定義(Data Definition)僞指令 code
DCD(DCDU) 用於分配一片連續的字存儲單元並用指定的數據初始化。orm
其餘經常使用的僞指令進程
用於爲程序中的常量、標號等定義一個等效的字符名稱,相似於C語言中的#define。ci
語法格式: 編譯器
AREA 段名 屬性1,屬性2,…… it
AREA僞指令用於定義一個代碼段或數據段。其中,段名若以數字開頭,則該段名需用「|」括起來,如|1_test|。 io
屬性字段表示該代碼段(或數據段)的相關屬性,多個屬性用逗號分隔。經常使用的屬性以下:
用於通知編譯器要使用的標號在其餘的源文件中定義
SPACE
僞指令用於分配一片連續的存儲區域並初始化爲0
DataSpace SPACE 100 ;分配連續100字節的存儲單元並初始化爲0。
例如:SUBS R0,R0,#0x20
意思爲 R0 = R0 - 20;
STM R0, {R4-R11} 將R4至R11寄存器保存在此進程的R0堆棧中
STR指令的格式爲:
STR{條件} 源寄存器,<存儲器地址>
STR指令用於從源寄存器中將一個32位的字數據傳送到存儲器中。該指令在程序設計中比較經常使用,且尋址方式靈活多樣,使用方式可參考指令LDR。
指令示例:
STR R0,[R1],#8 ;將R0中的字數據寫入以R1爲地址的存儲器中,並將新地址R1+8寫入R1。
STR R0,[R1,#8] ;將R0中的字數據寫入以R1+8爲地址的存儲器中。
STRB指令的格式爲:
STR{條件}B 源寄存器,<存儲器地址>
STRB指令用於從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據爲源寄存器中的低8位。
指令示例:
STRB R0,[R1] ;將寄存器R0中的字節數據寫入以R1爲地址的存儲器中。
STRB R0,[R1,#8] ;將寄存器R0中的字節數據寫入以R1+8爲地址的存儲器中。
LDR指令的格式爲:LDR{條件} 目的寄存器,<存儲器地址>, <存儲器地址調整>
LDR指令用於從存儲器中將一個32位的字數據傳送到目的寄存器中。
該指令一般用於從存儲器中讀取32位的字數據到通用寄存器,而後對數據進行處理。
當程序計數器PC做爲目的寄存器時,指令從存儲器中讀取的字數據被看成目的地址,從而能夠實現程序流程的跳轉。
該指令在程序設計中比較經常使用,且尋址方式靈活多樣,請讀者認真掌握。
指令示例:
LDR R0,[R1] ;將存儲器地址爲R1的字數據讀入寄存器R0。 LDR R0,[R1,R2] ;將存儲器地址爲R1+R2的字數據讀入寄存器R0。 LDR R0,[R1,#8] ;將存儲器地址爲R1+8的字數據讀入寄存器R0。 LDR R0,[R1,R2] ! ;將存儲器地址爲R1+R2的字數據讀入寄存器R0,並將新地址R1+R2寫入R1。 LDR R0,[R1,#8] ! ;將存儲器地址爲R1+8的字數據讀入寄存器R0,並將新地址R1+8寫入R1。 LDR R0,[R1],R2 ;將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址R1+R2寫入R1。 LDR R0,[R1,R2,LSL#2]! ;將存儲器地址爲R1+R2×4的字數據讀入寄存器R0,並將新地址R1+R2×4寫入R1。 LDR R0,[R1],R2,LSL#2 ;將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址R1+R2×4寫入R1。
LDRB指令的格式爲:
LDR{條件}B 目的寄存器,<存儲器地址>
LDRB指令用於從存儲器中將一個8位的字節數據傳送到目的寄存器中,同時將寄存器的高24位清零。
該指令一般用於從存儲器中讀取8位的字節數據到通用寄存器,而後對數據進行處理。
當程序計數器PC做爲目的寄存器時,指令從存儲器中讀取的字數據被看成目的地址,從而能夠實現程序流程的跳轉。
指令示例:
LDRB R0,[R1] ;將存儲器地址爲R1的字節數據讀入寄存器R0,並將R0的高24位清零。
LDRB R0,[R1,#8] ;將存儲器地址爲R1+8的字節數據讀入寄存器R0,並將R0的高24位清零。
BLX指令的格式爲:BLX 目標地址
BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工做狀態有ARM狀態切換到Thumb狀態,
該指令同時將PC的當前內容保存到寄存器R14中。所以,當子程序使用Thumb指令集,而調用者使用ARM指令集時,
能夠經過BLX指令實現子程序的調用和處理器工做狀態的切換。
同時,子程序的返回能夠經過將寄存器R14值複製到PC中來完成。
MSR指令的格式爲:
MSR{條件} 程序狀態寄存器(CPSR或SPSR)_<域>,操做數
MSR指令用於將操做數的內容傳送到程序狀態寄存器的特定域中。其中,操做數能夠爲通用寄存器或當即數。<域>用於設置程序狀態寄存器中須要操做的位,32位的程序狀態寄存器可分爲4個域:
位[31:24]爲條件位域,用f表示;
位[23:16]爲狀態位域,用s表示;
位[15:8] 爲擴展位域,用x表示;
位[7:0] 爲控制位域,用c表示;
該指令一般用於恢復或改變程序狀態寄存器的內容,在使用時,通常要在MSR指令中指明將要操做的域。
指令示例:
MSR CPSR,R0 ;傳送R0的內容到CPSR
MSR SPSR,R0 ;傳送R0的內容到SPSR
MSR CPSR_c,R0 ;傳送R0的內容到SPSR,但僅僅修改CPSR中的控制位域
ORR指令的格式爲:ORR{條件}{S} 目的寄存器,操做數1,操做數2ORR指令用於在兩個操做數上進行邏輯或運算,並把結果放置到目的寄存器中。操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數。該指令經常使用於設置操做數1的某些位。指令示例:ORR R0,R0,#3 ;該指令設置R0的0、1位,其他位保持不變。