 嵌入式之arm匯編指令集合,美女學霸總(zong)結(jie)
							時(shi)間:2018-08-03      來源(yuan):未(wei)知
							嵌入式之arm匯編指令集合,美女學霸總(zong)結(jie)
							時(shi)間:2018-08-03      來源(yuan):未(wei)知 
							arm匯編(bian)指(zhi)(zhi)令(ling)(ling)是學(xue)習匯編(bian)必(bi)須要掌握的(de),很多人覺(jue)得arm匯編(bian)指(zhi)(zhi)令(ling)(ling)記得很頭疼,而(er)且還很亂,在這里一(yi)個美女學(xue)霸總(zong)結出了(le)最全面(mian)的(de)arm匯編(bian)指(zhi)(zhi)令(ling)(ling),看(kan)(kan)看(kan)(kan)學(xue)霸是怎么總(zong)結的(de),還在等(deng)什么,快(kuai)收藏起(qi)來。
剛開始就是(shi)ARM匯編語言基(ji)本結構,這是(shi)必須先要了解的:
AREA Init, CODE, READONLY
ENTRY
Start
LDR R0, =0x3FF5000
LDR R1, 0xFF
STR R1, [R0]
LDR R0, =0x3FF5008
LDR R1, 0x01
STR R1, [R0]
... ... ... ... ... ...
END
指令格式
ARM指令的基本格式:
  
opcode:指令助(zhu)記碼(ma),如:MOV
con:執行條件,如(ru)NE,EQ
S:是否影響CPSR寄存(cun)器(qi)的值(zhi),設置時影響CPSR
Rd:目標寄(ji)存器(qi)
Rn:第一個操(cao)作數(shu)的(de)寄存器(qi)
operand2:第二(er)個操作數
ARM處理器尋址方式
尋(xun)(xun)址(zhi)方(fang)式(shi)(shi)(shi)是根(gen)據指令(ling)中給出的地址(zhi)碼字段來實(shi)現尋(xun)(xun)找真實(shi)操作(zuo)數(shu)地址(zhi)的方(fang)式(shi)(shi)(shi)。ARM處理器有(you)九(jiu)種尋(xun)(xun)址(zhi)方(fang)式(shi)(shi)(shi),寄(ji)存器尋(xun)(xun)址(zhi)、立即數(shu)尋(xun)(xun)址(zhi)、寄(ji)存器偏(pian)移尋(xun)(xun)址(zhi)為數(shu)據處理指令(ling)操作(zuo)數(shu)尋(xun)(xun)址(zhi)方(fang)式(shi)(shi)(shi),寄(ji)存器間接尋(xun)(xun)址(zhi)、基址(zhi)尋(xun)(xun)址(zhi)、多(duo)寄(ji)存器尋(xun)(xun)址(zhi)、堆(dui)棧尋(xun)(xun)址(zhi)、相(xiang)對尋(xun)(xun)址(zhi)為存儲器訪問(wen)指令(ling)操作(zuo)數(shu)尋(xun)(xun)址(zhi)方(fang)式(shi)(shi)(shi)。
a、寄(ji)存(cun)器尋址
操作數的值存(cun)(cun)在寄存(cun)(cun)器中,指令中的地(di)址(zhi)碼字段指出的是寄存(cun)(cun)器編號,指令執行(xing)時直接取出寄存(cun)(cun)器值操作。例如(ru):
MOV R0,R1
SUB R0,R1,R2
b、立即尋址
立(li)即尋(xun)址(zhi)指(zhi)令中(zhong)的(de)(de)操(cao)作碼字段部分后面(mian)的(de)(de)地址(zhi)碼部分就(jiu)是操(cao)作數本(ben)身,即數據(ju)包含在指(zhi)令當中(zhong)。例如:
MOV R0,#0xff
立即數(shu)要(yao)以“#”為前綴,十六(liu)進制(zhi)以“0x”表示
c、寄存(cun)器偏移尋址
寄存器(qi)偏移(yi)尋(xun)(xun)址是ARM指令集特有的尋(xun)(xun)址方(fang)式(shi),當第2操作(zuo)數是寄存器(qi),在執行(xing)操作(zuo)之前(qian),可以做(zuo)一次移(yi)位(wei)操作(zuo)。
MOV R0,R2,LSL #3
ANDS R1,R1,R2,LSL R3
d、寄(ji)存(cun)器間接尋址
寄存器(qi)(qi)間(jian)接(jie)尋(xun)址指(zhi)(zhi)令中的(de)地址碼給(gei)出的(de)是一個通用(yong)寄存器(qi)(qi)的(de)編號,所(suo)需的(de)操(cao)(cao)作數保存在寄存器(qi)(qi)指(zhi)(zhi)定地址的(de)存儲單元中,即寄存器(qi)(qi)為操(cao)(cao)作數的(de)地址指(zhi)(zhi)針(zhen)。
LDR R1,[R2] ;將(jiang)R2指向的(de)單元(yuan)中(zhong)的(de)數據(ju)保存再R1中(zhong)
SWP R1,R1,[R2] ;將(jiang)寄(ji)存(cun)器R1的(de)值(zhi)和(he)R2指向(xiang)的(de)單元中(zhong)進行內容交換
e、基址尋址
基(ji)址(zhi)(zhi)(zhi)尋址(zhi)(zhi)(zhi)就是將(jiang)基(ji)址(zhi)(zhi)(zhi)寄存器(qi)的內(nei)容與指令中給出的偏移(yi)量進行相加,形成操作數的有效地址(zhi)(zhi)(zhi)。基(ji)址(zhi)(zhi)(zhi)尋址(zhi)(zhi)(zhi)用(yong)于(yu)訪問(wen)基(ji)址(zhi)(zhi)(zhi)附近的存儲單元,常(chang)用(yong)于(yu)查(cha)表、數組(zu)操作以(yi)及功能不見寄存器(qi)訪問(wen)等。
LDR R2,[R3,#0x0c] ;讀取R3 0x0c地址指向的(de)存儲單(dan)元的(de)內容,放入R2
STR R1,[R0,#-4]! ;先(xian)R0=R0-4,然后把R1的值寄存到R0所指向的單元(yuan)中
LDR R1,[R0,R3,LSL #1] ;將(jiang)R0 R3*2地址(zhi)上(shang)的單元的內容讀出,并存入(ru)R1中
f、多寄存器尋(xun)址
多(duo)寄(ji)存(cun)器尋址即一(yi)次可傳(chuan)送幾個寄(ji)存(cun)器的值(zhi),允許一(yi)條指令傳(chuan)送16個寄(ji)存(cun)器的任(ren)何子(zi)集或所有的存(cun)儲器。
LDMIA R1!,{R2-R7,R12};將(jiang)R1指向的單元中的數據讀出到R2---R7、R12中(R1自(zi)自(zi)動(dong) )
STMIA R0!,{R2-R7,R12};將R2---R7、R12中(zhong)的數據一次讀入到R0指向的單元中(zhong)(R0自(zi)動 )
g、堆棧尋址
堆棧(zhan)是一(yi)種按(an)特定順(shun)序進(jin)行存(cun)取的存(cun)儲區,操(cao)作(zuo)順(shun)序分為“先(xian)進(jin)后出”和“后進(jin)先(xian)出”,堆棧(zhan)尋址是隱含的,它使用一(yi)個專門的寄存(cun)器(堆棧(zhan)指(zhi)針)指(zhi)向的存(cun)儲區域(堆棧(zhan)),指(zhi)針所(suo)指(zhi)向的存(cun)儲單元(yuan)即(ji)是堆棧(zhan)的棧(zhan)頂。
STMFD SP!,{R1-R7,LR} ;將R1---R7、LR入棧。滿遞減堆棧
LDMFD SP!,{R1-R7,LR} ;數據出棧,放入R1---R7、LR寄存器,滿(man)遞減堆棧
h、塊拷貝(bei)尋址
多(duo)寄存(cun)器(qi)傳(chuan)送指(zhi)令用于將一塊數據從存(cun)儲器(qi)的某(mou)一位置拷貝(bei)到(dao)另(ling)一位置。
STMIA R0!,{R1-R7} ;將R1~R7的數據(ju)保存到(dao)存儲器中。
;存儲指針在保存第(di)一個值之后(hou)增加,
;增長方向(xiang)為向(xiang)上增長。
STMIB R0!,{R1-R7} ;將R1~R7的數據保存到存儲(chu)器中。
;存儲(chu)指針(zhen)在保存第一(yi)個值(zhi)之(zhi)前增加,
;增(zeng)長方向為(wei)向上增(zeng)長。
i、相對尋址
相對(dui)尋址是(shi)基(ji)址尋址的(de)(de)一(yi)種(zhong)變通。由程序計數器(qi)PC提供基(ji)址地(di)址,指(zhi)令中(zhong)的(de)(de)地(di)址碼(ma)字段(duan)為偏移量。兩(liang)者(zhe)相加后得到(dao)的(de)(de)地(di)址即為操(cao)作數的(de)(de)有效地(di)址。
  
ARM存儲器訪問指令(ling)
ARM處理(li)(li)器(qi)是加(jia)載/存(cun)儲(chu)(chu)體系結(jie)構的典型RISC處理(li)(li)器(qi),對(dui)存(cun)儲(chu)(chu)器(qi)的訪問(wen)只能用加(jia)載和(he)存(cun)儲(chu)(chu)指令實(shi)現。ARM的加(jia)載/存(cun)儲(chu)(chu)指令可以實(shi)現字、半(ban)字、字節操作。
1、LDR和STR
加載(zai)/存(cun)儲(chu)字(zi)和無符號(hao)字(zi)節指(zhi)(zhi)(zhi)(zhi)令(ling)。使用單一數據傳送指(zhi)(zhi)(zhi)(zhi)令(ling)來裝載(zai)和存(cun)儲(chu)單一字(zi)節或字(zi)的數據。LDR指(zhi)(zhi)(zhi)(zhi)令(ling)用于從內存(cun)中讀取數據放(fang)入內存(cun)中,STR指(zhi)(zhi)(zhi)(zhi)令(ling)用于將寄(ji)存(cun)器中的數據保存(cun)到內存(cun)中。
指令格(ge)式如下(xia):
LDR[cond][T] Rd,<地址>;
加載指定(ding)地址上的數據(字),放入(ru)Rd中
STR[cond][T] Rd,<地址>;
存(cun)儲(chu)數據(字)到指定(ding)地址的(de)(de)存(cun)儲(chu)單元(yuan),要存(cun)儲(chu)的(de)(de)數據在Rd中
LDR[cond]B[T] Rd,<地址>;加載字節(jie)數據,放入Rd中(zhong),Rd低字節(jie)有(you)效
STR[cond]B[T] Rd,<地址>;存儲字節數(shu)(shu)據(ju),要存儲的數(shu)(shu)據(ju)在(zai)Rd中
指令T表示在(zai)處理(li)器特權(quan)模(mo)式下,存儲(chu)系統(tong)也(ye)將訪(fang)問看(kan)做(zuo)是在(zai)用戶模(mo)式下。
STR R0,[R1],#8;將R0中內容寫入(ru)R1為地(di)(di)址(zhi)的內存中,并將新地(di)(di)址(zhi)R1+8寫入(ru)R1。
STR R0,[R1,#8];將R0中(zhong)的字數據寫(xie)入(ru)以R1+8為地址的存儲(chu)器(qi)中(zhong)。
LDR/STR指令尋址(zhi)非(fei)常靈活,由兩部分組成,一部分為基址(zhi)寄存器(qi),可以(yi)是任(ren)一通用(yong)寄存器(qi),另一部分為地址(zhi)偏移(yi)量,由以(yi)下三種格式:
a、立即數
立即數可以(yi)是一個無符(fu)號(hao)數值,這個數值可以(yi)加到基址(zhi)寄存器或由基址(zhi)寄存器減去,例如:
LDR R0,[R1,#0x12];將(jiang)R1+0x12地址處的數據讀出保存到R0寄存器(qi)中
LDR R0,[R1,#-0x12];將R1-0x12地址(zhi)處的(de)數據讀出(chu)保(bao)存(cun)(cun)到R0寄存(cun)(cun)器中
LDR R0,[R1];將R1地址處的數(shu)據讀出(chu)保存到R0寄(ji)存器(qi)中
 
b、寄存器
寄(ji)存器(qi)中的數(shu)值可(ke)以加(jia)到基址(zhi)寄(ji)存器(qi),也可(ke)以從基址(zhi)寄(ji)存器(qi)中減(jian)去這(zhe)個值,例如:
LDR R0,[R1,R2];將R1+R2地址(zhi)處(chu)的數據(ju)讀(du)出,保存到R0寄存器中
LDR R0,[R1,-R2];將R1-R2地址處(chu)的(de)數據(ju)讀出,保存到R0寄存器中
c、寄存器及移位常(chang)數
基址寄存(cun)器加上(shang)或減(jian)去寄存(cun)器移位后的值(zhi)
LDR R0,[R1,R2,LSL#2];將(jiang)R1+R2*4地址(zhi)處(chu)的數據讀(du)出,保存到寄存器R0
LDR R0,[R1,-R2,LSL#2];將R1-R2*4地址處的數(shu)據讀出(chu),保存到寄存器(qi)R0
LDRB指令(ling)用(yong)于從存(cun)(cun)儲(chu)(chu)器(qi)中(zhong)將一個8位(wei)(wei)的(de)字節數(shu)(shu)據傳(chuan)送到(dao)目的(de)寄(ji)存(cun)(cun)器(qi)中(zhong),同時將寄(ji)存(cun)(cun)器(qi)的(de)高24位(wei)(wei)清零(ling)。 該指令(ling)通(tong)常(chang)用(yong)于從存(cun)(cun)儲(chu)(chu)器(qi)中(zhong)讀(du)取8位(wei)(wei)的(de)字節數(shu)(shu)據到(dao)通(tong)用(yong)寄(ji)存(cun)(cun)器(qi),然后(hou)對數(shu)(shu)據進行處理。當程(cheng)序計數(shu)(shu)器(qi)PC作(zuo)為目的(de)寄(ji)存(cun)(cun)器(qi)時,指令(ling)從存(cun)(cun)儲(chu)(chu)器(qi)中(zhong)讀(du)取的(de)字數(shu)(shu)據被(bei)當作(zuo)目 的(de)地址,從而可以實現程(cheng)序流程(cheng)的(de)跳(tiao)轉。
LDRH指(zhi)令(ling)的(de)格式為:
LDR{條件}H 目(mu)的(de)寄存器(qi),<存儲(chu)器(qi)地址>
LDRH指令(ling)用于(yu)(yu)從(cong)存(cun)儲(chu)器(qi)中(zhong)(zhong)將(jiang)一個16位的(de)半字(zi)數(shu)(shu)據傳(chuan)送到(dao)目的(de)寄存(cun)器(qi)中(zhong)(zhong),同時(shi)將(jiang)寄存(cun)器(qi)的(de)高16位清零。 該指令(ling)通常用于(yu)(yu)從(cong)存(cun)儲(chu)器(qi)中(zhong)(zhong)讀(du)取16位的(de)半字(zi)數(shu)(shu)據到(dao)通用寄存(cun)器(qi),然后對數(shu)(shu)據進(jin)行處理(li)。當程(cheng)序(xu)計(ji)數(shu)(shu)器(qi)PC作為目的(de)寄存(cun)器(qi)時(shi),指令(ling)從(cong)存(cun)儲(chu)器(qi)中(zhong)(zhong)讀(du)取的(de)字(zi)數(shu)(shu)據被(bei)當作 目的(de)地址,從(cong)而可以實現程(cheng)序(xu)流程(cheng)的(de)跳轉。
STRB指令的格式為(wei):
STR{條件}B 源(yuan)寄(ji)存(cun)器(qi),<存(cun)儲器(qi)地址(zhi)>
STRB指令用(yong)于從(cong)源寄(ji)存器(qi)中(zhong)將一個(ge)8位(wei)的(de)字(zi)節數據傳送到存儲(chu)器(qi)中(zhong)。該字(zi)節數據為源寄(ji)存器(qi)中(zhong)的(de)低(di)8位(wei)。
STRH指(zhi)令的格式為:
STR{條件}H 源寄存器(qi),<存儲(chu)器(qi)地址(zhi)>
STRH指令用于(yu)從源寄存器(qi)中(zhong)將一個(ge)16位的半字數據傳送到(dao)存儲器(qi)中(zhong)。該半字數據為源寄存器(qi)中(zhong)的低(di)16位。
應用示例:
GPIO設置:
GPIO_BASE EQU 0xE0028000;定義GPIO寄存(cun)器(qi)的(de)基地址
LDR R0,=GPIO_BASE
LDR R1,=0x00FFFFFF00
STR R1,[R0,#0x0C];將0xE002800C地址的值設為0x00FFFFFF00
MOV R1,0x00F00000
STR R1,[R0,#0x04];將0xE0028004地(di)址的(de)值設為0x00F00000
2、LDM和(he)STM
批量加載/存(cun)儲指令可(ke)以實現在一組寄存(cun)器和一塊連續的(de)內存(cun)單元之間傳(chuan)輸數據(ju),指令格式如下:
LDM[cond]<模式> Rn[!],reglist{^}
STM[cond]<模式(shi)> Rn[!],reglist{^}
模式有八種:
IA 每(mei)次傳送后(hou)地址加4;
IB 每次傳送(song)前地(di)址加4;
DA 每次(ci)傳送后(hou)地址減4;
DB 每次傳(chuan)送前地址(zhi)減4;
FD 滿(man)遞減堆棧;
ED 空遞減堆棧;
FA 滿(man)遞增(zeng)堆(dui)棧(zhan);
EA 空遞增(zeng)堆棧;
3、SWP
寄(ji)存器和存儲器交換指令,指令格式:
SWP[cond][B] Rd,Rm,[Rn]
將Rn的(de)(de)值為地址的(de)(de)內存單(dan)元的(de)(de)值讀取到(dao)Rd寄(ji)存器中,同時將寄(ji)存器Rm的(de)(de)值寫入該內存單(dan)元。
如果(guo)有B,則交換(huan)字節,否則交換(huan)32位字;
ARM數據處理指(zhi)令
數(shu)據處理指(zhi)(zhi)令(ling)(ling)分為(wei)數(shu)據傳(chuan)送指(zhi)(zhi)令(ling)(ling)、算數(shu)邏輯(ji)運算指(zhi)(zhi)令(ling)(ling)、比較(jiao)指(zhi)(zhi)令(ling)(ling)
數據處理指令只能對寄(ji)存器(qi)的內容進行操作
1、數據傳(chuan)送指(zhi)令
A、MOV
指令格式:
MOV[con][S] Rd,operand2
MOV R0,#0x04
MOV R0,R1
MOVS R3,R2,LSL#2
MOV PC,LR;PC=LR,子程序返回(hui)
B、MVN
指令格式:
MOV[con][S] Rd,operand2
MVN R0,R1
MVN R2,#0xFF;R2位0xFFFFFF00
2、算數邏輯運(yun)算指令(ling)
A、ADD加(jia)法運(yun)算指(zhi)令(ling)
指令格式:
ADD[con][S] Rd,Rn,operand2
將operand2數據與Rn的值(zhi)相(xiang)加,結(jie)果保存到Rd寄存器
ADD指令用(yong)于把兩個(ge)(ge)操(cao)作數(shu)相加,并將(jiang)結(jie)果(guo)存放到目的(de)(de)寄(ji)存器中。操(cao)作數(shu)1應(ying)是一個(ge)(ge)寄(ji)存器,操(cao)作數(shu)2可(ke)以是一個(ge)(ge)寄(ji)存器,被移位(wei)的(de)(de)寄(ji)存器,或一個(ge)(ge)立即數(shu)。
ADD R0,R1,R2
ADD R0,R1,#0x12
ADDS R0,R1,R2,LSL#2
B、SUB減法運算指(zhi)令
SUB[con][S] Rd,Rn,operand2
用寄存器Rn的值減去operand2,結果保存在Rd中(zhong),指(zhi)令(ling)格(ge)式:
SUBS R0,R0,#1
SUBS R0,R1,R2
RBS逆向(xiang)減法指令
用寄(ji)存器operand2減去Rn,結果保存到Rd中,指令格式:
RBS[con][S] Rd,Rn,operand2
RSB R0,R1,#0x100;R0=0x100-R1
C、ADC帶(dai)進位加法指令
將(jiang)operand2的數據與Rn的值相加,再加上CPSR中的C條(tiao)件標志位,結(jie)果保存到Rd寄存器(qi),指令(ling)格式:
ADC[con][S] Rd,Rn,operand2
D、AND邏輯與操作指令(ling)
將寄(ji)(ji)存器(qi)operand2的(de)值(zhi)與(yu)寄(ji)(ji)存器(qi)Rn的(de)值(zhi)按(an)位作邏輯與(yu)操(cao)作,結果(guo)保存到Rd中(zhong),指令格式:
AND[con][S] Rd,Rn,operand2
ANDS R0,R1,#0x01
AND R0,R1,R2
E、ORR邏輯或操作指令(ling)
將寄存(cun)器(qi)operand2的值與寄存(cun)器(qi)Rn的值按位作邏輯或(huo)操作,結果保存(cun)到Rd中,指(zhi)令格式:
ORR[con][S] Rd,Rn,operand2
ORR R0,R0,#0x0F;將R0的(de)低4位置1
F、EOR邏輯異(yi)或操作(zuo)指令
將寄(ji)存器operand2的值(zhi)與(yu)寄(ji)存器Rn的值(zhi)按位作邏輯異(yi)或操(cao)作,結(jie)果(guo)保存到Rd中(zhong),指令格式:
ERR[con][S] Rd,Rn,operand2
H、BIC位清零操作指令
將(jiang)寄存器(qi)Rn的(de)值與寄存器(qi)operand2的(de)值反碼(ma)按位作邏輯與操(cao)作,結(jie)果保存到Rd中,指令格式:
BIC[con][S] Rd,Rn,operand2
BIC R1,R1,#0x0F
3、比(bi)較指令
A、CMP比較指令
用寄存器Rn的(de)(de)值(zhi)減去寄存器operand2的(de)(de)值(zhi),根據操作的(de)(de)結果(guo)更新CPSR中相應的(de)(de)條件(jian)標志位,以便后(hou)面(mian)的(de)(de)指令根據相應的(de)(de)條件(jian)標志位判斷是否執行,指令格式:
CMP[con] Rn,operand2
B、CMN負(fu)數比較(jiao)指令
CMN[con] Rn,operand2
CMN指令(ling)(ling)用(yong)于把一個寄存器的內容和另(ling)一個寄存器的內容或(huo)立(li)即數(shu)取反(fan)后進行比較,同(tong)時更新CPSR中條件標志位(wei)的值。該指令(ling)(ling)實際(ji)完成操作(zuo)數(shu)1和操作(zuo)數(shu)2相 加,并根(gen)據(ju)結(jie)果更改條件標志位(wei)。
指令示例:
CMN R1,R0 ;將寄存(cun)器R1的值與(yu)寄存(cun)器R0的值相加,并根據 結果(guo)設置CPSR的標志位
4、乘法指令
A、MUL 32位乘法指令
將Rm與Rs中的值相乘(cheng),結果的低32位保存到Rd中,指令格式(shi):
MUL[con][S] Rd,Rm,Rs
MUL R0,R1,R2
B、MLA 32位乘(cheng)法疊加指令
將Rm與Rs中的值相乘,結果再與Rn相加,低(di)32位(wei)保存(cun)到Rd中,指令(ling)格式:
MLA[con][S] Rd,Rm,Rs,Rn
MLA R0,R1,R2,R3
C、UMULL 64位無符號(hao)乘法指(zhi)令
將(jiang)Rm與Rs的(de)值作無(wu)符號(hao)數相乘,結果(guo)的(de)低32位保存(cun)到RdLo中,高32位保存(cun)到RdHi中,指(zhi)令格式:
UMULL[con][S] RdLo,RdHi,Rm,Rs
UMULL R0,R1,R4,R5;(R1,R0)=R4*R5
D、SMULL 64位(wei)有(you)符號(hao)乘法指令
將Rm與Rs的(de)值(zhi)作有符(fu)號(hao)數相乘,結(jie)果的(de)低(di)32位保存到RdLo中,高32位保存到RdHi中,指令(ling)格式(shi):
SMULL[con][S] RdLo,RdHi,Rm,Rs
SMULL R0,R1,R4,R5;(R1,R0)=R4*R5
ARM跳(tiao)轉指令
1、B跳轉指令
跳轉到(dao)指定的地址執行(xing)程(cheng)序(xu),指令格式:
B[con] label
B hello
B #0x30008000
2、BL帶(dai)鏈接的跳(tiao)轉指(zhi)令
將下(xia)一條指(zhi)令(ling)的地(di)址(zhi)(zhi)拷(kao)貝到(dao)R14(LR)鏈(lian)接寄存器中,然(ran)后跳轉到(dao)指(zhi)定地(di)址(zhi)(zhi)運行程序,指(zhi)令(ling)格(ge)式:
BL[con] label
BL hello
BL用于子(zi)函數的(de)調(diao)用
3、BX帶狀態切換的跳轉指(zhi)令
BX指(zhi)令(ling)的格式為(wei):
BX{條件}目(mu)標地址
BX指(zhi)(zhi)令(ling)跳轉到指(zhi)(zhi)令(ling)中所指(zhi)(zhi)定的目(mu)標(biao)(biao)地(di)址,目(mu)標(biao)(biao)地(di)址處(chu)的指(zhi)(zhi)令(ling)既(ji)可(ke)以是ARM指(zhi)(zhi)令(ling),也可(ke)以是Thumb指(zhi)(zhi)令(ling)。
數(shu)據交換指(zhi)令(ling)
1、SWP指令
SWP指令(ling)的格式為:
SWP{條件} 目的寄存器,源(yuan)寄存器1,[源(yuan)寄存器2]
SWP指(zhi)令用于將源寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)2所(suo)指(zhi)向的(de)存(cun)(cun)儲(chu)器(qi)(qi)(qi)(qi)中的(de)字數據傳送(song)到目的(de)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)中,同時將源寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)1中的(de)字數據傳送(song)到源寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)2所(suo)指(zhi)向的(de)存(cun)(cun)儲(chu)器(qi)(qi)(qi)(qi)中。顯(xian)然,當源寄(ji)(ji)(ji)存(cun)(cun) 器(qi)(qi)(qi)(qi)1和目的(de)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)為同一個寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)時,指(zhi)令交(jiao)換該寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)(qi)和存(cun)(cun)儲(chu)器(qi)(qi)(qi)(qi)的(de)內容。
指令示例:
SWP R0,R1,[R2] ;將R2所指向的存儲器(qi)中的字(zi)數據傳送到(dao)(dao)R0,同時將R1 中的字(zi)數據傳送到(dao)(dao)R2所指向的存儲單(dan)元。
SWP R0,R0,[R1] ;該指令完成將R1所指向的(de)存儲器(qi)中(zhong)的(de)字數 據(ju)與R0中(zhong)的(de)數據(ju)交換。
2、SWPB指(zhi)令(ling)
SWPB指令(ling)的格式為:
SWP{條(tiao)件}B 目(mu)的寄(ji)存(cun)器(qi),源寄(ji)存(cun)器(qi)1,[源寄(ji)存(cun)器(qi)2]
SWPB指(zhi)令(ling)用于將(jiang)源(yuan)(yuan)寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)2所(suo)指(zhi)向的存(cun)(cun)儲(chu)器(qi)(qi)(qi)中的字(zi)節數(shu)據傳(chuan)送到目的寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)中,目的寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)的高(gao)24清零(ling),同時(shi)將(jiang)源(yuan)(yuan)寄(ji)(ji)存(cun)(cun) 器(qi)(qi)(qi)1中的字(zi)節數(shu)據傳(chuan)送到源(yuan)(yuan)寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)2所(suo)指(zhi)向的存(cun)(cun)儲(chu)器(qi)(qi)(qi)中。顯然,當源(yuan)(yuan)寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)1和(he)目的寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)為同一(yi)個寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)時(shi),指(zhi)令(ling)交換該(gai)寄(ji)(ji)存(cun)(cun)器(qi)(qi)(qi)和(he)存(cun)(cun)儲(chu)器(qi)(qi)(qi)的內容。
指令示例:
SWPB R0,R1,[R2] ;將R2所(suo)指向的(de)存(cun)儲器中(zhong)的(de)字節數據傳(chuan)送到 R0,R0的(de)高24位清零,同時將R1中(zhong)的(de)低8位數據傳(chuan)送到R2所(suo)指向的(de)存(cun)儲單元。
SWPB R0,R0,[R1] ;該指令完成將R1所指向的(de)存儲器中(zhong)(zhong)的(de) 字節數據與R0中(zhong)(zhong)的(de)低8位數據交換。
程(cheng)序狀(zhuang)態寄存(cun)器訪問指令
1、MRS指令
MRS指令的格式為:
MRS{條件} 通(tong)用(yong)寄(ji)(ji)存器(qi) 程(cheng)序(xu)狀(zhuang)態(tai)寄(ji)(ji)存器(qi)(CPSR或SPSR)
MRS指(zhi)令用于(yu)將程序狀(zhuang)態寄(ji)(ji)存器(qi)的內(nei)容傳(chuan)送到通用寄(ji)(ji)存器(qi)中。該指(zhi)令一般用在(zai)以下兩(liang)種(zhong)情況:
Ⅰ.當需(xu)要改變程(cheng)序(xu)狀態寄(ji)(ji)存器的內容時,可用MRS將程(cheng)序(xu)狀態寄(ji)(ji)存器的內容讀入通用寄(ji)(ji)存器,修(xiu)改后(hou)再寫回(hui)程(cheng)序(xu)狀態寄(ji)(ji)存器。
Ⅱ.當在異常處理或進(jin)程(cheng)切(qie)換時,需要保(bao)存(cun)程(cheng)序狀(zhuang)態寄(ji)存(cun)器(qi)的(de)值,可(ke)先(xian)用該(gai)指令讀出程(cheng)序狀(zhuang)態寄(ji)存(cun)器(qi)的(de)值,然后保(bao)存(cun)。
指令示例:
MRS R0,CPSR ;傳送(song)CPSR的內容到R0
MRS R0,SPSR ;傳送 SPSR的內容到R0
2、MSR指令
MSR指令的(de)格式為:
MSR{條(tiao)件(jian)} 程序狀態寄(ji)存器(qi)(CPSR或SPSR)_<域>,操(cao)作數
MSR指令用于將操(cao)(cao)作數(shu)的(de)(de)內容傳(chuan)送到程序狀(zhuang)(zhuang)態寄存(cun)器的(de)(de)特定域中(zhong)。其中(zhong),操(cao)(cao)作數(shu)可(ke)以為通用寄存(cun)器或立即數(shu)。<域>用于設(she)置程序狀(zhuang)(zhuang)態寄存(cun)器中(zhong)需要 操(cao)(cao)作的(de)(de)位,32位的(de)(de)程序狀(zhuang)(zhuang)態寄存(cun)器可(ke)分(fen)為4個域:
位[31:24]為條件位域,用f表示;
位(wei)[23:16]為狀態(tai)位(wei)域(yu),用s表示;
位[15:8]為擴展位域,用x表示;
位[7:0] 為控制位域,用c表示;
該指(zhi)令(ling)(ling)通常用于恢復(fu)或改變(bian)程序狀(zhuang)態(tai)寄(ji)存器(qi)的內容(rong),在使(shi)用時,一(yi)般要(yao)(yao)在MSR指(zhi)令(ling)(ling)中指(zhi)明將(jiang)要(yao)(yao)操(cao)作的域。只有(you)在特權模式(shi)下(xia)才可以修改狀(zhuang)態(tai)寄(ji)存器(qi)。
指令示例:
MSR CPSR,R0 ;傳送R0的(de)內(nei)容到CPSR
MSR SPSR,R0 ;傳送(song)R0的內容到SPSR
MSR CPSR_c,R0 ;傳送R0的內容(rong)到(dao)SPSR,但僅僅修改CPSR中的控制位域
ARM協處(chu)理器指令
1、CDP指令
CDP指令的格式為:
CDP{條件(jian)} 協處理器(qi)編(bian)碼,協處理器(qi)操作(zuo)碼1,目(mu)的寄(ji)存(cun)(cun)(cun)器(qi),源(yuan)寄(ji)存(cun)(cun)(cun)器(qi)1,源(yuan)寄(ji)存(cun)(cun)(cun)器(qi)2,協處理器(qi)操作(zuo)碼2。
CDP指(zhi)令(ling)用于(yu)ARM處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)通知ARM協(xie)(xie)處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)執行特定的操(cao)作,若(ruo)協(xie)(xie)處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)不能成功完成特定的操(cao)作,則產生未定義指(zhi)令(ling)異常。其中協(xie)(xie)處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)操(cao)作碼1和協(xie)(xie)處(chu)(chu)理 器(qi)(qi)(qi)(qi)(qi)操(cao)作碼2為協(xie)(xie)處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)將要執行的操(cao)作,目的寄(ji)(ji)(ji)存器(qi)(qi)(qi)(qi)(qi)和源寄(ji)(ji)(ji)存器(qi)(qi)(qi)(qi)(qi)均(jun)為協(xie)(xie)處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)的寄(ji)(ji)(ji)存器(qi)(qi)(qi)(qi)(qi),指(zhi)令(ling)不涉及ARM處(chu)(chu)理器(qi)(qi)(qi)(qi)(qi)的寄(ji)(ji)(ji)存器(qi)(qi)(qi)(qi)(qi)和存儲器(qi)(qi)(qi)(qi)(qi)。
指令示例:
CDP P3,2,C12,C10,C3,4 ;該(gai)指令完成(cheng)協處理(li)器P3的(de)初始(shi)化(hua)
2、LDC指令
LDC指令的(de)格式為:
LDC{條件(jian)}{L} 協處理器編碼,目(mu)的寄存器,[源寄存器]
LDC指令(ling)用(yong)于將源(yuan)寄存器所(suo)指向(xiang)的(de)存儲器中的(de)字數據傳(chuan)送(song)(song)到目的(de)寄存器中,若(ruo)協處理(li)器不能成功完(wan)成傳(chuan)送(song)(song)操作,則產生未定義指令(ling)異(yi)常(chang)。其(qi)中,{L}選項表(biao)示(shi)指 令(ling)為長讀取操作,如用(yong)于雙精度數據的(de)傳(chuan)輸(shu)。
指令示例:
LDC P3,C4,[R0] ;將ARM處理器(qi)(qi)(qi)(qi)的(de)寄存器(qi)(qi)(qi)(qi)R0所指向的(de)存儲器(qi)(qi)(qi)(qi)中(zhong)的(de)字(zi)數 據傳送到協處理器(qi)(qi)(qi)(qi)P3的(de)寄存器(qi)(qi)(qi)(qi)C4中(zhong)。
3、STC指令
STC指令的格(ge)式(shi)為:
STC{條(tiao)件}{L} 協處理器編(bian)碼,源寄存(cun)器,[目的寄存(cun)器]
STC指(zhi)令用于將源寄存(cun)器中(zhong)的(de)字(zi)數據傳(chuan)送到目的(de)寄存(cun)器所指(zhi)向的(de)存(cun)儲器中(zhong),若協處(chu)理器不能(neng)成功完成傳(chuan)送操(cao)作,則(ze)產生未定義指(zhi)令異常。其中(zhong),{L}選項表示指(zhi) 令為長讀取操(cao)作,如(ru)用于雙(shuang)精(jing)度數據的(de)傳(chuan)輸。
指令示例:
STC P3,C4,[R0] ;將協處理(li)(li)器(qi)(qi)P3的寄存器(qi)(qi)C4中的字數據(ju)傳送到(dao)ARM處理(li)(li) 器(qi)(qi)的寄存器(qi)(qi)R0所(suo)指向的存儲器(qi)(qi)中。
4、MCR指(zhi)令
MCR指令的格式為:
MCR{條件} 協(xie)(xie)處理(li)器(qi)(qi)(qi)(qi)(qi)編碼(ma)(ma),協(xie)(xie)處理(li)器(qi)(qi)(qi)(qi)(qi)操(cao)作(zuo)碼(ma)(ma)1,源寄(ji)存(cun)器(qi)(qi)(qi)(qi)(qi),目(mu)的寄(ji)存(cun)器(qi)(qi)(qi)(qi)(qi)1,目(mu)的寄(ji)存(cun)器(qi)(qi)(qi)(qi)(qi)2,協(xie)(xie)處理(li)器(qi)(qi)(qi)(qi)(qi)操(cao)作(zuo)碼(ma)(ma)2。
MCR指令(ling)用于將ARM處(chu)理(li)器(qi)(qi)(qi)(qi)寄(ji)存(cun)器(qi)(qi)(qi)(qi)中的(de)(de)數據(ju)傳送到協(xie)(xie)處(chu)理(li)器(qi)(qi)(qi)(qi)寄(ji)存(cun)器(qi)(qi)(qi)(qi)中,若協(xie)(xie)處(chu)理(li)器(qi)(qi)(qi)(qi)不(bu)能成功完成操(cao)作(zuo),則產(chan)生未定義指令(ling)異常。其中協(xie)(xie)處(chu)理(li)器(qi)(qi)(qi)(qi)操(cao)作(zuo)碼1和協(xie)(xie)處(chu)理(li) 器(qi)(qi)(qi)(qi)操(cao)作(zuo)碼2為(wei)(wei)協(xie)(xie)處(chu)理(li)器(qi)(qi)(qi)(qi)將要執行的(de)(de)操(cao)作(zuo),源寄(ji)存(cun)器(qi)(qi)(qi)(qi)為(wei)(wei)ARM處(chu)理(li)器(qi)(qi)(qi)(qi)的(de)(de)寄(ji)存(cun)器(qi)(qi)(qi)(qi),目的(de)(de)寄(ji)存(cun)器(qi)(qi)(qi)(qi)1和目的(de)(de)寄(ji)存(cun)器(qi)(qi)(qi)(qi)2均為(wei)(wei)協(xie)(xie)處(chu)理(li)器(qi)(qi)(qi)(qi)的(de)(de)寄(ji) 存(cun)器(qi)(qi)(qi)(qi)。
指令示例:
MCR P3,3,R0,C4,C5,6 ;將(jiang)ARM處理器(qi)(qi)寄存器(qi)(qi)R0中(zhong)的數(shu)據傳送到協(xie)處 理器(qi)(qi)P3的寄存器(qi)(qi)C4和C5中(zhong)。
5、MRC指令(ling)
MRC指令的格式為(wei):
MRC{條(tiao)件} 協處理器編碼,協處理器操(cao)作碼1,目(mu)的寄存器,源寄存器1,源寄存器2,協處理器操(cao)作碼2。
MRC指(zhi)令(ling)用于將(jiang)協處(chu)(chu)理(li)(li)器(qi)(qi)寄(ji)存(cun)器(qi)(qi)中的(de)數據傳送到ARM處(chu)(chu)理(li)(li)器(qi)(qi)寄(ji)存(cun)器(qi)(qi)中,若協處(chu)(chu)理(li)(li)器(qi)(qi)不能成功完成操作(zuo),則產生未定義指(zhi)令(ling)異常。其中協處(chu)(chu)理(li)(li)器(qi)(qi)操作(zuo)碼(ma)(ma)1和(he)協處(chu)(chu)理(li)(li) 器(qi)(qi)操作(zuo)碼(ma)(ma)2為(wei)(wei)協處(chu)(chu)理(li)(li)器(qi)(qi)將(jiang)要執(zhi)行的(de)操作(zuo),目的(de)寄(ji)存(cun)器(qi)(qi)為(wei)(wei)ARM處(chu)(chu)理(li)(li)器(qi)(qi)的(de)寄(ji)存(cun)器(qi)(qi),源寄(ji)存(cun)器(qi)(qi)1和(he)源寄(ji)存(cun)器(qi)(qi)2均(jun)為(wei)(wei)協處(chu)(chu)理(li)(li)器(qi)(qi)的(de)寄(ji)存(cun)器(qi)(qi)。
指令示例:
MRC P3,3,R0,C4,C5,6 ;該指(zhi)令將協(xie)處理器(qi)P3的(de)寄存(cun)器(qi)中(zhong)的(de)數據(ju)傳送到(dao) ARM處理器(qi)寄存(cun)器(qi)中(zhong)。
ARM偽指令
ARM偽(wei)(wei)指(zhi)令(ling)(ling)(ling)不是ARM指(zhi)令(ling)(ling)(ling)集中的指(zhi)令(ling)(ling)(ling),只是為了(le)編(bian)程(cheng)方(fang)便編(bian)譯(yi)器定義了(le)偽(wei)(wei)指(zhi)令(ling)(ling)(ling),使(shi)用時可以像其他ARM指(zhi)令(ling)(ling)(ling)一(yi)樣使(shi)用,但在(zai)編(bian)譯(yi)時這些偽(wei)(wei)指(zhi)令(ling)(ling)(ling)將被等(deng)效的ARM指(zhi)令(ling)(ling)(ling)代(dai)替。
1、符號定義偽指令
A、全局變量定義(yi)
GBLA(GBLL/GBLS) 全局變量名
GBLA 、GBLL 和GBLS 偽指(zhi)令用(yong)于定義(yi)一個ARM 程序中的全局變量,并(bing)將其初始化。其中:
GBLA 偽指(zhi)令用于定義一個(ge)全局的數字變(bian)量(liang),并初始化為0 ;
GBLL 偽指令用(yong)于定義一(yi)個全局的(de)邏輯變(bian)量(liang),并(bing)初始化(hua)為(wei)F(假);
GBLS 偽指(zhi)令(ling)用于(yu)定義(yi)一個全局的字符串變量,并初(chu)始化(hua)為空;
由于以上三條偽(wei)指令(ling)用于定(ding)義全局(ju)變(bian)量,因此在整個程序范圍內(nei)變(bian)量名(ming)必須唯(wei)一。
B、局部變量定義
LCLA (LCLL 或(huo) LCLS )局部變(bian)量名(ming)
LCLA 、LCLL 和(he)LCLS 偽指令(ling)用于定義一個(ge)ARM 程(cheng)序(xu)中的局部(bu)變量,并將其初始化。其中:
LCLA偽指令(ling)用于定義(yi)一個(ge)局(ju)部(bu)的數字變量,并(bing)初(chu)始(shi)化為0 ;
LCLL偽指令用于(yu)定義(yi)一(yi)個局部的邏(luo)輯變量,并初始(shi)化為F(假);
LCLS偽指(zhi)令用于定義一(yi)個局部的字符串(chuan)變量(liang),并初始化為空;
以上三(san)條(tiao)偽指令用(yong)于聲明局部變量,在(zai)其作用(yong)范(fan)圍內變量名必須唯一。
C、變量(liang)的賦值(zhi)
變量名 SETA (SETL 或 SETS )表達式
偽指令 SETA 、SETL 、SETS 用于給(gei)一個(ge)已經(jing)定義的全局(ju)變量或(huo)局(ju)部變量賦(fu)值(zhi)。
SETA偽(wei)指(zhi)令用于給一個數(shu)學(xue)變(bian)量(liang)賦值;
SETL偽指(zhi)令用于給一個邏輯變(bian)量賦值;
SETS偽指令用于給一個字符串變量賦值;
其中,變(bian)量名為已經定義過的全局變(bian)量或局部變(bian)量,表達式為將要賦給變(bian)量的值。
D、RLIST
名稱 RLIST { 寄(ji)存器列表 }
RLIST偽指令(ling)可(ke)用(yong)于對一個通(tong)用(yong)寄存(cun)器(qi)列表定義(yi)名(ming)稱,使用(yong)該偽指令(ling)定義(yi)的(de)名(ming)稱可(ke)在(zai)ARM 指令(ling) LDM/STM中使用(yong)。在(zai)LDM/STM指令(ling)中,列表中的(de)寄存(cun)器(qi)訪問次序(xu)為根據寄存(cun)器(qi)的(de)編號由低到高(gao),而與列表中的(de)寄存(cun)器(qi)排列次序(xu)無關。
RegList RLIST {R0-R5,R8,R10} 將寄存器列(lie)表名(ming)稱定義為 RegList ,可在ARM指令LDM/STM中通(tong)過該(gai)名(ming)稱訪問寄存器列(lie)表。
2、數據定義偽指令
數據(ju)定義偽指令一(yi)般用(yong)于為特定的(de)數據(ju)分配存儲單元,同時可完成已分配存儲單元的(de)初始化。
常見(jian)的數據定義偽指令有(you)如(ru)下幾種:
DCB 用(yong)于分(fen)配一片連續的(de)字節存儲單元并用(yong)指定的(de)數據初始化(hua)。
DCW(DCWU)用(yong)于分配(pei)一片連(lian)續的(de)半字存儲單元并(bing)用(yong)指定的(de)數據初始(shi)化。
DCD (DCDU)用于分(fen)配一(yi)片(pian)連(lian)續(xu)的字存儲(chu)單元并用指(zhi)定(ding)的數據初始化。
DCFD(DCFDU)用于為雙精度(du)的浮點數分配一片連續的字存儲(chu)單元并用指定的數據初始化。
DCFS(DCFSU)用于為單精度(du)的浮點(dian)數分配(pei)一(yi)片連續的字存儲單元并用指定的數據初始化。
DCQ(DCQU)用(yong)于分配一(yi)片以(yi)8字(zi)節為單(dan)位的連續的存儲(chu)單(dan)元并用(yong)指定(ding)的數據初(chu)始(shi)化。
SPACE 用于分配一片連續的存儲(chu)單元(yuan)。
MAP 用于定義一個結構(gou)化的(de)內存表首(shou)地址。
FIELD 用于定義一個(ge)結構化(hua)的內(nei)存(cun)表的數(shu)據域。
A、DCB
語法格式:
標號 DCB 表達式
DCB偽指令(ling)用于分配一片連續(xu)的(de)字(zi)節存儲單元并(bing)用偽指令(ling)中(zhong)指定的(de)表達式初始化。其中(zhong),表達式可(ke)以(yi)為0~255的(de)數(shu)字(zi)或字(zi)符串。DCB 也可(ke)用“=”代替。
使用示例:
Str DCB “This is a test” ;分配一片連續的字節存儲(chu)單元(yuan)并(bing)初始化。
B、DCW(或(huo)DCWU)
語法格式:
標號 DCW (或DCWU) 表達式
DCW(或DCWU)偽指(zhi)(zhi)令用于分(fen)配(pei)一(yi)片連續的(de)半(ban)字存(cun)儲單元并用偽指(zhi)(zhi)令中(zhong)指(zhi)(zhi)定的(de)表(biao)達式初始(shi)化。
其中,表(biao)達式(shi)可以為程序標號或數字表(biao)達式(shi)。
用DCW分配的字(zi)(zi)存儲單元(yuan)是半字(zi)(zi)對齊的,而用DCWU分配的字(zi)(zi)存儲單元(yuan)并(bing)不嚴格半字(zi)(zi)對齊。
使用示例:
DataTest DCW 1 ,2 ,3 ;分配一片連續的半字(zi)存儲(chu)單(dan)元(yuan)并初(chu)始化。
C、DCD(或DCDU)
語法格式:
標號 DCD(或DCDU) 表達式(shi)
DCD(或DCDU)偽指令用于分配一片(pian)連續的字存儲單元并(bing)用偽指令中(zhong)指定的表(biao)達式(shi)初(chu)始化。其中(zhong),表(biao)達式(shi)可以為程(cheng)序標號或數(shu)字表(biao)達式(shi)。DCD也可 用"&” 代替。
用DCD分(fen)配的(de)字(zi)存(cun)儲單元是字(zi)對(dui)齊的(de),而用DCDU分(fen)配的(de)字(zi)存(cun)儲單元并不嚴格字(zi)對(dui)齊。
使用示例:
DataTest DCD 4 ,5 ,6 ;分配一片連(lian)續的字存儲單元并初始化(hua)。
D、DCFD(或DCFDU)
語法格式:
標(biao)號 DCFD(或(huo)DCFDU) 表達式
DCFD(或DCFDU)偽指(zhi)令用(yong)于為雙精(jing)度的(de)浮點數分配(pei)一片連續(xu)的(de)字(zi)存(cun)(cun)儲(chu)(chu)單(dan)元(yuan)并用(yong)偽指(zhi)令中指(zhi)定的(de)表達式初始化。每個雙精(jing)度的(de)浮點數占據兩個字(zi)單(dan)元(yuan)。用(yong) DCFD分配(pei)的(de)字(zi)存(cun)(cun)儲(chu)(chu)單(dan)元(yuan)是字(zi)對齊的(de),而用(yong)DCFDU分配(pei)的(de)字(zi)存(cun)(cun)儲(chu)(chu)單(dan)元(yuan)并不嚴格(ge)字(zi)對齊。
使用示例: FDataTest DCFD 2E115 ,-5E7 ;分配一片連續的(de)字存儲單元并(bing)初始化 為指定(ding)的(de)雙精度(du)數(shu)。
E、DCFS(或DCFSU)
語法格式:
標號 DCFS(或(huo)DCFSU) 表達式
DCFS(或(huo)DCFSU)偽指令用于為單(dan)(dan)精(jing)度的(de)(de)浮點數分配一(yi)片連續的(de)(de)字(zi)存(cun)(cun)儲單(dan)(dan)元并(bing)用偽指令中(zhong)指定的(de)(de)表達式初始化。每個單(dan)(dan)精(jing)度的(de)(de)浮點數占據一(yi)個字(zi)單(dan)(dan)元。用 DCFS分配的(de)(de)字(zi)存(cun)(cun)儲單(dan)(dan)元是字(zi)對(dui)(dui)齊(qi)的(de)(de),而用DCFSU分配的(de)(de)字(zi)存(cun)(cun)儲單(dan)(dan)元并(bing)不嚴格(ge)字(zi)對(dui)(dui)齊(qi)。
使用示例:
FDataTest DCFS 2E5 ,-5E -7 ;分配一(yi)片(pian)連續的字存儲單元并(bing)初始化為 指定的單精度數。
F、DCQ(或DCQU)
語法格式:
標號 DCQ(或DCQU) 表達(da)式
DCQ(或(huo)DCQU)偽指(zhi)令(ling)用(yong)于分配一(yi)片以8個(ge)字節(雙字)為單(dan)位的(de)連續存儲區域并用(yong)偽指(zhi)令(ling)中指(zhi)定(ding)的(de)表(biao)達式(shi) 初始化(hua)。 用(yong)DCQ分配的(de)存儲單(dan)元(yuan)是字對(dui)齊(qi)(qi)的(de),而用(yong)DCQU 分配的(de)存儲單(dan)元(yuan)并不嚴格字對(dui)齊(qi)(qi)。
使用示例:
DataTest DCQ 100 ;分配一片連續的(de)存儲單元并(bing)初始化為指定的(de)值(zhi)。
G、SPACE
語法格式:
標(biao)號 SPACE 表達(da)式(shi)
SPACE偽指令用于分配一片連續的存(cun)儲(chu)區域并初始化(hua)為(wei)0 。其中,表(biao)達(da)式為(wei)要分配的字節數。
SPACE也(ye)可用“ % ”代替(ti)。
使用示例:
DataSpace SPACE 100 ;分(fen)配連(lian)續100字節的(de)存儲單(dan)元并初(chu)始化為0 。
H、MAP
語法格式:
MAP 表(biao)達式 { ,基址寄存器 }
MAP偽指令用于定義(yi)一個結構化的(de)(de)內(nei)存表的(de)(de)首地址。MAP也可用“^” 代替。
表(biao)達式可以(yi)為(wei)程(cheng)序(xu)中的標號或數學表(biao)達式,基址寄存(cun)(cun)器(qi)為(wei)可選項,當(dang)(dang)基址寄存(cun)(cun)器(qi)選項不存(cun)(cun)在(zai)時,表(biao)達式的值即為(wei)內存(cun)(cun)表(biao)的首地址,當(dang)(dang)該(gai)選項存(cun)(cun)在(zai)時,內存(cun)(cun)表(biao)的首地址 為(wei)表(biao)達式的值與基址寄存(cun)(cun)器(qi)的和。
MAP偽(wei)指令通常與FIELD偽(wei)指令配合使用(yong)來(lai)定義結構(gou)化的內存表。
使用示例:
MAP 0x100 ,R0 ;定義結構化(hua)內存表首(shou)地址的值(zhi)為(wei)0x100+R0 。
I、FILED
語法格式:
標號 FIELD 表達式
FIELD偽(wei)指(zhi)令(ling)用于定義一個結構化內存(cun)表(biao)中的數據域。FILED 也可(ke)用“#” 代(dai)替。
表達式的值為當前數據域在(zai)內(nei)存(cun)表中所(suo)占的字節數。
FIELD偽(wei)指令常(chang)與MAP偽(wei)指令配合使用來定義結(jie)構(gou)化的內(nei)存(cun)表。MAP偽(wei)指令定義內(nei)存(cun)表的首地址,FIELD偽(wei)指令定義內(nei)存(cun)表中的各個數(shu)據域(yu),并可以為 每個數(shu)據域(yu)指定一個標號(hao)供其他的指令引用。
注(zhu)意(yi)MAP和FIELD偽(wei)指(zhi)令僅用(yong)于定義數(shu)據結(jie)構,并不實際分配存儲單(dan)元。
使用示例:
MAP 0x100 ; 定義結構化內(nei)存表首地址的(de)值為0x100。
A FIELD 16 ; 定義(yi)A的長度為16字節,位(wei)置為0x100。
B FIELD 32 ; 定義B的長度為32字(zi)節,位置為0x110。
S FIELD 256 ;定義S的長(chang)度為(wei)(wei)256字節,位置為(wei)(wei)0x130。
3、匯編控制偽指(zhi)令
匯編控制(zhi)偽(wei)指令用于控制(zhi)匯編程序的執(zhi)行流程,常用的匯編控制(zhi)偽(wei)指令包括(kuo)以下幾條:
IF 、ELSE 、ENDIF
WHILE 、WEND
MACRO 、MEND、MEXIT
A、IF、ELSE、ENDIF
語法格式:
IF 邏輯表(biao)達式
指令序列 1
ELSE
指令序列 2
ENDIF
IF 、ELSE 、ENDIF偽指(zhi)令(ling)能根據條件的(de)成(cheng)立與(yu)否(fou)(fou)決定是否(fou)(fou)執(zhi)(zhi)行(xing)某個指(zhi)令(ling)序(xu)列。當IF后面(mian)(mian)的(de)邏輯(ji)表(biao)(biao)達式(shi)為真,則(ze)執(zhi)(zhi)行(xing)指(zhi)令(ling)序(xu)列1 ,否(fou)(fou)則(ze)執(zhi)(zhi)行(xing)指(zhi)令(ling)序(xu) 列2 。其中,ELSE及指(zhi)令(ling)序(xu)列2可以沒有,此時,當IF后面(mian)(mian)的(de)邏輯(ji)表(biao)(biao)達式(shi)為真,則(ze)執(zhi)(zhi)行(xing)指(zhi)令(ling)序(xu)列1 ,否(fou)(fou)則(ze)繼續執(zhi)(zhi)行(xing)后面(mian)(mian)的(de)指(zhi)令(ling)。
IF 、ELSE 、ENDIF偽(wei)指令(ling)可(ke)以(yi)嵌(qian)套使用。
使用示例:
GBLL Test ;聲明一個全局的邏(luo)輯變(bian)量,變(bian)量名為Test
IF Test = TRUE
指令序列 1
ELSE
指令序列 2
ENDIF
B、WHILE、WEND
語法格式:
WHILE 邏輯表達式
指令序列
WEND
WHILE 、WEND偽指(zhi)令(ling)(ling)能根據條件的(de)成立與否(fou)決定是否(fou)循環執(zhi)行某個(ge)指(zhi)令(ling)(ling)序列。當WHILE后(hou)面的(de)邏輯表(biao)達式為真,則執(zhi)行指(zhi)令(ling)(ling)序列,該(gai)指(zhi)令(ling)(ling)序列執(zhi)行完畢后(hou),再判斷 邏輯表(biao)達式的(de)值,若為真則繼續執(zhi)行,一(yi)直到邏輯表(biao)達式的(de)值為假。
WHILE 、WEND偽指(zhi)令(ling)可以嵌(qian)套使用(yong)。
使用示例:
GBLA Counter ; 聲明一個全局的(de)數學變量,變量名為Counter
Counter SETA 3 ;由變量Counter 控制循環次數
……
WHILE Counter < 10
指令序列
WEND
C、MACRO、MEND、MEXIT
語法格式:
MACRO
[$ 標號(hao)]宏名(ming)[$ 參數(shu)(shu) 1 ,$ 參數(shu)(shu) 2 ,……]
語句段
MEXIT
D、MEXIT
語法格式:
MEXIT
MEXIT用于(yu)從宏定(ding)義中(zhong)跳(tiao)轉出去(qu)。
4、其他(ta)偽指令(ling)
A、AREA
語法格式:
AREA 段名 屬性(xing)1 ,屬性(xing)2 ,……
AREA偽指令用于定義一個代碼段或數(shu)據段。其(qi)中,段名若以(yi)數(shu)字開頭,則該段名需用“|”括(kuo)起來(lai),如:|1_test| 。
屬性(xing)字(zi)段表示該代(dai)碼段(或數據段)的(de)相關(guan)屬性(xing),多個屬性(xing)用逗號(hao)分隔。常用的(de)屬性(xing)如下:
— CODE 屬性:用于定義代碼段,默(mo)認為READONLY 。
— DATA 屬性:用(yong)于定義數據段,默認為READWRITE 。
— READONLY 屬性:指定(ding)本段為只讀,代碼段默認(ren)為READONLY 。
— READWRITE 屬性:指定(ding)本段為可讀可寫,數據段的默(mo)認(ren)屬性為READWRITE 。
— ALIGN 屬性(xing):使用(yong)方式(shi)為ALIGN表(biao)達(da)(da)式(shi)。在(zai)默認時,ELF(可執行連接文件)的(de)代碼段(duan)和數據段(duan)是按(an)字對齊的(de),表(biao)達(da)(da)式(shi)的(de)取值范(fan)圍為0~31,相應的(de)對齊方式(shi)為2 表(biao)達(da)(da)式(shi)次方。
— COMMON 屬性:該屬性定義一個通(tong)用(yong)的段,不包含任何的用(yong)戶代碼和數據。各源文(wen)件中(zhong)同名的COMMON段共享同一段存儲單元。
一個(ge)匯編語言(yan)程(cheng)序(xu)至(zhi)少要包含(han)一個(ge)段,當程(cheng)序(xu)太長時,也可以將程(cheng)序(xu)分為(wei)多個(ge)代碼段和數據段。
使用示例:
AREA Init ,CODE ,READONLY ; 該偽指令定義了(le)一個代碼段,段 名為Init ,屬(shu)性為只讀。
B、ALIGN
語法格式:
ALIGN { 表達式(shi) { ,偏移(yi)量 }}
ALIGN偽指(zhi)令可(ke)通過添加填充(chong)字(zi)節的方(fang)式,使當(dang)前位(wei)置滿(man)足一定(ding)的對(dui)齊方(fang)式。其(qi)中(zhong),表(biao)達(da)式的值用于指(zhi)定(ding)對(dui)齊方(fang)式,可(ke)能(neng)的取值為2的冪,如1 、2 、4 、8 、16 等。若未指(zhi)定(ding)表(biao)達(da)式,則將當(dang)前位(wei)置對(dui)齊到下一個字(zi)的位(wei)置。偏(pian)移量也為一個數字(zi)表(biao)達(da)式,若使用該字(zi)段,則當(dang)前位(wei)置的對(dui)齊方(fang)式為:2的表(biao)達(da) 式次冪+偏(pian)移 量。
使用示例:
AREA Init ,CODE ,READONLY ,ALIEN=3 ;指定后面的(de)指令為(wei)8 字(zi)節(jie)對(dui)齊。
指令序列
END
C、CODE16、CODE32
語法格式:
CODE16(或CODE32)
CODE16偽指令通知編譯(yi)器(qi),其后的(de)指令序列為(wei)16位的(de)Thumb指令。
CODE32偽指令通知編譯器,其后的指令序列(lie)為32位的ARM指令。
若(ruo) 在(zai)匯編(bian)源程序(xu)中同(tong)時(shi)包(bao)含ARM指(zhi)(zhi)令(ling)(ling)(ling)和Thumb指(zhi)(zhi)令(ling)(ling)(ling)時(shi),可(ke)用CODE16偽(wei)指(zhi)(zhi)令(ling)(ling)(ling)通知(zhi)編(bian)譯器(qi)其后(hou)的(de)(de)指(zhi)(zhi)令(ling)(ling)(ling)序(xu)列(lie)為(wei)16位的(de)(de)Thumb指(zhi)(zhi)令(ling)(ling)(ling),CODE32偽(wei)指(zhi)(zhi) 令(ling)(ling)(ling) 通知(zhi)編(bian)譯器(qi)其后(hou)的(de)(de)指(zhi)(zhi)令(ling)(ling)(ling)序(xu)列(lie)為(wei)32位的(de)(de)ARM指(zhi)(zhi)令(ling)(ling)(ling)。因此,在(zai)使(shi)用ARM指(zhi)(zhi)令(ling)(ling)(ling)和Thumb指(zhi)(zhi)令(ling)(ling)(ling)混合編(bian)程的(de)(de)代碼(ma)里,可(ke)用這兩條(tiao)偽(wei)指(zhi)(zhi)令(ling)(ling)(ling)進(jin)行(xing)(xing)切(qie)換(huan)(huan),但(dan)注意他們只 通知(zhi) 編(bian)譯器(qi)其后(hou)指(zhi)(zhi)令(ling)(ling)(ling)的(de)(de)類型,并不能對(dui)處理器(qi)進(jin)行(xing)(xing)狀態的(de)(de)切(qie)換(huan)(huan)。
使用示例:
AREA Init ,CODE ,READONLY ……
CODE32 ; 通知編譯器其后的(de)指(zhi)令為32位的(de) ARM指(zhi)令
LDR R0 ,=NEXT+1 ;將跳轉地址放入寄存器R0
BX R0 ; 程序跳轉到(dao)(dao)新(xin)的位(wei)置執行, 并(bing)將處理器切換到(dao)(dao)Thumb工作(zuo)狀態
……
CODE16 ; 通知編譯器其后(hou)的指(zhi)令(ling)為(wei)16位的 Thumb指(zhi)令(ling)
NEXT LDR R3,=0x3FF
……
END ;
D、ENTRY
語法格式:
ENTRY
ENTRY偽指令用于(yu)指定匯(hui)編(bian)程(cheng)序(xu)的(de)入口點。在(zai)一(yi)個(ge)完(wan)整的(de)匯(hui)編(bian)程(cheng)序(xu)中至少要(yao)有一(yi)個(ge)ENTRY(也可以有多(duo)個(ge),當有多(duo)個(ge)ENTRY時,程(cheng)序(xu)的(de)真(zhen)正入口點由鏈(lian) 接器指定),但(dan)在(zai)一(yi)個(ge)源(yuan)文件里最多(duo)只能有一(yi)個(ge)ENTRY(可以沒有)。
使用示例:
AREA Init ,CODE ,READONLY
ENTRY ; 指定應用程序的入口(kou)點
……
E、END
語法格式:
END
END偽指(zhi)令用于通知編(bian)譯器(qi)已經(jing)到了源程序的結尾。
使用示例:
AREA Init ,CODE ,READONLY
……
END ;指定(ding)應(ying)用(yong)程序的結尾
F、EQU
語法格式:
名稱 EQU 表(biao)達(da)式 { ,類型 }
EQU偽(wei)(wei)指令(ling)用于為(wei)程序中的(de)常量(liang)、標號等(deng)定義一個等(deng)效的(de)字(zi)符名稱,類(lei)似于C語言中的(de)#define 。其中EQU可(ke)用“*”代替。名稱為(wei)EQU偽(wei)(wei)指令(ling)定義的(de)字(zi)符名稱,當表(biao)(biao)達式為(wei)32位的(de)常量(liang)時,可(ke)以(yi)指定 表(biao)(biao)達式的(de)數(shu)據類(lei)型,可(ke)以(yi)有以(yi)下三種類(lei)型:
CODE16 、CODE32 和DATA
使用示例:
Test EQU 50 ; 定義標號(hao)Test 的值(zhi)為50。
Addr EQU 0x55 ,CODE32 ; 定(ding)義Addr的值為0x55 ,且該處為32位的ARM指(zhi)令(ling)。
G、EXPORT(或GLOBAL)
語法格式:
EXPORT 標號(hao) {[WEAK]}
EXPORT偽指(zhi)令(ling)用(yong)于在(zai)程序中(zhong)(zhong)聲(sheng)(sheng)明一個(ge)全局的(de)標號(hao)(hao),該標號(hao)(hao)可(ke)在(zai)其他的(de)文件中(zhong)(zhong)引(yin)用(yong)。EXPORT 可(ke)用(yong)GLOBAL代替。標號(hao)(hao)在(zai)程序中(zhong)(zhong)區(qu)分大(da)小寫,[WEAK] 選項聲(sheng)(sheng)明其他的(de)同名標號(hao)(hao)優先于該標號(hao)(hao)被引(yin)用(yong)。
使用示例:
AREA Init ,CODE ,READONLY
EXPORT Stest ;聲明一個可全(quan)局引用(yong)的標(biao)號Stest
END
H、IMPORT
語法格式:
IMPORT 標號(hao) {[WEAK]}
IMPORT偽指(zhi)令(ling)用于通知編譯(yi)器(qi)要使(shi)用的標(biao)(biao)號(hao)(hao)在(zai)其他的源文件(jian)(jian)(jian)中(zhong)定義,但要在(zai)當前(qian)源文件(jian)(jian)(jian)中(zhong)引(yin)用,而且無(wu)論當前(qian)源文件(jian)(jian)(jian)是否引(yin)用該(gai)標(biao)(biao)號(hao)(hao),該(gai)標(biao)(biao)號(hao)(hao)均會被加入(ru)到當 前(qian)源文件(jian)(jian)(jian)的符號(hao)(hao)表(biao)中(zhong)。標(biao)(biao) 號(hao)(hao)在(zai)程序中(zhong)區(qu)分大小寫,[WEAK] 選項表(biao)示當所有的源文件(jian)(jian)(jian)都沒有定義這樣一(yi)個標(biao)(biao)號(hao)(hao)時,編譯(yi)器(qi)也不給出錯誤信息,在(zai)多數情況下 將該(gai)標(biao)(biao)號(hao)(hao)置為0 ,若該(gai)標(biao)(biao)號(hao)(hao)為B或(huo)BL指(zhi)令(ling)引(yin)用,則將B或(huo)BL指(zhi)令(ling)置為NOP操作。
使用示例:
AREA Init ,CODE ,READONLY
IMPORT Main ;通知編譯(yi)器當前文(wen)件(jian)要引(yin)用標(biao)號Main,但Main在其他源(yuan)文(wen)件(jian)中定(ding) 義。
END
I、EXTERN
語法格式:
EXTERN 標號 {[WEAK]}
EXTERN偽指令用(yong)于通知編(bian)譯器要使用(yong)的標(biao)(biao)號(hao)(hao)(hao)在其他(ta)的源(yuan)文(wen)(wen)(wen)件(jian)中定義,但要在當前(qian)源(yuan)文(wen)(wen)(wen)件(jian)中引(yin)用(yong),如果(guo)當前(qian)源(yuan)文(wen)(wen)(wen)件(jian)實際并未引(yin)用(yong)該(gai)標(biao)(biao)號(hao)(hao)(hao),該(gai) 標(biao)(biao)號(hao)(hao)(hao)就不(bu)會被加入 到當前(qian)源(yuan)文(wen)(wen)(wen)件(jian)的符號(hao)(hao)(hao)表(biao)中。標(biao)(biao)號(hao)(hao)(hao)在程序(xu)中區分大小寫, [WEAK] 選項表(biao)示當所有的源(yuan)文(wen)(wen)(wen)件(jian)都(dou)沒有定義這(zhe)樣一個標(biao)(biao)號(hao)(hao)(hao)時,編(bian)譯器也(ye)不(bu)給出錯誤信息,在多數情 況下將該(gai)標(biao)(biao)號(hao)(hao)(hao)置(zhi)為0 ,若該(gai)標(biao)(biao)號(hao)(hao)(hao)為B或BL指令引(yin)用(yong),則將B或BL指令置(zhi)為NOP操作。
使用示例:
AREA Init ,CODE ,READONLY
EXTERN Main ;通知編譯器當前文件(jian)要引用標號Main,但(dan)Main在其他源文件(jian)中(zhong)定 義(yi)。
END
J、GET(或INCLUDE)
語法格式:
GET 文件名
GET偽指(zhi)令用于將一個源(yuan)文(wen)件包含(han)到(dao)當(dang)前(qian)的源(yuan)文(wen)件中,并(bing)將被包含(han)的源(yuan)文(wen)件在當(dang)前(qian)位置進行匯(hui)編處理。可 以使用INCLUDE代替GET。
匯編程序(xu)中常(chang)(chang)用(yong)的(de)方法是在某(mou)源文件(jian)(jian)中定義一(yi)些宏指令(ling),用(yong)EQU定義常(chang)(chang)量的(de)符號(hao)名稱(cheng),用(yong)MAP和FIELD定義結(jie)構化的(de)數據類型(xing),然后用(yong)GET偽指令(ling)將這個 源文件(jian)(jian)包含(han)到(dao)其他的(de)源文件(jian)(jian)中。使(shi)用(yong)方法與C 語(yu)言中的(de)"include” 相似。
GET偽指(zhi)令(ling)只能用于包含源文件,包含目標(biao)文件需要使(shi)用INCBIN偽指(zhi)令(ling)
使用示例:
AREA Init ,CODE ,READONLY
GET a1.s ; 通知編譯器(qi)當前(qian)源文(wen)件(jian)包含源文(wen)件(jian)a1.s
GET C:\a2.s ; 通知編譯器當前源文件(jian)包含源文件(jian)C:\a2.s
END
K、INCBIN
語法格式:
INCBIN 文件名
INCBIN偽(wei)指令(ling)用于將(jiang)一個(ge)目標文件(jian)或(huo)數據文件(jian)包含(han)到(dao)當前(qian)的源文件(jian)中(zhong),被包含(han)的文件(jian)不(bu)作任何變動(dong)的存放在(zai)當前(qian)文件(jian)中(zhong),編譯(yi)器從其后(hou)開始繼續處理(li)。
使用示例:
AREA Init ,CODE ,READONLY
INCBIN a1.dat ; 通知(zhi)編譯器當前源(yuan)文件包含(han)文件a1.dat
INCBIN C:\a2.txt ;通知(zhi)編(bian)譯器當前源文(wen)件包含文(wen)件C:\a2.txt
END
L、RN
語法格式:
名稱 RN 表達式
RN偽指令用于給一個(ge)寄(ji)(ji)存(cun)(cun)器(qi)定義(yi)一個(ge)別名。采(cai)用這(zhe)種方(fang)式(shi)可(ke)以方(fang)便程序(xu)員記(ji)憶該寄(ji)(ji)存(cun)(cun)器(qi)的功能。其(qi)中,名稱為給寄(ji)(ji)存(cun)(cun)器(qi)定義(yi)的別名,表達式(shi)為寄(ji)(ji)存(cun)(cun)器(qi)的編碼。
使用示例:
Temp RN R0 ;將R0定義一個(ge)別名(ming)Temp
M、ROUT
語法格式:
{名(ming)稱} ROUT
ROUT偽指(zhi)令用于(yu)給一個(ge)局部變(bian)(bian)量(liang)定義作(zuo)用范圍。在(zai)程序中未(wei)使用該(gai)偽指(zhi)令時,局部 變(bian)(bian)量(liang)的作(zuo)用范圍為(wei)所(suo)在(zai)的AREA,而使用ROUT后,局部變(bian)(bian)量(liang)的作(zuo)為(wei)范圍為(wei)當前ROUT和下(xia)一個(ge)ROUT之間。
嵌(qian)入式arm匯編(bian)指令這(zhe)是(shi)(shi)最全的(de)了,都記住了嗎?記不住也沒事,收藏起來可以備以后來使用,但是(shi)(shi)必須要(yao)理解才行。

