色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > ARM指令集如何應用

ARM指令集如何應用 時間:2018-08-14      來源:未知

ARM指令也稱ARM匯編指令集,是用來操作及控制ARM處理器及其相關設備的32bit的匯編指令,相對于16bit的thumb指令集而言功能更加強大,包含指令與偽指令。現將常用指令歸納匯總如下:

一、指令、偽指令

指令:是機器碼的助記符,經過匯編器編譯為機器碼后,可以由CPU執行。

偽指令:用來指導匯編器編譯指令,是匯編器的產物,終不會生成機器碼。

二、ARM指令的編寫風格

匯編代碼大寫:在Windows中的IDE開發環境中一般都大寫。

匯編代碼小寫:在Linux環境中,好遵循GNU風格,即指令一般用小寫。

三、ARM匯編代碼文件后綴的大小寫問題

Windows環境:因為Windows不區分大小寫,所以匯編文件后綴大寫、小寫編譯過程沒有區別,即test.S與test.s編譯結果一致。

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

四、ARM匯編指令的格式

ARM匯編指令的格式比較固定、簡單,即是:“操作碼目標寄存器,操作數1,操作數2,……操作數n”。

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

五、ARM指令分類

ARM指令可以分為程序狀態寄存器操作指令、寄存器裝載與存儲指令、算術與邏輯指令、移位指令、乘法指令、比較指令、分支指令、浮點數指令、偽指令。

1、程序狀態寄存器操作指令

程序狀態寄存器操作指令包含msr、mrs兩個指令。

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

MSR CPSR, R0 ;復制 R0 到 CPSR 中

MSR SPSR, R0 ;復制 R0 到 SPSR 中

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

MRS R0, CPSR ; 復制 CPSR 到 R0 中

MRS R0, SPSR ; 復制 SPSR 到 R0 中

2、寄存器裝載與存儲指令

常用寄存器裝載與存儲指令操作指令包含ldr、str、ldm、stm四個指令,其中ldm、stm可以實現多個數據的傳輸。

(1)ldr實現將所在內存地址的值裝載到寄存器中。

ldr rd, [rbase] ;rbase的值存儲到rd寄存器

(2)str實現將寄存中的值存儲在相應內存地址中。

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

(3)ldm實現將內存的值存儲在相應寄存器地址中。常用于數據出棧。

ldmfd sp!, {r0-r3} ;將內存的數據出棧到r0-r3

(4)stm實現將寄存中的值存儲在相應內存地址中。常用于數據入棧。

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

3、算術與邏輯指令

常用算術與邏輯指令包含and、orr、eor三個邏輯指令和adc、add、bic、mov、mvn、rsb、sub六個算術指令,共計九個指令。

(1)and實現邏輯與,相當于c語言中的位與。

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

(2)orr實現邏輯或,相當于c語言中的位或。

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

(3)eor實現異或,相當于c語言中的異或。

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

(4)bic實現清零操作。

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

(5)mov實現數據的搬移,相當于c語言中的賦值(如果后面是立即數,這個立即數的范圍一般是0~255(8bit))。

mov r0,#0x01 ; r0 = 0x01

mov r0,r1 ; r0 = r1

(6)mvn實現數據的取反并搬移,相當于c語言的取反在賦值。

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

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

(7)rsb實現反向減法。

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

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

(8)add實現算術加法。

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

(9)sub實現算術減法。

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

4、移位指令

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

(1)lsl實現邏輯左移,與asl作用等同。

mov r1, #0x21 ;將立即數0x21放到r1

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

(2)asl實現算術左移,與lsl作用等同。

mov r1, #0x21 ;將立即數0x21放到r1

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

(3)lsr實現邏輯右移。

mov r1, #0x21 ;將立即數0x21放到r1

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

(4)asr實現算術右移。

mov r1, #0x21 ;將立即數0x21放到r1

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

(5)ror實現循環右移。

mov r1, #0x21 ;將立即數0x21放到r1

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

(6)rrx實現帶擴展的循環右移

mov r1, #0x21 ;將立即數0x21放到r1

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

5、乘法指令

乘法指令操作指令包含mla、mul兩個指令。

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

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

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

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

6、比較指令

常用比較指令包含cmp、cmn兩個指令。

(1)cmp實現比較功能,例如,cmp r0, r1 ;r0-r1

(2)cmn實現取負的值的比較功能,例如,cmn r0, r1 ;r0-(-r1)

7、分支指令

分支指令包含b、bl兩個指令。

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

.start

.loop

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

…………

b loop ; ;調到loop

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

程序將一直在loop這里循環(相當于while循環),“mov r1,#0x01”永遠得不到執行。

(2)bl為帶連接的分支指令(branch and link),跳轉前把返回地址放入lr中,以便用于函數調當程序從當前位置調到分支程序中執行,執行完分支程序將再返回到當前位置的下一條指令處繼續執行。例如:

.start

.loop

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

…………

bl loop ;調到loop

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

程序執行完loop后調到下一行的“mov r1,#0x01”處執行。

8、浮點數指令

浮點數指令很多,常用指令有abs、cmf、dvf、mvf、muf、ldf、suf、adf幾個指令,用于處理浮點數的加載、加、減、乘、除。

9、偽指令

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

六、常用GNU偽指令

global _start @ 給_start外部鏈接屬性

.section .text @ 指定當前段為代碼段

.ascii .byte .short .long .word

.quad .float .string @ 定義數據

.align 4 @ 以4字節對齊

.balignl 16 0xabcdefgh @ 16字節對齊填充

.equ @ 類似于C中宏定義

.end @標識文件結束

.include @ 頭文件包含

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

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

ldr 大范圍的地址加載指令

adr 小范圍的地址加載指令

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

nop 空操作

七、常用的8種尋址方式的指令實現

1、寄存器尋址

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

mov r1, r2 ;r1 = r2

2、立即(立即數)尋址

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

mov r0, #0xff00 ; r0 = 0xff00

3、寄存器移位尋址

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

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

4、寄存器間接尋址

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

ldr r0, [r1] ;將內存地址存在r1這個寄存器中的內存地址里的值給r0

5、基址尋址

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

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

6、塊拷貝尋址

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

STMIAR0!,{R1-R7} ;將R1~R7的數據保存到存儲器中

7、多寄存器尋址

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

ldmia r1!, {r2-r7, r12} ;一次訪問多個寄存器

8、堆棧尋址

堆棧是一種數據結構,按先進后出的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。例子,

stmfd sp!, {r2-r7, lr}

八、常用指令后綴

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

1、B(byte)功能不變,操作長度變為8位

2、H(half word)功能不變,長度變為16位

3、S(signed)功能不變,操作數變為有符號

4、條件執行后綴

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

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

條件執行后綴,可以參看下表例。特點是條件后綴是否成立取決于當前代碼的前面的代碼,只影響當前代碼的執行。

ARM指令集

感嘆號的作用就是r0的值在ldm過程中發生的增加或者減少后寫回到r0去,也就是說ldm時會改變r0的值。例如,

ldmia r0, {r2 - r3} ;不會改變r0的值

ldmia r0!, {r2 - r3} ;會改變r0的值

^的作用是在目標寄存器中有pc時,會同時將spsr寫入到cpsr,一般用于從異常模式返回。

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

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

九、ARM指令應用舉例

這里就ARM應用舉一個例子,使用ARM指令操作簡單的硬件(點亮LED燈)。FS210開發板LED燈如下圖所示,

ARM指令集

要想控制這些器件,我們需要查看其對應的原理圖。LED原理圖如下

ARM指令集

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

ARM指令集

打開S5PV210用戶手冊,找到GPIO章節的數據寄存器與控制寄存器的描述。結合GPIO寄存器的描述編寫匯編程序。

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

#define GPC0_DAT 0XE0200064 ;定義GPC0數據寄存器地址

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 ;將立即數0x18加載到r1

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

stop:

b stop ;死循環(相當于while(1))

交叉編譯并下載到FS210開發板上運行,LED燈被點亮。

ARM指令集

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

下一篇:嵌入式硬件開發怎么學

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 无码中文人妻在线一区二区三区 | 国产欧洲精品自在自线官方 | 日出水了特别黄的视频 | 国产美女被遭高潮免费网站 | 亚洲国产av无码专区亚洲avl | 中文日产日产乱码乱偷在线 | 伊人综合久久 | "亚洲国产精品一区二区久久 亚洲午夜" | AV一本久道久久波多野结衣 | 亚洲色婷婷六月亚洲婷婷6月 | 內射XXX韩国在线观看 | 巨爆乳寡妇中文在线观看 | 中文字日产幕码三区的做法大全 | 亚洲女同成av人片在线观看 | 狠狠爱俺也去去就色 | 久久免费看黄A级毛片连期A片 | 国产精品久久久久不卡绿巨人 | 日本免费精品一区二区三区 | 婷婷色婷婷开心五月 | 美女内射毛片在线看免费人动物 | 国产熟妇的荡欲午夜视频 | 麻豆av影视 | 正在播放国产多P交换视频 亚洲欧美闷骚少妇影院 | 久久午夜夜伦鲁鲁片免费无码 | 99久久久成人国产精品免费 | 手机在线看片亚洲 | 日日噜噜夜夜狠狠久久无码区 | 学生在线精品一区二区 | 久久久国产精品免费A片 | 中国女人内谢25XXXXX | 日韩精品亚洲人成在线 | 国产精品一区亚洲二区日本三区 | 最近高清中文在线国语字幕 | GOGOGO免费高清看中国国语 | 少妇人妻偷人精品无码视频新浪 | 99视频精品全部在线观看 | 性一交一乱一伦一色一情孩交 | 性色黄| sis色中色| 精品国产一区二区三区色欲 | 国产高清吃奶成免费视频网站 |