ARM指令系统
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)的項是必選項,{}內(nèi)的項是可選項,{<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),寄存器中字的低端空出的位補0;
LSR:邏輯右移(logicalshiftright),寄存器中的高端空出的位補0;
ASR:算術(shù)右移(arithmeticshiftright),移位過程中保持符號位不變,即如果源操作數(shù)為正數(shù),則字的高端空出的位補0,否則補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ù)值;
尋址方式的地址計算方法也有三種:
偏移量方法 基址寄存器中的值和地址偏移量作加減運算,生成操作數(shù)的地址;
事先更新方法 基址寄存器中的值和地址偏移量作加減運算,生成操作數(shù)的地址;指令執(zhí)行后,這個生成的操作數(shù)地址被寫入基址寄存器;
事后更新方法 指令將基址寄存器的值作為操作數(shù)的地址執(zhí)行內(nèi)存訪問。基址寄存器中的值和地址偏移量做加減運算,生成操作數(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é)
- 上一篇: 返利网如何返利(返利网怎么盈利)
- 下一篇: VirtualBox下安装ubuntu图