ARM指令集(数据处理指令)
ARM指令集可以分為數(shù)據(jù)處理指令、跳轉(zhuǎn)指令、Load/Store指令、程序狀態(tài)寄存器傳輸指令、協(xié)處理器指令和異常中斷產(chǎn)生指令。根據(jù)使用的指令類型不同,指令的尋址方式分為數(shù)據(jù)處理指令尋址方式和內(nèi)存訪問(wèn)指令尋址方式。
數(shù)據(jù)處理指令尋址方式
概述:數(shù)據(jù)操作指令是指對(duì)存放在寄存器中的數(shù)據(jù)進(jìn)行操作的指令。主要包括數(shù)據(jù)傳送指令、算術(shù)指令、邏輯指令、比較與測(cè)試指令及乘法指令。如果在數(shù)據(jù)處理指令后使用“S”后綴,指令的執(zhí)行結(jié)果將會(huì)影響CPSR中的標(biāo)志位。數(shù)據(jù)處理指令的基本語(yǔ)法格式如下:
1.MOV指令
MOV是最簡(jiǎn)單的ARM指令,MOV指令是將《shifter_operand》表示的數(shù)據(jù)傳送到目標(biāo)寄存器《Rd》中,其中《shifter_operand》可以是寄存器,也可以使立即數(shù),并根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例:
MOV R0,#0xFF ; //R0=0xFF MOV R0,RO ; //R0=R0.....NOP指令 MOV RO,RO,LSL#3; //RO=RO<<3當(dāng)R15作為目標(biāo)寄存器Rd出現(xiàn)時(shí)常用于子函數(shù)的返回,方法是將連接寄存器LR中保存的返回地址通過(guò)該指令傳送給PC。
MOV PC,R14; //退出到調(diào)用者,用于普通函數(shù)返回,PC即R15 MOVS PC,R14; //退出到調(diào)用者并恢復(fù)標(biāo)志位,用于異常函數(shù)返回指令功能:
- 將數(shù)據(jù)從一個(gè)寄存器傳送到另一個(gè)寄存器。
- 將一個(gè)常數(shù)值傳送到另一個(gè)寄存器。
- 實(shí)現(xiàn)單純的移位操作,比如操作數(shù)除以2^n可以用右移n位來(lái)實(shí)現(xiàn)。
- 當(dāng)PC(R15)用作目標(biāo)寄存器Rd時(shí),可以實(shí)現(xiàn)程序跳轉(zhuǎn),如“MOV PC,LR”。這種跳轉(zhuǎn)可以實(shí)現(xiàn)子程序條用及從子程序返回。
- 當(dāng)PC作為目標(biāo)寄存器Rd且指令中有后綴“S”時(shí),則指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí),將當(dāng)前處理器模式的SPSR寄存器的內(nèi)容復(fù)制到CPSR中。這種指令“MOVS PC,LR”,可以實(shí)現(xiàn)從某些異常中斷中返回。
2.MVN指令
MVN是數(shù)據(jù)取反傳送指令,指令將《shifter_operand》表示的數(shù)據(jù)的反碼傳送到目標(biāo)寄存器《Rd》,并根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例:
MVN指令和MOV指令相同,《shifter_operand》可以是立即數(shù),也可以是寄存器。
指令功能:
- 想寄存器中傳送一個(gè)負(fù)數(shù)。
- 生成位掩碼。
- 求一個(gè)數(shù)的反碼。
3.ADD指令
ADD指令將《shifter_operand》表示的數(shù)據(jù)加上寄存器《Rn》的值,將結(jié)果保存到目標(biāo)寄存器《Rd》中,并根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例:
ADD R0,R1,R2; //R0=R1+R2 ADD R0,R1,#0xFF; //R0=R1+0xFF ADD R0,R2,R3,LSL#1; //R0=R2+(R3<<1)指令功能:
- 主要完成兩個(gè)數(shù)的相加。
4.ADC指令
ADC指令將《shifter_operand》表示的值加上寄存器《Rn》的值,再加上CPSR中的C條件標(biāo)志位的值,將結(jié)果保存到目標(biāo)寄存器《Rd》中,并根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例:
ADC指令把兩個(gè)操作數(shù)加起來(lái),并把結(jié)果放置到目標(biāo)寄存器《Rd》中。它使用CPSR中的進(jìn)位標(biāo)志位,這樣就可以做比32位大的加法。
下面的例子將兩個(gè)128位的數(shù)相加。
128位結(jié)果:寄存器R0、R1、R2和R3.
第1個(gè)128位數(shù):寄存器R4、R5、R6和R7
第2個(gè)128位數(shù):寄存器R8、R9、R10和R11
指令功能:
ADC指令常與ADD指令聯(lián)合使用,可以實(shí)現(xiàn)兩個(gè)64位數(shù)的相加。
5.SUB 指令
SUB指令的作用是將寄存器《Rn》中的數(shù)值減去《shifter_operand》所表示的數(shù)值,將運(yùn)算結(jié)果保存到目標(biāo)寄存器《Rd》中,并根據(jù)指令的執(zhí)行結(jié)果更新CPSR中的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例:
SUB R0,R1,R2; //R0=R1-R2 SUB R0,R1,#0xff; //R=R1-0xff SUB R0,R2,R3,LSL#1; //R0=R2-(R3<<1)指令功能:
SUB指令常用于實(shí)現(xiàn)兩個(gè)數(shù)的減法。
6.AND指令
AND指令將《shifter_operand》表示的數(shù)值與寄存器《Rn》的值按位做“與”操作,并將結(jié)果保存到目標(biāo)寄存器《Rd》中,同時(shí)根據(jù)操作的結(jié)果更新CPSR寄存器中的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例
AND R0,R0,#0x03; //r0寄存器的0、1位不變,其他位清零 AND R2,R1,R3; //R2=R1 & R3 AND R0,R0,#0x01; //R0=R0 & 0X017.EOR指令
EOR指令將寄存器《Rn》中的值和《shifter_operand》表示的值進(jìn)行按位“異或”操作,并將執(zhí)行結(jié)果存儲(chǔ)到目標(biāo)寄存器《Rd》中,同時(shí)根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。
語(yǔ)法格式:
指令舉例:
EOR R0,R0,#3; //反轉(zhuǎn)R0中的第0和1位 EOR R1,R1R,#0x0F; //將R1的低4位取反 EOR R2,R1,R0; //R2=R1^R0 EORS R0,R5,#0X01; //將R5和0x01進(jìn)行邏輯異或,結(jié)果保存到R0,并根據(jù)執(zhí)行結(jié)果更新標(biāo)志位。8.BIC指令
BIC位清零指令,將寄存器《Rn》的值與第2個(gè)源操作數(shù)《shifter_operand》的值的反碼按位做“邏輯與”操作,結(jié)果保存到寄存器《Rd》中。
語(yǔ)法格式:
指令舉例:
BIC R0,R0,#0X1011; //清除R0中的位0、1和3,保持其余不變 BIC R1,R2,R3; //將R3的反碼和R2邏輯與,結(jié)果保存到R1中9.CMP指令
CMP指令的實(shí)質(zhì)是使用寄存器《Rn》的值減去《shifter_operand》表示的值,根據(jù)操作的結(jié)果更新 CPSR 中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。
語(yǔ)法格式:
指令舉例:
CMP指令允許把一個(gè)寄存器的內(nèi)容與另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行比較,比較結(jié)果將更改狀態(tài)寄存器中對(duì)應(yīng)的標(biāo)志從而之后的指令可以進(jìn)行條件執(zhí)行。它的實(shí)質(zhì)是進(jìn)行了一次減法,但不存儲(chǔ)結(jié)果,而是更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1與操作數(shù)2比較的結(jié)果(其值可能為大、小、相等)。比如操作數(shù)1大于操作數(shù)2,則此后的有GT后綴的指令將可以執(zhí)行。
顯然,CMP不需要顯式地指定S后綴來(lái)更改狀態(tài)標(biāo)志。
通過(guò)上面的例子可以看出,CMP 指令與SUBS 指令的區(qū)別在于 CMP指令不保存運(yùn)算結(jié)果,在進(jìn)行兩個(gè)數(shù)據(jù)大小判斷時(shí),常用CMP指令及相應(yīng)的條件碼來(lái)進(jìn)行操作.
總結(jié)
以上是生活随笔為你收集整理的ARM指令集(数据处理指令)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 内核自旋锁
- 下一篇: Unity 渲染管线总结