經常使用 arm 彙編指令

ARM編譯器通常都支持彙編語言的程序設計和C/C++語言的程序設計,以及二者的混合編程編程

ARM彙編語言程序裏,有一些特殊指令助記符,這些助記符與指令系統的助記符不一樣,沒有相對應的操做碼,一般稱這些特殊指令助記符爲僞指令,他們所完成的操做稱爲僞操做。僞指令在源程序中的做用是爲完成彙編程序做各類準備工做的,這些僞指令僅在彙編過程當中起做用,一旦彙編結束,僞指令的使命就完成。 spa

ARM的彙編程序中,有以下幾種僞指令:符號定義僞指令、數據定義僞指令、彙編控制僞指令、宏指令以及其餘僞指令。設計


數據定義(Data Definition)僞指令 code

DCD(DCDU) 用於分配一片連續的字存儲單元並用指定的數據初始化。orm


其餘經常使用的僞指令進程

EQU

用於爲程序中的常量、標號等定義一個等效的字符名稱,相似於C語言中的#define。ci


AREA 

語法格式: 編譯器

AREA 段名 屬性1,屬性2,…… it

AREA僞指令用於定義一個代碼段或數據段。其中,段名若以數字開頭,則該段名需用「|」括起來,如|1_test|。 io

屬性字段表示該代碼段(或數據段)的相關屬性,多個屬性用逗號分隔。經常使用的屬性以下: 


EXTERN

用於通知編譯器要使用的標號在其餘的源文件中定義


SPACE

僞指令用於分配一片連續的存儲區域並初始化爲0

DataSpace SPACE 100 ;分配連續100字節的存儲單元並初始化爲0。


SUBS 減法指令

例如:SUBS R0,R0,#0x20

意思爲 R0 = R0 - 20; 


STM 批量數據加載/存儲指令

 STM     R0, {R4-R11} R4R11寄存器保存在此進程的R0堆棧中


STR指令

STR指令的格式爲:
STR{條件} 源寄存器,<存儲器地址>
STR指令用於從源寄存器中將一個32位的字數據傳送到存儲器中。該指令在程序設計中比較經常使用,且尋址方式靈活多樣,使用方式可參考指令LDR。
指令示例:
STR R0,[R1],#8 ;將R0中的字數據寫入以R1爲地址的存儲器中,並將新地址R1+8寫入R1。
STR R0,[R1,#8] ;將R0中的字數據寫入以R1+8爲地址的存儲器中。


STRB指令

STRB指令的格式爲:
STR{條件}B 源寄存器,<存儲器地址>
STRB指令用於從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據爲源寄存器中的低8位。
指令示例:
STRB R0,[R1] ;將寄存器R0中的字節數據寫入以R1爲地址的存儲器中。
STRB R0,[R1,#8] ;將寄存器R0中的字節數據寫入以R1+8爲地址的存儲器中。


LDR

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&times;4的字數據讀入寄存器R0,並將新地址R1+R2&times;4寫入R1。
LDR R0,[R1],R2,LSL#2      ;將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址R1+R2&times;4寫入R1。


LDRB

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 目標地址

BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工做狀態有ARM狀態切換到Thumb狀態,
該指令同時將PC的當前內容保存到寄存器R14中。所以,當子程序使用Thumb指令集,而調用者使用ARM指令集時,
能夠經過BLX指令實現子程序的調用和處理器工做狀態的切換。

同時,子程序的返回能夠經過將寄存器R14值複製到PC中來完成。


MSR 將操做數的內容傳送到程序狀態寄存器的特定域中

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指令的格式爲:ORR{條件}{S} 目的寄存器,操做數1,操做數2ORR指令用於在兩個操做數上進行邏輯或運算,並把結果放置到目的寄存器中。操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數。該指令經常使用於設置操做數1的某些位。指令示例:ORR R0,R0,#3 ;該指令設置R0的0、1位,其他位保持不變。

相關文章
相關標籤/搜索