IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > ARM指令集如何應(yīng)用

ARM指令集如何應(yīng)用 時(shí)間:2018-08-14      來(lái)源:未知

ARM指令也稱ARM匯編指令集,是用來(lái)操作及控制ARM處理器及其相關(guān)設(shè)備的32bit的匯編指令,相對(duì)于16bit的thumb指令集而言功能更加強(qiáng)大,包含指令與偽指令。現(xiàn)將常用指令歸納匯總?cè)缦拢?/p>

一、指令、偽指令

指令:是機(jī)器碼的助記符,經(jīng)過(guò)匯編器編譯為機(jī)器碼后,可以由CPU執(zhí)行。

偽指令:用來(lái)指導(dǎo)匯編器編譯指令,是匯編器的產(chǎn)物,終不會(huì)生成機(jī)器碼。

二、ARM指令的編寫風(fēng)格

匯編代碼大寫:在Windows中的IDE開發(fā)環(huán)境中一般都大寫。

匯編代碼小寫:在Linux環(huán)境中,好遵循GNU風(fēng)格,即指令一般用小寫。

三、ARM匯編代碼文件后綴的大小寫問(wèn)題

Windows環(huán)境:因?yàn)閃indows不區(qū)分大小寫,所以匯編文件后綴大寫、小寫編譯過(guò)程沒(méi)有區(qū)別,即test.S與test.s編譯結(jié)果一致。

Linux環(huán)境:Linux環(huán)境是嚴(yán)格區(qū)分大小寫的,test.S與test.s會(huì)被當(dāng)成不同的文件來(lái)處理(處理過(guò)程也不一致)。后綴小寫的test.s文件,在編譯階段不進(jìn)行預(yù)處理操作,所以不能在這里面寫預(yù)處理的語(yǔ)句(不能有宏定義等,不常用);后綴大寫的test.S文件,會(huì)進(jìn)行預(yù)處理、匯編等操作,所以我們可以在這里面加入預(yù)處理的命令(比較常用)。

四、ARM匯編指令的格式

ARM匯編指令的格式比較固定、簡(jiǎn)單,即是:“操作碼目標(biāo)寄存器,操作數(shù)1,操作數(shù)2,……操作數(shù)n”。

例如將十六進(jìn)制數(shù)0xaf放到寄存器r0中,我們用匯編代碼可以這樣寫“mov r0,#0xaf”。這里的“mov”就是操作碼(指令),實(shí)現(xiàn)的功能是將“0xaf”這個(gè)數(shù)存放到寄存器中“r0”中,“r0”也即是目標(biāo)寄存器,“#0xaf”也即是操作數(shù)。在這里,“#0xaf”表示立即數(shù)(立即尋址方式指令中給出的數(shù)稱為立即數(shù)立即數(shù),亦即是直接參與運(yùn)算不需處理的數(shù)),立即數(shù)需要用“#”來(lái)標(biāo)識(shí)。

五、ARM指令分類

ARM指令可以分為程序狀態(tài)寄存器操作指令、寄存器裝載與存儲(chǔ)指令、算術(shù)與邏輯指令、移位指令、乘法指令、比較指令、分支指令、浮點(diǎn)數(shù)指令、偽指令。

1、程序狀態(tài)寄存器操作指令

程序狀態(tài)寄存器操作指令包含msr、mrs兩個(gè)指令。

(1)msr實(shí)現(xiàn)將通用寄存器(r0-r15)的值復(fù)制到狀態(tài)寄存器(cpsr及spsr)中,用于更改處理器的工作模式及狀態(tài)。例如,

MSR CPSR, R0 ;復(fù)制 R0 到 CPSR 中

MSR SPSR, R0 ;復(fù)制 R0 到 SPSR 中

(2)mrs實(shí)現(xiàn)將狀態(tài)寄存器(cpsr及spsr)的值復(fù)制到通用寄存器(r0-r15)中,用于讀取處理器的工作模式及狀態(tài)。例如,

MRS R0, CPSR ; 復(fù)制 CPSR 到 R0 中

MRS R0, SPSR ; 復(fù)制 SPSR 到 R0 中

2、寄存器裝載與存儲(chǔ)指令

常用寄存器裝載與存儲(chǔ)指令操作指令包含ldr、str、ldm、stm四個(gè)指令,其中l(wèi)dm、stm可以實(shí)現(xiàn)多個(gè)數(shù)據(jù)的傳輸。

(1)ldr實(shí)現(xiàn)將所在內(nèi)存地址的值裝載到寄存器中。

ldr rd, [rbase] ;rbase的值存儲(chǔ)到rd寄存器

(2)str實(shí)現(xiàn)將寄存中的值存儲(chǔ)在相應(yīng)內(nèi)存地址中。

str rd, [rbase] ;存儲(chǔ) rd 到 rbase 所包含的有效地址

(3)ldm實(shí)現(xiàn)將內(nèi)存的值存儲(chǔ)在相應(yīng)寄存器地址中。常用于數(shù)據(jù)出棧。

ldmfd sp!, {r0-r3} ;將內(nèi)存的數(shù)據(jù)出棧到r0-r3

(4)stm實(shí)現(xiàn)將寄存中的值存儲(chǔ)在相應(yīng)內(nèi)存地址中。常用于數(shù)據(jù)入棧。

stmfd sp, {r0-r3} ;將寄存器r0-r3壓棧

3、算術(shù)與邏輯指令

常用算術(shù)與邏輯指令包含and、orr、eor三個(gè)邏輯指令和adc、add、bic、mov、mvn、rsb、sub六個(gè)算術(shù)指令,共計(jì)九個(gè)指令。

(1)and實(shí)現(xiàn)邏輯與,相當(dāng)于c語(yǔ)言中的位與。

and r0, r1, #0x01 ; r0=r1 & 0x01

(2)orr實(shí)現(xiàn)邏輯或,相當(dāng)于c語(yǔ)言中的位或。

orr r0, r1, #0x01 ; r0=r1 | 0x01

(3)eor實(shí)現(xiàn)異或,相當(dāng)于c語(yǔ)言中的異或。

eor r0, r1, #0x01 ; r0=r1 ^ 0x01

(4)bic實(shí)現(xiàn)清零操作。

bic r0, r0, #0x0f ; r0 = r0 & ~(0x0f)技術(shù)將低4bit清零

(5)mov實(shí)現(xiàn)數(shù)據(jù)的搬移,相當(dāng)于c語(yǔ)言中的賦值(如果后面是立即數(shù),這個(gè)立即數(shù)的范圍一般是0~255(8bit))。

mov r0,#0x01 ; r0 = 0x01

mov r0,r1 ; r0 = r1

(6)mvn實(shí)現(xiàn)數(shù)據(jù)的取反并搬移,相當(dāng)于c語(yǔ)言的取反在賦值。

mvn r0,#1 ; r0 = (~1) = -2

mvn r0,r1 ; r0 = (~r1) = -(r1 + 1)

(7)rsb實(shí)現(xiàn)反向減法。

rsb r0, r1, #20 ; r0 = 20 - r1

rsb r0, r1, r2 ; r0 = r2 - r1

(8)add實(shí)現(xiàn)算術(shù)加法。

add r0, r1, #0x01 ; r0 = r1 + 0x01

(9)sub實(shí)現(xiàn)算術(shù)減法。

sub r0, r1, #0x01 ; r0=r1 - 0x01

4、移位指令

移位指令包含lsl、asl兩個(gè)左移指令和lsr、asr、ror、rrx四個(gè)右移指令,共計(jì)六個(gè)指令。

(1)lsl實(shí)現(xiàn)邏輯左移,與asl作用等同。

mov r1, #0x21 ;將立即數(shù)0x21放到r1

mov r0, r1, lsl#3 ;將r1左移3位,然后放入r0中

(2)asl實(shí)現(xiàn)算術(shù)左移,與lsl作用等同。

mov r1, #0x21 ;將立即數(shù)0x21放到r1

mov r0, r1, asl#3 ;將r1左移3位,然后放入r0中

(3)lsr實(shí)現(xiàn)邏輯右移。

mov r1, #0x21 ;將立即數(shù)0x21放到r1

mov r0, r1, lsr#3 ;將r1右移3位,然后放入r0中

(4)asr實(shí)現(xiàn)算術(shù)右移。

mov r1, #0x21 ;將立即數(shù)0x21放到r1

mov r0, r1, asr#3 ;將r1右移3位,然后放入r0中

(5)ror實(shí)現(xiàn)循環(huán)右移。

mov r1, #0x21 ;將立即數(shù)0x21放到r1

mov r0, r1, ror#3 ;將r1右移3位,移出的位放依次放到高位,然后放到r0中

(6)rrx實(shí)現(xiàn)帶擴(kuò)展的循環(huán)右移

mov r1, #0x21 ;將立即數(shù)0x21放到r1

mov r0, r1, rrx#3 ;將r1右移3位,移出的位放依次放到高位(借一位構(gòu)成33bit),然后放到r0中

5、乘法指令

乘法指令操作指令包含mla、mul兩個(gè)指令。

(1)mla是三目乘法指令(有三個(gè)操作數(shù))。例如:

mla r0, r1,r2,r3 ;r0 = (r1 * r2) + r3

(2)mul是兩目乘法指令(有兩個(gè)操作數(shù))。例如:

mul r0, r1, r2 ;r0 = r1 * r2

6、比較指令

常用比較指令包含cmp、cmn兩個(gè)指令。

(1)cmp實(shí)現(xiàn)比較功能,例如,cmp r0, r1 ;r0-r1

(2)cmn實(shí)現(xiàn)取負(fù)的值的比較功能,例如,cmn r0, r1 ;r0-(-r1)

7、分支指令

分支指令包含b、bl兩個(gè)指令。

(1)b為不帶連接的分支指令,當(dāng)程序從當(dāng)前位置調(diào)到分支程序中執(zhí)行,將無(wú)法再返回到當(dāng)前位置的下一條指令處。例如:

.start

.loop

mov r0,#0x01 ;將0x01加載到r0寄存器

…………

b loop ; ;調(diào)到loop

mov r1,#0x01 ;將0x01加載到r1寄存器

程序?qū)⒁恢痹趌oop這里循環(huán)(相當(dāng)于while循環(huán)),“mov r1,#0x01”永遠(yuǎn)得不到執(zhí)行。

(2)bl為帶連接的分支指令(branch and link),跳轉(zhuǎn)前把返回地址放入lr中,以便用于函數(shù)調(diào)當(dāng)程序從當(dāng)前位置調(diào)到分支程序中執(zhí)行,執(zhí)行完分支程序?qū)⒃俜祷氐疆?dāng)前位置的下一條指令處繼續(xù)執(zhí)行。例如:

.start

.loop

mov r0,#0x01 ;將0x01加載到r0寄存器

…………

bl loop ;調(diào)到loop

mov r1,#0x01 ;將0x01加載到r1寄存器

程序執(zhí)行完loop后調(diào)到下一行的“mov r1,#0x01”處執(zhí)行。

8、浮點(diǎn)數(shù)指令

浮點(diǎn)數(shù)指令很多,常用指令有abs、cmf、dvf、mvf、muf、ldf、suf、adf幾個(gè)指令,用于處理浮點(diǎn)數(shù)的加載、加、減、乘、除。

9、偽指令

偽指令操作指令包含adr、adrl、align、dcx、equx、opt六個(gè)指令,用于描述指定匯編代碼的對(duì)齊方式、宏定義等。

六、常用GNU偽指令

global _start @ 給_start外部鏈接屬性

.section .text @ 指定當(dāng)前段為代碼段

.ascii .byte .short .long .word

.quad .float .string @ 定義數(shù)據(jù)

.align 4 @ 以4字節(jié)對(duì)齊

.balignl 16 0xabcdefgh @ 16字節(jié)對(duì)齊填充

.equ @ 類似于C中宏定義

.end @標(biāo)識(shí)文件結(jié)束

.include @ 頭文件包含

.arm / .code32 @聲明以下為arm指令

.thumb / .code16 @聲明以下為thubm指令

ldr 大范圍的地址加載指令

adr 小范圍的地址加載指令

adrl 中等范圍的地址加載指令

nop 空操作

七、常用的8種尋址方式的指令實(shí)現(xiàn)

1、寄存器尋址

寄存器尋址就是利用寄存器中的數(shù)值作為操作數(shù),是一種執(zhí)行效率較高的尋址方式。例如:

mov r1, r2 ;r1 = r2

2、立即(立即數(shù))尋址

立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就是在指令中給出,只要取出指令也就渠道了操作數(shù)。這個(gè)操作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式也叫作立即尋址。例如:

mov r0, #0xff00 ; r0 = 0xff00

3、寄存器移位尋址

將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。例如:

mov r0, r1, lsl #3 ; r0 = r1 << 3

4、寄存器間接尋址

寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。例如:

ldr r0, [r1] ;將內(nèi)存地址存在r1這個(gè)寄存器中的內(nèi)存地址里的值給r0

5、基址尋址

基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址。常用于查表、數(shù)組操作、功能部件寄存器訪問(wèn)等。例如:

LDRR2,[R3,#0x0C];讀取R3+0x0C地址上的內(nèi)容,放入R2

6、塊拷貝尋址

多寄存器傳送指令用于將一塊數(shù)據(jù)從存儲(chǔ)器的某一位置拷貝到另一位置。例如,

STMIAR0!,{R1-R7} ;將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中

7、多寄存器尋址

利用一條指令可以完成多個(gè)寄存器值的傳送。這種尋址方式可以用一條指令完成傳送多16個(gè)通用寄存器的值

ldmia r1!, {r2-r7, r12} ;一次訪問(wèn)多個(gè)寄存器

8、堆棧尋址

堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出的方式工作,使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。例子,

stmfd sp!, {r2-r7, lr}

八、常用指令后綴

同一指令經(jīng)常附帶不同后綴,變成不同的指令。經(jīng)常使用的后綴有:

1、B(byte)功能不變,操作長(zhǎng)度變?yōu)?位

2、H(half word)功能不變,長(zhǎng)度變?yōu)?6位

3、S(signed)功能不變,操作數(shù)變?yōu)橛蟹?hào)

4、條件執(zhí)行后綴

5、“!”與“^”的作用

例如ldr可以加“b”、“h”、“s”變成 ldrb、ldrh、ldrsb、ldrsh用于表示加載8bit數(shù)據(jù)、16bit數(shù)據(jù)、有符號(hào)8bit數(shù)據(jù)、有符號(hào)16bit數(shù)據(jù)。

條件執(zhí)行后綴,可以參看下表例。特點(diǎn)是條件后綴是否成立取決于當(dāng)前代碼的前面的代碼,只影響當(dāng)前代碼的執(zhí)行。

ARM指令集

感嘆號(hào)的作用就是r0的值在ldm過(guò)程中發(fā)生的增加或者減少后寫回到r0去,也就是說(shuō)ldm時(shí)會(huì)改變r(jià)0的值。例如,

ldmia r0, {r2 - r3} ;不會(huì)改變r(jià)0的值

ldmia r0!, {r2 - r3} ;會(huì)改變r(jià)0的值

^的作用是在目標(biāo)寄存器中有pc時(shí),會(huì)同時(shí)將spsr寫入到cpsr,一般用于從異常模式返回。

ldmfd sp!, {r0 - r6, pc} ;spsr不會(huì)寫入到cpsr

ldmfd sp!, {r0 - r6, pc}^ ;spsr寫入到cpsr

九、ARM指令應(yīng)用舉例

這里就ARM應(yīng)用舉一個(gè)例子,使用ARM指令操作簡(jiǎn)單的硬件(點(diǎn)亮LED燈)。FS210開發(fā)板LED燈如下圖所示,

ARM指令集

要想控制這些器件,我們需要查看其對(duì)應(yīng)的原理圖。LED原理圖如下

ARM指令集

從原理圖上可知,要想點(diǎn)亮兩顆led燈,只需給GPC0_3及GPC0_4高電平即可。

ARM指令集

打開S5PV210用戶手冊(cè),找到GPIO章節(jié)的數(shù)據(jù)寄存器與控制寄存器的描述。結(jié)合GPIO寄存器的描述編寫匯編程序。

#define GPC0_CON 0XE0200060 ;定義GPC0控制寄存器地址

#define GPC0_DAT 0XE0200064 ;定義GPC0數(shù)據(jù)寄存器地址

ldr r0,=GPC0_CON ;將GPC0_CON加載到r0

ldr r1,=0x11000 ;將0x11000加載到r1

str r1,[r0] ;將r1的值加載到r0寄存器

ldr r0,=GPC0_DAT ;將GPC0_DAT加載到r0

mov r1,#0x18 ;將立即數(shù)0x18加載到r1

str r1,[r0] ;將r1的值加載到r0寄存器

stop:

b stop ;死循環(huán)(相當(dāng)于while(1))

交叉編譯并下載到FS210開發(fā)板上運(yùn)行,LED燈被點(diǎn)亮。

ARM指令集

上一篇:TFT-LCD常用接口分類

下一篇:嵌入式硬件開發(fā)怎么學(xué)

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見(jiàn)科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 金相切割机-金相磨抛机-显微/维氏/布氏/洛氏硬度计-自准直仪-金相显微镜-万能材料试验机-清洁度检测仪-淋雨试验机-上海中研精密仪器制造有限公司 | 围挡厂家_施工围挡_PVC围挡_建筑工程围挡_深圳市旭东钢构技术开发有限公司【官网】 | 宁夏密集型母线槽厂家-封闭式母线槽-电力工程安装-天地经纬电力 宁波允泰仪器有限公司-硬度计、拉力试验机、盐雾试验箱、影像测量仪、气动量仪 | 锌铝合金压铸-深圳压铸加工-铝挤压拉伸-压铸模具厂-广东誉格精密技术有限公司 | 学校洗碗机-郑州洗碗机厂家-商用洗碗机-郑州旭申环保科技有限公司 | 可燃气体报警器-有毒有害气体检测仪-气体检测分析系统-宁波市高品科技有限公司 | 人防信号控制箱厂家-液位控制器价格-信号灯箱批发厂家-消声加热器-鼎兴自控 | 进销存软件|仓库管理软件|库存物资出入库|ERP生产|MRP|易特软件官方网站 | 无锡市恒威工业气体有限公司-工业高纯气体_高纯度特种气体 | 中捷摇臂钻,数控钻床,沈阳中捷设备机床厂官网_沈阳中捷数控摇臂钻床厂 | 欧式箱变_美式箱变_预制舱壳体-合肥龙马电气设备有限公司 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 酒博会丨京酒展丨北京国际酒业博览会 | 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 乳化泵-高剪切乳化机-减速机支架-乳化罐-釜底乳化机【厂家】-浙江奥盛机械 | 中式婚礼_汉服婚礼_传统婚礼_婚庆公司_云歌婚礼策划【官网】 | 佳龙食品集团|高端辣条领导品牌| 重庆化粪池清淘_管道疏通_高压疏通清洗管道_电话:023-68183336,15723234763 | 深圳喜运达物流官网_东南亚物流|海运|专线|海外仓_泰国菲律宾马来西亚海运|物流专线|海外仓 | 润滑油展会 沈阳 南京 润滑油 展会 西安 润滑脂 中国国际润滑油 全国润滑油 汽配_中国国际润滑油、脂、养护用品及技术设备展览会 | 江门摩托车配件|江门电动车配件|江门市盛泰嘉金属塑料制品有限公司 | 转轴测试机-按键寿命测试机-连接器插拔力试验机-深圳市丹荣检测 转盘萃取塔,DMF回收塔生产厂家-无锡弘鼎华化工设备有限公司 | 粮食加工设备_玉米_大米_面粉_燕麦_豆类杂粮加工设备-华豫万通 | 重庆化粪池清淘_管道疏通_高压疏通清洗管道_电话:023-68183336,15723234763 | 吸污车|吸粪车|冷藏车|消防车|清障车|环卫垃圾车价格|湖北程力汽车集团厂家销售公司 | 太原铁艺围栏-山西泓宸辉铁艺工程有限公司 | 通道闸-人行通道闸|通道闸机系统厂家-深圳伊帕克智能科技有限公司 | 金相切割机-金相磨抛机-显微/维氏/布氏/洛氏硬度计-自准直仪-金相显微镜-万能材料试验机-清洁度检测仪-淋雨试验机-上海中研精密仪器制造有限公司 | 篮球场围网|网球场围网|球场围网|体育场围网_安平县炎煌丝网制品有限公司 | 立式/卧式/暖气/管道泵,管道离心泵选型,管道增压泵型号 - 安平鼎千泵业制造厂 | 南京仁康体检--南京仁康门诊部有限公司 | 气体灭火安装,气体灭火系统安装,七氟丙烷灭火系统安装,消防气体灭火控制系统 | 硬度计-布氏硬度计-维氏硬度计-莱洛特试验仪器有限公司 | 喷涂流水线,喷漆流水线-山东天意设备科技 | 呼吸家官网|肺功能检测仪生产厂家|国产肺功能仪知名品牌|肺功能检测仪|肺功能测试仪|婴幼儿肺功能仪|弥散残气肺功能仪|肺功能测试系统|广州红象医疗科技有限公司|便携式肺功能仪|大肺功能仪|呼吸康复一体机|儿童肺功能仪|肺活量计|医用简易肺功能仪|呼吸康复系统|肺功能仪|弥散肺功能仪(大肺)|便携式肺功能检测仪|肺康复|呼吸肌力测定肺功能仪|肺功能测定仪|呼吸神经肌肉刺激仪|便携式肺功能 | 碳化硅微粉_超细碳化硅微粉_潍坊凯华碳化硅微粉有限公司 | 吉林省创智汇成包装有限公司,长春高档礼盒,长春包装盒厂家,长春精品包装盒 | 运动控制器_数控系统_廊坊市九盈数控技术公司「官网」 | 上海机械网 机械 机械加工 金属加工 上海机械网 机械设备 上海机械 | 专业音响设备|数字功放|舞台音响|ktv音响|会议音响-劳伦士 | 域发官网-皮肤学级头皮养固领先者 |