一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

常用ARM指令及匯編【一】

 Runs丶SS11 2014-07-25

常用ARM指令及匯編包括

1、ARM處理器尋址方式
2、指令集介紹
3、偽指令
4、ARM匯編程序設(shè)計(jì)
5、C與匯編混合編程

ARM處理器尋址方式

1、寄存器尋址:操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值操作
MOV  R1, R2       ;R2->R1
SUB  R0, R1,R2    ;R1-R2 -> R0

2、立即尋址:立即尋址指令中的操作碼字段后面的地址碼部分就是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令就取出了可以立即使用的操作數(shù)
SUBS R0,R0,#1      ;R0-1 -> R0
MOV  R0,#0xff00    ;0xff00 -> R0
注:立即數(shù)要以"#"為前綴,表示16進(jìn)制數(shù)值時(shí)以"0x"表示

3、寄存器偏移尋址:是ARM指令集特有的尋址方式,當(dāng)?shù)?操作數(shù)是寄存器偏移方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前選擇進(jìn)行移位操作
MOV  R0,R2,LSL #3       ;R2的值左移3位,結(jié)果存入R0,即R0 = R2 * 8
ANDS R1,R1,R2,LSL R3   ;R2的值左移R3位,然后和R1相與操作,結(jié)果放入R1

寄存器偏移尋址可采用的移位操作如下
(1)、LSL(Logical Shift Left)邏輯左移,寄存器中字的低端空出補(bǔ)0
(2)、LSR(Logical Shift Right)邏輯右移,寄存器中字的高端空出補(bǔ)0
(3)、ASR(Arthmetic Shift Right)算術(shù)右移,移位中保持符號(hào)位不變,即如果源操作數(shù)為正數(shù),字高端空出補(bǔ)0,否則補(bǔ)1
(4)、ROR(Rotate Right)循環(huán)右移,由字的低端移出的位填入高端空出的位
(5)、RRX(Rotate Right eXtended by 1 place),操作數(shù)右移一位,左側(cè)空位由CPSR的C填充

4、寄存器間接尋址:寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需要的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針
LDR R1,[R2]    ;將R2中的數(shù)值作為地址,取出此地址中的數(shù)據(jù)保存在R1中
SWP R1,R1,[R2] ;將R2中的數(shù)值作為地址,取出此地址中的數(shù)值與R1中的值交換

5、基址尋址:將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址,基址尋址用于訪問基址附近的存儲(chǔ)單元,常用于查表,數(shù)組操作,功能部件寄存器訪問等。
LDR R2,[R3,#0x0F]    ;將R3的數(shù)值加0x0F作為地址,取出此地址的數(shù)值保存在R2中
STR R1,[R0,#-2]      ;將R0中的數(shù)值減2作為地址,把R1中的內(nèi)容保存到此地址位置
 
6、多寄存器尋址:一次可以傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器
LDMIA R1!,{R2-R7,R12}  ;將R1所指向的地址的數(shù)據(jù)讀出到R2-R7,R12,R1自動(dòng)更新
STMIA R0!,{R3-R6,R10}  ;將R3-R6,R10中的數(shù)值保存到R0指向的地址,R0自動(dòng)更新

7、堆棧尋址:堆棧是特定順序進(jìn)行存取的存儲(chǔ)區(qū),堆棧尋址時(shí)隱含的使用一個(gè)專門的寄存器(堆棧指針),指向一塊存儲(chǔ)區(qū)域(堆棧),存儲(chǔ)器堆??煞譃閮煞N:
向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧
向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧
如此可結(jié)合出四中情況:
1、滿遞增:堆棧通過增大存儲(chǔ)器的地址向上增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址,指令如 LDMFA,STMFA
2、空遞增:堆棧通過增大存儲(chǔ)器的地址向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空位置,指令如 LDMEA,STMEA
3、滿遞減:堆棧通過減小存儲(chǔ)器的地址向下增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址,指令如 LDMFD,STMFD
4、空遞減:堆棧通過減小存儲(chǔ)器的地址向下增長(zhǎng),堆棧指針指向堆棧下的第一個(gè)空位置,指令如 LDMED,STMED
STMFD SP!,{R1-R7,LR}  ;將R1-R7,LR入棧,滿遞減堆棧
LDMFD SP!,{R1-R7,LR}  ;數(shù)據(jù)出棧,放入R1-R7,LR寄存器,滿遞減堆棧

8、塊拷貝尋址:多寄存器傳送指令用于一塊數(shù)據(jù)從存儲(chǔ)器的某一位置拷貝到另一位置
STMIA R0!,{R1-R7}     ;將R1-R7的數(shù)據(jù)保存到存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之后增加,方向?yàn)橄蛏显鲩L(zhǎng)
STMIB R0!,{R1-R7}     ;將R1-R7的數(shù)據(jù)保存到存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之前增加,方向?yàn)橄蛏显鲩L(zhǎng)
SIMDA R0!,{R1-R7}     ;將R1-R7的數(shù)據(jù)保存到存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之后增加,方向?yàn)橄蛳略鲩L(zhǎng)
STMDB R0!,{R1-R7}     ;將R1-R7的數(shù)據(jù)保存到存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之前增加,方向?yàn)橄蛳略鲩L(zhǎng)
不論是向上還是向下遞增,存儲(chǔ)時(shí)高編號(hào)的寄存器放在高地址的內(nèi)存,出來時(shí),高地址的內(nèi)容給編號(hào)高的寄存器

9、相對(duì)尋址:是基址尋址的一種變通,由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址
BL ROUTE1    ;調(diào)用到 ROUTE1 子程序
BEQ LOOP     ;條件跳轉(zhuǎn)到 LOOP 標(biāo)號(hào)處
 

================================================================================================================

指令集介紹

指令格式:<opcode> {<cond>}{S}<Rd>,<Rn>,{<operand2>}
其中<>內(nèi)的項(xiàng)是必須的,{}內(nèi)的項(xiàng)是可選的
opcode   指令助記符,如 LDR,STR等
cond     執(zhí)行條件,如 EQ,NE等
S        是否影響CPSR寄存器的值,書寫時(shí)影響CPSR,否則不影響
Rd       目標(biāo)寄存器
Rn       第一個(gè)操作數(shù)的寄存器
operand2 第二個(gè)操作數(shù)

指令格式舉例如下:
LDR R0,[R1]       ;讀取R1地址上的存儲(chǔ)器單元內(nèi)容,執(zhí)行條件AL(無條件執(zhí)行)
BEQ DATAEVEN      ;跳轉(zhuǎn)指令,執(zhí)行條件EQ,即相等跳轉(zhuǎn)到DATAEVEN
ADDS R1,R1,#1     ;加法指令,R1+1 => R1 影響CPSR寄存器,帶有S
SUBNES R1,R1,#0xD ;條件執(zhí)行減法運(yùn)算(NE),R1-0xD => R1,影響CPSR寄存器,帶有S

條件碼表

條件碼助記符 標(biāo)志 含義
EQ Z=1 相等
NE Z=0 不相等
CS/HS C=1 無符號(hào)數(shù)大于或等于
CC/LO C=0 無符號(hào)數(shù)小于
MI N=1 負(fù)數(shù)
PL N=0 正數(shù)
VS V=1 溢出
VC V=0 沒有溢出
HI C=1,Z=0 無符號(hào)數(shù)大于
LS C=0,Z=1 無符號(hào)數(shù)小于或等于
GE N=V 帶符號(hào)數(shù)大于或等于
LT N!=V 帶符號(hào)數(shù)小于
GT Z=0,N=V 帶符號(hào)數(shù)大于
LE Z=1,N!=V 帶符號(hào)數(shù)小于或等于
AL   任何無條件執(zhí)行(指令默認(rèn)條件)

條件碼應(yīng)用舉例:
1、比較兩個(gè)值大小,C代碼如下:
if(a>b) a++;
else b++;
寫出相應(yīng)的ARM指令
代碼如下:設(shè)R0為a,R1為b
CMP R0, R1              ; R0與R1比較
ADDHI R0,R0,#1      ; 若R0>R1,則R0=R0+1
ADDLS R1,R1,#1     ; 若R0<=R1,則R1=R1+1

2、若兩個(gè)條件均成立,則將這兩個(gè)數(shù)值相加
C代碼為: if((a!=10)&&(b!=20)) a=a+b;
對(duì)應(yīng)的ARM指令為:
CMP R0,#10     ;比較R0是否為10
CMPNE R1,#20  ;若R0不為10,則比較R1是否為20
ADDNE R0,R0,R1; 若R0不為10且R1不為20,則執(zhí)行 R0 = R0+R1

3、若兩個(gè)條件有一個(gè)成立,則將這兩個(gè)數(shù)值相加
C代碼為: if((a!=10)||(b!=20)) a=a+b;
對(duì)應(yīng)的ARM指令為:
CMP R0,#10    
CMPEQ R1,#20 
ADDNE R0,R0,R1

ARM存儲(chǔ)訪問指令:
LDR、STR、LDM、STM、SWP
LDR/STR:加載/存儲(chǔ)字和無符號(hào)字節(jié)指令
從尋址方式的地址計(jì)算方法分,加載/存儲(chǔ)指令有以下4種形式:
1,零偏移:LDR Rd,[Rn]
2,前索引偏移: LDR Rd,[Rn,#0x04]!,LDR Rd,[Rn,#-0x04] Rn不允許為R15
3,程序相對(duì)偏移:LDR Rd,label,label為程序標(biāo)號(hào),該形式不能使用后綴!
4,后索引偏移: LDR Rd,[Rn],#0x04,Rn不允許是R15

指令舉例如下:
LDR R2,[R5]     ;加載R5指定地址上的數(shù)據(jù)(字),放入R2中
STR R1,[R0,#0x04]    ;將R1的數(shù)據(jù)存儲(chǔ)到 R0+0x04存儲(chǔ)單元,R0的值不變 (若有!,則R0就要更新)
LDRB R3,[R2],#1    ;讀取R2地址上的一字節(jié)數(shù)據(jù)并保存到R3中,R2=R2+1
STRH R1,[R0,#2]!   ;將R1的數(shù)據(jù)保存到R0+2的地址中,只存儲(chǔ)低2字節(jié)數(shù)據(jù),R0 =R0+2

LDM和STM是批量加載/存儲(chǔ)指令,LDM為加載多個(gè)寄存器,STM為存儲(chǔ)多個(gè)寄存器,主要用途是現(xiàn)場(chǎng)保護(hù),數(shù)據(jù)復(fù)制、參數(shù)傳遞等,其模式有8種,前4種用于數(shù)據(jù)塊的傳輸,后4種用于堆棧操作
IA:每次傳送后地址加4
IB:每次傳動(dòng)前地址加4
DA:每次傳送后地址減4
DB:每次傳送前地址減4
FD:滿遞減堆棧
ED:空遞增堆棧
FA:滿遞增堆棧
EA:空遞增堆棧

批量加載/存儲(chǔ)指令舉例如下:
LDMIA R0!,{R3-R9}     ;加載R0指向的地址上的多字?jǐn)?shù)據(jù),保存到R3-R9中,R0值更新
STMIA R1!,{R3-49}     ;將R3-R9的數(shù)據(jù)存儲(chǔ)到R1指向的地址上,R1值更新
STMFD SP!,{R0-R7,LR}  ; 現(xiàn)場(chǎng)保存,將R0~R7、LR入棧
LDMFD SP!,{R0-R7,PC}^ ;恢復(fù)現(xiàn)場(chǎng),異常處理返回

使用LDM/STM進(jìn)行數(shù)據(jù)復(fù)制
LDR R0,=SrcData    ;設(shè)置源數(shù)據(jù)地址,LDR此時(shí)作為偽指令加載地址要加 =
LDR R1,=DstData    ;設(shè)置目標(biāo)地址
LDMIA R0,{R2-R9}   ;加載8字?jǐn)?shù)據(jù)到寄存器R2 ~ R9
STMIA R1,{R2-R9}   ;存儲(chǔ)寄存器R2-R9到目標(biāo)地址上

使用LDM/STM進(jìn)行現(xiàn)場(chǎng)保護(hù),常用在子程序或異常處理中
STMFD SP!,{R0-R7,LR} ;寄存器入棧
.....
BL DELAY             ;調(diào)用DELAY子程序
.....
LDMFD SP!,{R0-R7,PC} ;恢復(fù)寄存器,并返回


SWP是寄存器和存儲(chǔ)器交換指令,可使用SWP實(shí)現(xiàn)信號(hào)量操作
12C_SEM EQU 0x40003000   ;EQU定義一個(gè)常量
12C_SEM_WAIT             ;標(biāo)簽
MOV R1,#0
LDR R0,=12C_SEM          
SWP R1,R1,[R0]           ;取出信號(hào)量,并設(shè)置為0
CMP R1,#0                ;判斷是否有信號(hào)
BEQ 12C_SEM_WAIT         ;若沒有信號(hào),則等待

ARM數(shù)據(jù)處理指令包括
1、數(shù)據(jù)傳送指令
2、算術(shù)邏輯運(yùn)算指令
3、比較指令
4、乘法指令

ADC指令:帶進(jìn)位加法指令,將操作數(shù)2的數(shù)據(jù)與Rn的值相加,再加上CPSR中C條件標(biāo)志位,結(jié)果保存到Rd中
使用ADC指令實(shí)現(xiàn)64位加法
ADDS R0,R0,R2   ; R0+R2 => R0,影響CPSR中的值
ADC  R1,R1,R3   ;(R1、R0) = (R1、R0)+(R3、R2)

SBC指令:帶借位減法指令,用寄存器Rn減去操作數(shù)2,再減去CPSR中的C條件標(biāo)志位的非(即若C標(biāo)志清零,則結(jié)果減去1),結(jié)果保存在Rd中
使用SBC實(shí)現(xiàn)64位減法
SUBS R0,R0,R2
SBC  R1,R1,R3  ;使用SBC實(shí)現(xiàn)64位減法,(R1,R0) - (R3,R2)

AND指令:按位與操作
ANDS R0,R0,#0x01  ;取出最低位數(shù)據(jù)

ORR指令:按位或操作
ORR R0,R0,#0x0F   ;將R0的低4位置1

EOR指令是進(jìn)行異或操作,BIC指令是位清除指令(遇1清0)

TST:位測(cè)試指令
TST R0,#0
x01     ; 判斷R0的最低位是否是為0

TEQ:相等測(cè)試指令
TEQ R0,R1     ; 比較R0與R1是否相等,也可看作相減,相等則為0,Z=1


MUL指令:乘法指令
MUL R1,R2,R3   ; R1=R2*R3
MULS R0,R3,R7  ; R0=R3*R7,同時(shí)設(shè)置CPSR中的N位和Z位

MLA是乘加指令,將操作數(shù)1和操作數(shù)2相乘再加上第3個(gè)操作數(shù),結(jié)果的低32位存入到Rd中
UMULL是64位無符號(hào)乘法指令
UMULL R0,R1,R5,R8   ; (R1、R0) = R5 * R8

BL指令:帶鏈接的跳轉(zhuǎn)指令,指令將下一條指令拷貝到R14(即LR)鏈接寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行
BL指令用于子程序調(diào)用,例如:BL DELAY
BX指令:帶狀態(tài)切換的跳轉(zhuǎn)指令,例如 BX R0 ;跳轉(zhuǎn)到R0指定的地址,并根據(jù)R0的最低位來切換處理器的狀態(tài)


MCR:ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令
MRC:協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令

MRC/MCR指令格式如下:
MRC/MCR {cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}
coproc是指令操作的協(xié)處理器名,標(biāo)準(zhǔn)名為pn,n為0-15
opcode1 協(xié)處理器的特定操作碼
Rd  MRC操作時(shí),作為目標(biāo)寄存器的協(xié)處理器寄存器,MCR操作時(shí),作為ARM處理器的寄存器
CRn 存放第1個(gè)操作數(shù)的協(xié)處理器寄存器
CRm 存放第2個(gè)操作數(shù)的協(xié)處理器寄存器
opcode2 可選的協(xié)處理器特定操作碼

MRC/MCR指令舉例如下:
mcr/mrc p15,0,r0,c1,c0,0

SWI指令:SWI指令用于產(chǎn)生中斷,從而實(shí)現(xiàn)用戶模式變換到管理模式,CPSR保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量
SWI 0x123456  ;軟中斷,中斷立即數(shù) 0x123456

在SWI異常中斷處理程序中,取出SWI立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是THUMB指令,這可通過對(duì)SPSR訪問得到,然后要取得該SWI指令的地址,這可通過訪問LR寄存器得到,接著讀出指令,分解出立即數(shù)
程序代碼如下:
T_bit EQU 0x20                ;0010 0000
SWI_Hander
    STMFD SP!,{R0-R3,R12,LR}  ;現(xiàn)場(chǎng)保護(hù)
    MRS R0,SPSR               ;讀取SPSR
    STMFD SP!,{R0}            ;保存SPSR
    TST R0, #T_bit            ;測(cè)試T標(biāo)志位,0為ARM,1為THUMB
    LDRNEH  R0,[LR,#-2]       ;若是THUMB指令,讀出產(chǎn)生中斷的指令碼(16位)
    BICNE R0,R0,#0xFF00       ;取得THUMB指令的8位立即數(shù)
    LDREQ R0,[LR,#-4]         ;若是ARM指令,讀取產(chǎn)生中斷的指令碼(32位)
    BICEQ R0,R0,#0xFF000000   ;取得ARM指令的24位立即數(shù)
    BL  C_SWI_Handler
    LDMFD SP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回


MRS指令:讀狀態(tài)寄存器指令,在ARM處理器中,只有MRS指令可以從狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器
MRS R1,CPSR     ;將CPSR狀態(tài)寄存器讀取,保存到R1
MRS R2,SPSR     ;將SPSR狀態(tài)寄存器讀取,保存到R2

MRS應(yīng)用:
1、使能IRQ中斷
ENABLE_IRQ
MRS R0,CPSR
BIC R0,R0,#0x80       ;1000 0000
MSR CPSR,R0
MOV PC,LR

2、禁止IRQ中斷
DISABLE_IRQ
MRS R0,CPSR
ORR R0,R0,#0x80
MSR CPSR,R0
MOV PC,LR

MSR:寫狀態(tài)寄存器指令,在ARM處理器中,只有MSR指令可以直接設(shè)置狀態(tài)寄存器CPSR或SPSR


================================================================================================================

ARM偽指令介紹

ARM偽指令不是ARM指令集中的指令,只是為了編程方便編譯器定義了偽指令
ARM地址讀取偽指令有四條,分別是
ADR    偽指令
ADRL   偽指令
LDR    偽指令
NOP    偽指令

作用的范圍不一樣,由小到大: ADR,ADRL,LDR
ADR、ADRL指令將基于PC相對(duì)偏移的地址讀取到存儲(chǔ)器中,例如
ADR  R0 , DISP_TAB    ; 加載轉(zhuǎn)換表地址
LDR  R1, [R0,R2]    ;使用R2作為參數(shù),進(jìn)行查表
.....
DISP_TAB
DCB
    0xc0,0xf9,0xa4,0x99,0x92,0x82,0xf8,0x80


LDR偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器,前加 =
LDR R0,=0x123456     ;加載32位立即數(shù)0x123456
LDR R0,=DATA_BUF+60  ;加載DATA_BUF地址+60

NOP是空操作偽指令

宏是一段獨(dú)立的程序代碼,它是通過偽指令定義的,在程序中使用宏指令即可調(diào)用宏,當(dāng)程序被匯編時(shí),匯編程序?qū)?duì)每個(gè)調(diào)用進(jìn)行展開,用宏定義取代源程序中的宏指令


符號(hào)定義偽指令
1、全局變量聲明:GBLA、GBLL 和 GBLS
2、局部變量聲明:LCLA、LCLL 和 LCLS
3、變量賦值:SETA、SETL、和 SETS
4、為一個(gè)通用寄存器列表定義名稱:RLIST
5、為一個(gè)協(xié)處理器的寄存器定義名稱:CN
6、為一個(gè)協(xié)處理器定義名稱:CP

最后一個(gè)字符 A代表算術(shù)變量,初始值為0,L代表邏輯變量,初值為FALSE,S代表字符串,初值為空
偽指令應(yīng)用舉例如下:
MACRO               ;聲明一個(gè)宏
SENDDAT $dat        ;宏的原型 $表示后面是變量
LCLA bitno          ;聲明一個(gè)局部算術(shù)變量
...
bitno SETA 8        ;設(shè)置變量值為8
...
MEND                ;結(jié)束

RLIST指令格式:
name RLIST {reglist},例如: LoReg RLIST {R0-R7}   ;定義寄存器列表LoReg

CN指令的用法:
name CN expr,其中name是要定義的協(xié)處理器的寄存器名稱,expr對(duì)應(yīng)的協(xié)處理器的寄存器編號(hào),數(shù)值范圍 0 ~ 15
MemSet CN 1  ;將協(xié)處理器的寄存器1名稱定義為 MemSet

CP指令的用法,舉例如下:
DivRun CP 5  ;將協(xié)處理器5名稱定義為DivRun


數(shù)據(jù)定義偽指令:
1、聲明一個(gè)文字池:LTORG
2、定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址:MAP 或 ^
3、定義結(jié)構(gòu)化內(nèi)存表中的一個(gè)數(shù)據(jù)域:FIELD 或 #
4、分配一塊內(nèi)存空間,并用0初始化: SPACE 或 %
5、分配一段字節(jié)內(nèi)存單元,并用指定的數(shù)據(jù)初始化: DCB
6、分配一段字的內(nèi)存單元,并用指令的數(shù)據(jù)初始化: DCD 和 DCDU
7、分配一段雙字的內(nèi)存單元,并用64位整數(shù)數(shù)據(jù)初始化: DCQ 和 DCQU
8、分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化: DCW 和 DCWU

LTORG 用于聲明一個(gè)文子池,在使用LDR偽指令時(shí),要在適當(dāng)?shù)牡刂芳尤隠TORG聲明文子池,這樣就會(huì)把要加載的數(shù)據(jù)保存在文子池內(nèi),再用ARM的加載指令讀出數(shù)據(jù)(若沒有使用LTORG聲明文子池,則匯編器會(huì)在程序末尾自動(dòng)聲明)
LTORG偽指令應(yīng)用舉例如下:
...
LDR R0,=0x12345678
ADD R1,R1,R0
MOV PC,LR
LTORG        ;聲明文子池
DCD 0x333
DCD 0x555

MAP 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址,^與MAP同義
MAP 0x00, R9  ;定義內(nèi)存表的首地址為R9

FIELD 用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表的數(shù)據(jù)域,#與FIELD同義
^ _ISR_STARTADDRESS    ; ^ is synonym for MAP
HandleReset  #  4      ; 定義數(shù)據(jù)域 HandleReset,長(zhǎng)度為4字節(jié)

SPACE用于分配一塊內(nèi)存單元,并用0初始化,%與SPACE同義
偽指令應(yīng)用舉例如下:
AREA DataRAM,DATA,READWROTE   ;聲明一數(shù)據(jù)段,名為DataRAM
DataBuf SPACE 1000            ;分配1000字節(jié)空間

DCB偽指令格式:
{label} DCB expr{,expr} ...
加{}的代表可有可無,DCD、DCW指令格式與DCB基本相同


ASSERT為斷言錯(cuò)誤偽指令,在匯編編譯器對(duì)匯編程序的第二遍掃描中,若其中ASSERT條件不成立,ASSERT偽指令將報(bào)告該錯(cuò)誤信息
ASSERT Top<>Temp    ;斷言Top 不等于 Temp
ASSERT :DEF:ENDIAN_CHANGE    



匯編控制偽指令

1、條件匯編控制:IF、ELSE 和 ENDIF
IF、ELSE 和 ENDIF 偽指令能夠根據(jù)條件把一段代碼包括在匯編程序內(nèi)或?qū)⑵渑懦诔绦蛑?br> [ 與 IF同義 ,| 與 ELSE 同義, ] 與 ENDIF 同義
偽指令應(yīng)用舉例如下:
[ {CONFIG} = 16    ; [ 代表 IF
BL __rt_udiv_1 
|                  ; | 代表 ELSE
BL __rt_div0
]                  ; ] 代表 ENDIF


2、MACRO 和 MEND
MACRO 和 MEND 偽指令用于宏定義,MACRO表示宏定義的開始,MEND表示宏定義的結(jié)束,用MACRO和MEND定義的一段代碼,稱為宏定義體,偽指令應(yīng)用如下:
MACRO
CSI_SETB        ;宏名為CSI_SETB,無參數(shù)
LDR R0,=rPDATG  ;讀取GPG0 口的值
LDR R1,[R0]
ORR R1,R1,#0x01 ;CSI置位操作
STR R1,[R0]     ;輸出控制
MEND


3、WHILE 和 WEND
WHILE 和 WEND 偽指令用于根據(jù)條件重復(fù) 編相同的或幾乎相同的一段源程序
偽指令應(yīng)用舉例
WHILE no< 5
no SETA no+1
...
WEND


雜項(xiàng)偽指令:在匯編程序設(shè)計(jì)較為常用,如段定義偽指令,入口點(diǎn)設(shè)置偽指令,包含文件偽指令,標(biāo)號(hào)導(dǎo)出或引入聲明
1、邊界對(duì)齊:ALIGN
2、段定義: AREA
3、指令集定義:CODE16 和 CODE32
4、匯編結(jié)束: END
5、程序入口: ENTRY
6、常量定義:EQU
7、聲明一個(gè)符號(hào)可以被其它文件引用:EXPORT 和 GLOBAL
8、聲明一個(gè)外部符號(hào):IMPORT 和 EXTERN
9、包含文件: GET 和 INCLUDE
10、給特定的寄存器命名: RN

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日韩精品中文字幕亚洲| 国产精品免费福利在线| 亚洲一级二级三级精品| 一区二区日本一区二区欧美| 熟妇久久人妻中文字幕| 99久久国产精品免费| 精品日韩国产高清毛片| 亚洲三级视频在线观看免费| 午夜国产精品福利在线观看| 一区二区欧美另类稀缺| 日韩精品一区二区亚洲| 黄色国产一区二区三区| 国产午夜精品美女露脸视频| 风韵人妻丰满熟妇老熟女av| 欧美日韩亚洲国产精品| 好吊日在线视频免费观看| 亚洲综合伊人五月天中文| 黄色在线免费高清观看| 激情三级在线观看视频| 正在播放玩弄漂亮少妇高潮| 日韩无套内射免费精品| 视频一区二区黄色线观看| 欧美成人国产精品高清| 大香蕉精品视频一区二区| 五月激情婷婷丁香六月网| 欧美人妻免费一区二区三区| 99在线视频精品免费播放| 精品国产亚洲免费91| 婷婷激情四射在线观看视频| 亚洲午夜av久久久精品| 日韩中文高清在线专区| 狠狠做五月深爱婷婷综合| 国产视频福利一区二区| 久久国产人妻一区二区免费| 日韩精品区欧美在线一区| 欧洲日本亚洲一区二区| 日韩精品成区中文字幕| 国产精品尹人香蕉综合网| 91亚洲精品国产一区| 午夜福利精品视频视频 | 国产精品推荐在线一区|