ARM體系架構(gòu)知識(shí)
一、ARM處理器簡(jiǎn)介及RISC特點(diǎn)
1、ARM處理器簡(jiǎn)介:
ARM(Advanced RISC Machines)是一個(gè)32位RISC(精簡(jiǎn)指令集)處理器架構(gòu),ARM處理器則是ARM架構(gòu)下
的微處理器。ARM處理器廣泛的使用在許多嵌入式系統(tǒng)。ARM處理器的特點(diǎn)有指令長(zhǎng)度固定,執(zhí)行效率高,低成本等。
2、RISC設(shè)計(jì)主要特點(diǎn):
?。ǎ保┲噶罴猂ISC減少了指令集的種類,通常一個(gè)周期一條指令,采用固定長(zhǎng)度的指令格式,編譯器或
程序員通過幾條指令完成一個(gè)復(fù)雜的操作。而CISC指令集的指令長(zhǎng)度通常不固定;
?。ǎ玻┝魉€——RISC采用單周期指令,且指令長(zhǎng)度固定,便于流水線操作執(zhí)行;
?。ǎ常┘拇嫫鳌猂ISC的處理器擁有更多的通用寄存器,寄存器操作較多。例如ARM處理器具有37個(gè)寄存器;
(4)Load/Store結(jié)構(gòu)——使用加載/存儲(chǔ)指令批量從內(nèi)存中讀寫數(shù)據(jù),提高數(shù)據(jù)的傳輸效率;
?。ǎ担ぶ贩绞胶?jiǎn)化,指令長(zhǎng)度固定,指令格式和尋址方式種類減少。
二、Arm的基本數(shù)據(jù)類型:
雙字節(jié)(DoubleWoRd):64位
字(WoRd):在ARM體系結(jié)構(gòu)中,字的長(zhǎng)度為32位。
半字(Half-WoRd):在ARM體系結(jié)構(gòu)中,半字的長(zhǎng)度為16位。
字節(jié)(Byte):在ARM體系結(jié)構(gòu)中,字節(jié)的長(zhǎng)度為8位。
三、ARM處理器存儲(chǔ)格式:
ARM體系結(jié)構(gòu)將存儲(chǔ)器看作是從0地址開始的字節(jié)的線性組合。作為32位的微處理器,ARM體系結(jié)構(gòu)所支持的最大尋址空間為4GB。ARM體系結(jié)構(gòu)可以用兩種方法存儲(chǔ)字?jǐn)?shù)據(jù),分別為大端模式和小端模式。
大端模式(高地高低):字的高字節(jié)存儲(chǔ)在低地址字節(jié)單元中,字的低字節(jié)存儲(chǔ)在高地址字節(jié)單元中。
小端模式(高高低低):字的高字節(jié)存儲(chǔ)在高地址字節(jié)單元中,字的低字節(jié)存儲(chǔ)在低地址字節(jié)單元中。
四、內(nèi)核的工作模式:
1、用戶模式(user):正常程序執(zhí)行模式;
2、快速中斷模式(FIQ):高優(yōu)先級(jí)的中斷產(chǎn)生會(huì)進(jìn)入該種模式,用于高速通道傳輸;
3、外部中斷模式(IRQ):低優(yōu)先級(jí)中斷產(chǎn)生會(huì)進(jìn)入該模式,用于普通的中斷處理;
4、特權(quán)模式(Supervisor):復(fù)位和軟中斷指令會(huì)進(jìn)入該模式;
5、數(shù)據(jù)訪問中止模式(Abort):當(dāng)存儲(chǔ)異常時(shí)會(huì)進(jìn)入該模式;
6、未定義指令中止模式(Undefined):執(zhí)行未定義指令會(huì)進(jìn)入該模式;
7、系統(tǒng)模式(System):用于運(yùn)行特權(quán)級(jí)操作系統(tǒng)任務(wù);
8、監(jiān)控模式(Monitor):可以在安全模式和非安全模式之間切換;
五、ARM指令集:
1、數(shù)據(jù)操作指令:
(1)MOV 將數(shù)據(jù)從一個(gè)寄存器傳送到另一個(gè)寄存器:
MOV AX,2000H;將16位數(shù)據(jù)2000H傳送到AX寄存器
MOV AL,20H;將8位數(shù)據(jù)20H傳送到AL寄存器
MOV AX,BX;將BX寄存器的16位數(shù)據(jù)傳送到AX寄存器
MOV AL,[2000H];將2000H單元的內(nèi)容傳送到AL寄存器
MOVW ?把 16 位立即數(shù)放到寄存器的底16位,高16位清0
MOVT ?把 16 位立即數(shù)放到寄存器的高16位,低 16位不影響
movw ? ?r8, #19028 ? ?; 0x4a54
movt ? ?r8, #49456 ? ?; 0xc130
r8 = 0xc1304a54
(2)AND將寄存器做“邏輯與”操作后保存結(jié)果到其他寄存器
? ? ? ?AND ? R2,R1,R3 ? ? ?// ?R2 = R1 & R3
? ? ? ?ANDS ?R0,R0,#0x01 ? // ?R0 = R0 & 0x01
(3)SUB
? ? ? ?SUB ? R0,R1,R2 ? ? ?//R0 = R1 – R2
? ? ? ?SUB ? R0,R1,#256 ? ?//R0 = R1 -256
(4)ADD
? ? ? ?ADD ?R0,R1,R2 ? ? ? //R0 = R1 + R2
? ? ? ?ADD ?R0,R1,#256 ? ? //R0 = R1 + 256
? ? ? ?ADD ?R0,R2,LSL#1 ? ?//R0 = R2 + (R3 << 1)
(5)CMP比較指令
(6)BIC位清零指令
? ? ? ?BIC ?R0,R0,#0x1011 ?//清除位 0/1/3
2、乘法指令:
MUL ?MLA
MUL ?R1,R2,R3 ? ? //R1 = R2 * R3
MOV ?R0,#0x0A
MLA ?R1,R2,R3,R0 ? // R1 = R2 * R3 + 10
3、Load/Store指令:
(1)LDR從存儲(chǔ)器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。
? ? ? ?LDR ?R1,[R0,#0x12] //將R0 +12地址處的數(shù)據(jù)讀出,保存到R0中;
? ? ? ?LDR ?R1,[R0,R2] ? //將R0 + R1地址的數(shù)據(jù)讀出,保存到R1中;
? ? ? ?LDR ?Rd,[Rn],#0x04 //Rn的值用作傳輸數(shù)據(jù)的基地址,在數(shù)據(jù)傳送后,將偏移量0x04與Rn相加寫回到Rd中
LDR R0,[R1,LSL #3] ? ? ? ? ? ?;將存儲(chǔ)器地址為R1*8的字?jǐn)?shù)據(jù)讀入寄存器R0。
LDR R0,[R1,R2,LSL #2] ? ?;將存儲(chǔ)器地址為R1+R2*4的字?jǐn)?shù)據(jù)讀入寄存器R0。
LDR R0,[R1,,R2,LSL #2]! ?;將存儲(chǔ)器地址為R1+R2*4的字?jǐn)?shù)據(jù)讀入寄存器R0,并將R1+R2*4的值存入R1。
(2)STR 用于將一個(gè)32bit的數(shù)據(jù)寫入到指定的內(nèi)存單元
? ? ? STR ?R0,[R1],#8 //將R0中的字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中,并將新地址R1+8寫入R1。
STR ?R0,[R1,#8] ? ? //將R0中的字?jǐn)?shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中
STR ?R1, [R0] ? ? //將r1寄存器的值,傳送到地址值為r0的(存儲(chǔ)器)內(nèi)存中
4、跳轉(zhuǎn)指令:
B ? ?跳轉(zhuǎn)指令
BL ? 帶返回的連接跳轉(zhuǎn)
BX ? 跳轉(zhuǎn)并切換狀態(tài)
BLX ?帶返回的跳轉(zhuǎn)并切換狀態(tài)
5、狀態(tài)操作指令:
ARM指令提供了兩條如下指令,可直接控制程序狀態(tài)寄存器(只有在特權(quán)模式下才能修改狀態(tài)寄存器):
(1)MRS: 把程序狀態(tài)寄存器的值送到一個(gè)通用寄存器中
? ? ? ?MRS ?R1, CPSR ?//將CPSR狀態(tài)寄存器讀出,保存到R1中
? ? ? ?MRS ?R2, SPSR
(2)MSR:把寄存器的內(nèi)容傳送到程序狀態(tài)寄存器
? ? ? ?MSR ?CPSR_c,#0xD3 ?//CPSR[7:0] = 0xD3切換到管理模式
? ? ? ?MSR ?CPSR_c,R3 ? ? //CPSR = R3
6、異常產(chǎn)生指令:
SWI:軟中斷指令,產(chǎn)生軟中斷,處理器進(jìn)入管理模式;
? ? ? ? SWI ?0 ?//產(chǎn)生軟中斷,中斷立即數(shù)為0
? ? ? ? SWI ?0x123456 ?//產(chǎn)生軟中斷,中斷立即數(shù)為0x123456
BKPT:斷點(diǎn)中斷指令,處理器產(chǎn)生軟件中斷;
? 產(chǎn)生一個(gè)預(yù)取異常,用來設(shè)置軟件斷點(diǎn);
六、ARM指令的尋址方式:
1、立即數(shù)尋址:
MOV ?R0,#0 ? ? ? ? ?//送0到R0中
ADD ?R3,R3,#1 ? ? ?//R3的值加1
CMP ?R7,#1000 ? ? ? //R7的值和1000比較
BIC ? R9,R8,#0xff00 ?//將R8中8~15位清0,結(jié)果保存在R9中
2、寄存器尋址:
寄存器的值可以被直接用于數(shù)據(jù)操作指令
MOV ?R2,R0 ? ? ?//R0的值送R2
ADD ?R4,R3,R2 ?//R4 = R2 + R3
CMP ?R7,R8 ? ? ?//比較R7和R8的值
3、寄存器移位尋址:
預(yù)處理和移位發(fā)生在同一周期內(nèi),有效使用移位寄存器,可以提供代碼執(zhí)行效率;
ADD ?R2,R0,R1,LSR ?#5
MOV ?R1,R0,LSL ?#2
RSB ?R9,R5,R5,LSL ?#1
SUB ?R1,R2,R0,LSR ?#4
4、寄存器間接尋址:
LDR ?R1,[R2] ?//將R2的數(shù)值作為地址,取出地址中的數(shù)據(jù)保存到R1中
STR ?R1,[R2] ?//將R2數(shù)值作為地址,取出R1中的值存入R2所指向的地址
5、基址變址尋址:
基址變址是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址;
基址變址尋址常用于查表、數(shù)組操作、訪問基址附近的存儲(chǔ)單元等。
LDR ?R1,[ R0,#0xf ] ?//將R0的數(shù)值加0x0f作為地址,取出此地址的數(shù)值保存到R1
STR ?R1,[R0,#-2] ? //將R0的數(shù)值減2作為地址,將R1中的內(nèi)容保存到此地址中
STR ?R1,[R0,+R2] ? //將R0的值加上R2的值作為地址,把R1的內(nèi)容保存到該地址
6、多寄存器尋址/塊拷貝尋址:
批量Load、Store指令將一片連續(xù)的內(nèi)存單元數(shù)據(jù)加載到通用寄存器組中,或?qū)⒁唤M通用寄存器的數(shù)據(jù)存儲(chǔ)
到內(nèi)存單元中:
IA :后遞增方式
IB :先遞增方式
DA:后遞減方式
DB:先遞減方式
塊拷貝尋址指令:
? ? ? ?STMIA ?
? ? ? STMIB
7、相對(duì)尋址:
BL ?FUN1 ? ? //調(diào)用到FUN1的子程序
B ? LOOP ? ? //條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處
STMDA
STMDB

版權(quán)聲明:本文為CSDN博主「frank_zyp」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。
原文鏈接:ARM體系架構(gòu)總結(jié)_frank_zyp的博客-CSDN博客_arm架構(gòu)