數據操作(ALU操作)
1、數學操作
Opcode | Operands | Deacription | Function |
---|---|---|---|
ADC | Rd,Rn,Op2 | 帶進位的加 | Rd=Rn+Op2+c |
ADD | Rd,Rn,Op2 | 加 | Rd=Rn+Op2 |
MOV | Rd,Op2 | 數據傳送 | Rd=Op2 |
MVP | Rd,Op2 | 數據取反傳送 | Rd=~Op2 |
RSB | Rd,Rn,Op2 | 翻轉減 | Rd=Op2-Rn |
RSC | Rd,Rn,Op2 | 反轉減 | Rd=Op2-Rn-!C |
SBC | Rd,Rn,Op2 | 帶進位的減法 | Rd=Rn-Op2-!C |
SUB | Rd,Rn,Op2 | 減 | Rd=Rn-Op2 |
MUL | Rd,RmRs | 32位乘法 | Rd=Rm*Rs |
MLA | Rd,Rm,Rs,Rn | 32位累加乘法 | Rd=Rm*Rs+Rn |
UMULL | RdLo,RdHi,Rm,Rs | 64位無符號乘法 | (RdLo,RdHi)=Rm*Rs |
2、邏輯操作
Opcode | Operands | Deacription | Function |
---|---|---|---|
AND | Rd,Rn,Op2 | 邏輯與 | Rd=Rn&Op2 |
BIC | Rd,Rn,Op2 | 位清零 | Rd=&~Op2 |
EOR | Rd,Rn,Op2 | 邏輯或與 | Rd=Rn^Op2 |
ORR | Rd,Rn,Op2 | 邏輯或 | Rd=Rn |
3、比較操作
Opcode | Operands | Deacription | Function |
---|---|---|---|
CMP | Rn,Op2 | 比較 | Rn-Op2 |
CMN | RN,Op2 | 負數比較 | Rn+Op2 |
TEQ | Rn,Op2 | 測試相等 | Rn&Op2 |
TST | Rn,Op2 | 測試 | Rn^Op2 |
ARM堆棧—先進後出
1、滿堆棧
2、空堆棧
3、遞增堆棧
4、遞減堆棧
內存操作 - 讀取內存
Opcode | Operands | Deacription | Function |
---|---|---|---|
單寄存器讀寫指令 | |||
LDR | Rn,Addr | 按照字節讀取長度 | |
STR | |||
LDRB | |||
LDRH | |||
STRB | |||
LDRH | |||
STRH | |||
LDRBT | |||
STRBT | |||
LDRT | |||
STRT | |||
LDRSB | |||
LDRSH | |||
LDRSH | |||
多寄存器內存訪問指令 | |||
LDM | LDMIA R0!,{R3-R9} | ||
STM | STMIA R1,{R3-R9} |
地址模式:
數據塊模式:IA(傳輸後地址加4),IB(傳輸前地址加4),DA(傳輸後地址減4),DB(傳輸前地址減4)
堆棧模式:滿底層堆棧),EA(空遞減堆棧),FD(滿遞減堆棧),ED(空遞增堆棧),FA(滿遞增堆棧)
數據交換指令
SWAP | Rd,Rn,[Rn2] | 內存和寄存器字交換 | [Rn2]->Rd,Rn1->[Rn2]:如果Rd和Rn1相同就是直接交換 |
---|---|---|---|
SWPB | 字節交換 |
跳轉、狀態操作
Opcode | Operands | Deacription | Function |
---|---|---|---|
B | 跳轉指令 | pc<-label | |
BL | 帶返回的連接跳轉 | pc<-label | |
BX | 跳轉並切換狀態Thumb | ||
BLX | 待返回的跳轉並切換狀態Thumb | ||
狀態寄存器操作 | 把32位指令分爲4個域:[7:0]控制位域c,[15:8]擴展位域x,[23:16]狀態位域s,[31:24]:條件標誌位域f | ||
MRS | 把程序狀態寄存器的值傳送到通用寄存器 | ||
MSR | CPSR,R0,SPSR,R0,CPSR_c,R0 | 通用寄存器到程序狀態寄存器 | |
異常產生指令 | |||
SWI | SWI 0x02 | 軟中斷指令 | |
BKPT | BKPT | 斷點中斷指令 |
僞指令
僞指令作用及類別
————我們的指令已經可以做各類操作庫,但我們操作起來太麻煩了。
比如我現在要設置一個值給寄存器R0,但下次我修改了寄存器R0之後又需要都出來剛纔的值,那我們就要先臨時保存值到SPSR or CPSR,然後不斷切換。
再比如,我們要做一個循環,就要用label結合BL不斷進行,但如果我們要循環很多次。
我們就定義了一些類似帶參數的宏的操作數一樣,來定義我們的僞指令,方便我們更好的實現彙編程序邏輯。僞指令只是在彙編之前作用,彙編之後就會翻譯成爲標準的彙編指令。
我們又分爲ARM彙編僞指令和GUN彙編僞指令。
基本常用僞指令
Opcode | Operands | Deacription | Function |
---|---|---|---|
AREA | AREA test,CODE,READONLY | 聲明區域段,數據區,代碼區等等 | |
CODE16,CODE32 | CODE32 | 聲明以下是32位還是16位指令,注意不是切換arm和thumb模式,只是告訴彙編器 | |
ENTRY | ENTRY僞指令用於指定彙編程序的入口點。在一個完整的彙編程序中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程序的真正入口點由鏈接器指定),單在一個源文件裏最多有一個ENTRY(可以沒有)。 | ||
END | END | END僞指令用於通知編譯器到了源程序的結尾 | |
EQU | UARTLCON0 EQU 0x3FFD000 | EQU僞指令用於爲程序的常量、標號等定義一個等效的字符名稱,類似於c語言中的#define。其中EQU可用*代替 | |
EXPORT | .global | EXPORT僞指令用於在該程序中聲明一個全局的標號,該編號可在其他的文件中引用。EXPORT可用GLOBAL代替,標號在程序中區分大小寫,【WEAK】選項聲明其他的同名標號優先於該標號被引用 | |
IMPORT | 相當於靜態引用 | IMPORT僞指令用於通知編譯器要使用的標號在其他的源文件中定義,但要在當前源文件中引用,而且無論當前源文件是否引用該標號,該標號均會被加入當前源文件的符號中 | |
EXTERN | 相當於動態引用 | EXTREN僞指令用於通知編譯器要使用的標號在其他的源文件中定義,但要在當前源文件中引用,如果但當前源文件實際並未引用該標號。該標號就不會被加入到當前源文件的符號中 | |
GET | 相當於引用文件 | GET僞指令用於將一個源文件包含的源文件中,並將被包含的源文件在當前位置進行彙編處理。可以實用INCLUDE代替GET| | |
RN | RN僞指令用於給一個寄存器定義一個別名。採用這種方式可以方便程序員記憶寄存器的功能。其中,名稱爲給寄存器定義的別名,表達式爲寄存器的編碼 |
在彙編語言程序中常用的符號
符號命名約定
- - -符號區分大小寫,同名的大,小寫符號會被編譯器認爲是兩個不同的符號
- - -符號在其作用的範圍內會被編譯器認爲是兩個不同的符號
- - -自定義的符號名不能與系統的保留字相同
- - - 符號名不應與指令或僞指令同名
- - -關於ADS裏面可惡的Tab和頂行“ADS Style”
符號,變量
ARM(Thumb)彙編程序所支持的變量有數字變量,邏輯變量和字符串變量
Opcode | Operands | Deacription | Function |
---|---|---|---|
GBLA/GBLL/GBLS | GBLA Test3 | 定義全局數字/邏輯/字符串變量 | |
LBLA/LBLL/LBLS | LBLA Test3 | 聲明局部變量 | |
SETA/SETL/SETS | Test SETA 0xaa | 設置變量值 | 不能有Tab |
RLIST | RegList RLIST{R0-R5,R8,R10} | 將寄存器立標名稱定義爲RegList ,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。 | 不能有Tab |
FAQ ?
定義變量存儲在寄存器中還是內存中?
**變量代換
表達式和運算 : -“+” , ”-“, ” *”,“ /”及MOD算數運算符///////////////////////”ROL“,”ROR“,”SHL“,及SHR移位運算符//////////////////////”AND“,”OR“,”NOT“及”EOR“按位運算符/////////////////////////////////////////////////////////////////////////////////////////”=“,”>“,”<“,”>=“,”<=“,”/=“,”<>“運算符”LAND“,”LOR“,”LNOT“,及”LEOR“運算符
變量:數字常量一般爲32爲的整數,當作爲無符號數時,起取值範圍爲0~232-1,當作爲有符號數時,其取值範圍爲-231~231.//邏輯常量只有兩種取值情況:真或假//字符串常量爲一個固定的字符串,一般用於程序運行時的信息提示
寄存器操作
數據定義僞指令
Opcode | Operands | Deacription | Function |
---|---|---|---|
LDR R0,=0x12 | 某時候可以提到MOV,MVN | 大範圍尋址到寄存器-絕對尋址 | |
ADR | 小範圍尋址到寄存器+-255-相對尋址 | ||
ADR | 中範圍尋址 |
控制僞指令
–