日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ARM指令系统

發(fā)布時間:2024/1/4 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 ARM指令系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ARM指令系統(tǒng)

ARM指令的分類

跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(PSR)傳輸指令Load/Store指令、協(xié)處理器指令異常產(chǎn)中斷產(chǎn)生指令,6大類。

ARM指令編碼格式

ARM指令字長為固定的32位,一條典型的ARM指令編碼格式如下:

cond  指令執(zhí)行的條件編碼;

opcode  指令操作符編碼;

S  決定指令的操作是否影響CPSR的值;

Rd  目標(biāo)寄存器編碼;

Rn  包含第1個操作數(shù)的寄存器編碼;

operand2  表示第2個操作數(shù);

ARM指令語法格式

一條典型的ARM指令語法格式如下

<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

其中:

cond:指令執(zhí)行的條件,如EQ、NE等;

opcode:指令助記符,如ADD、LDR、STR等;

S:決定指令的操作是否影響CPSR寄存器的值;

Rd:目標(biāo)寄存器;

Rn:第一個操作數(shù)的寄存器;

operand2:第二個操作數(shù);

<>內(nèi)的項(xiàng)是必選項(xiàng),{}內(nèi)的項(xiàng)是可選項(xiàng),{<cond>}為指令執(zhí)行條件,是可選的,如果不寫則使用默認(rèn)條件AL(無條件執(zhí)行)。

指令的條件碼<cond>的含義和助記符

ARM指令尋址方式

尋址方式:處理器根據(jù)指令中給出的地址信息來尋找物理地址的方式。

1. 數(shù)據(jù)處理指令的操作數(shù)的尋址方式

數(shù)據(jù)處理指令的格式:

<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

立即數(shù)尋址

每個立即數(shù)由一個8位的常數(shù)循環(huán)右移偶數(shù)位得到。其中循環(huán)右移的位數(shù)由一個4位二進(jìn)制的兩倍表示。如果立即數(shù)記作<immediate>8位常數(shù)記作immed_8,4位的循環(huán)右移值記作rotate_imm,則有<immediate> =immed_8 循環(huán)右移(2*rotate_imm),這樣并不是每一個32位的常數(shù)都是合法的立即數(shù),只有能夠通過上面構(gòu)造方法得到的才是合法的立即數(shù)。(具體怎么算的暫不深究,知道有這么回事就行)按照上面的構(gòu)造方法,一個合法的立即數(shù)可能有多種編碼方式。由于這種立即數(shù)的構(gòu)造方法中包含了循環(huán)移位操作,而循環(huán)移位操作會影響CPSR的條件標(biāo)志位C。因此,同一個合法的立即數(shù)由于采用了不同的編碼方式,將使某些指令的執(zhí)行產(chǎn)生不同的結(jié)果,這顯然shiite不能允許的。ARM匯編編譯器按照下面的的規(guī)則來生成立即數(shù)的編碼。

當(dāng)立即數(shù)值在0和0xFF范圍時,令immed_8 =<immediate>,rotate_imm = 0;
其他情況下,匯編編譯器選擇使rotate_imm數(shù)值最小的編碼方式;

對立即數(shù)尋址簡單的理解方式:

操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)。

在以上兩條指令中,第二個操作數(shù)即為立即數(shù),要求以“#”為前綴,對于以十六進(jìn)制表示的立即數(shù),還要求在"#"后加上"0x""&"。

寄存器尋址

利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是各類微處理其經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。

MOV R3,R2  ;將R2的數(shù)值放到R3中

ADD R0,R1,R2  ;將寄存器R1和R2的內(nèi)容相加,其結(jié)果存放在寄存器R0中

寄存器移位尋址

ARM指令集特有的尋址方式,當(dāng)?shù)?操作數(shù)是寄存器移位方式時,第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。

MOV R0,R2,LSL #3  ;該指令將R2的值左移3位,結(jié)果放入R0。

可采用的一位操作如下:

LSL:邏輯左移(logicalshiftleft),寄存器中字的低端空出的位補(bǔ)0;

LSR:邏輯右移(logicalshiftright),寄存器中的高端空出的位補(bǔ)0;

ASR:算術(shù)右移(arithmeticshiftright),移位過程中保持符號位不變,即如果源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ)0,否則補(bǔ)1。

ROR:循環(huán)右移(rotateright),由字的低端移出的位填入字的高端空出的位。

RRX:帶擴(kuò)展的循環(huán)右移(rotaterightextendedbylplace),操作數(shù)右移一位,高端空出的位用原C標(biāo)志值填充。

2. 字及無符號字節(jié)的Load/Store指令的尋址方式

Load指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中;Store指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存。Load/Store指令的尋址方式由兩部分組成,一部分為一個基址寄存器,另一部分為一個地址偏移量基址寄存器可以為任一個通用寄存器;

地址偏移量可以有以下三種格式:

立即數(shù)  立即數(shù)可以是一個無符號的數(shù)值,這個數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值;

寄存器  寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值;

寄存器及一個移位常數(shù)  這種格式由一個通用寄存器和一個立即數(shù)組成,寄存器中的數(shù)值可以根據(jù)指令中的移位標(biāo)志及移位常數(shù)作一定的移位操作生成一個地址偏移量。這個地址偏移量可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值;

尋址方式的地址計(jì)算方法也有三種:

偏移量方法  基址寄存器中的值和地址偏移量作加減運(yùn)算,生成操作數(shù)的地址;

事先更新方法  基址寄存器中的值和地址偏移量作加減運(yùn)算,生成操作數(shù)的地址;指令執(zhí)行后,這個生成的操作數(shù)地址被寫入基址寄存器;

事后更新方法  指令將基址寄存器的值作為操作數(shù)的地址執(zhí)行內(nèi)存訪問?;芳拇嫫髦械闹岛偷刂菲屏孔黾訙p運(yùn)算,生成操作數(shù)的地址;指令執(zhí)行后,這個生成的操作數(shù)地址被寫入基址寄存器;

寄存器間接尋址

以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲器中。

在第一條指令中,以寄存器R2的值作為操作數(shù)的地址,在存儲器中取得一個操作數(shù)后與R1相加,結(jié)果存入寄存器R0中。

指令將以R1的值為地址的存儲器中的數(shù)據(jù)傳送到R0中。

基址變址尋址

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

在第一條指令中,將寄存器R1的內(nèi)容加上4形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中;

在第二條指令中,將寄存器R1的內(nèi)容加上4形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中,然后,R1的內(nèi)容自增4個字節(jié);

在第三條指令中,以寄存器R1的內(nèi)容作為操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中,然后,R1的內(nèi)容自增4個字節(jié);

在第四條指令中,將寄存器R1的內(nèi)容加上寄存器R2的內(nèi)容形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中;

3. 雜類Load/Store指令的尋址方式

4. 批量Load/Store指令的尋址方式

5.協(xié)處理器Load/Store指令的尋址方式

總結(jié)

以上是生活随笔為你收集整理的ARM指令系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。