ARM彙編

數據操作(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 ?
定義變量存儲在寄存器中還是內存中?

**變量代換:  ”Sample- -LCLS S1    - -LCLS S2  - -S1 SETS “Test!” - -S2 SETS  “This is a $S1”;字符串變量S2的值爲“This is a Test!”
表達式和運算 : -“+” , ”-“,   ” *”,“ /”及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 中範圍尋這裏寫圖片描述這裏寫圖片描述

控制僞指令

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章