.jsp后缀语言_ARM汇编语言入门(三)
Part 3 ARM指令集
ARM模式和Thumb模式
ARM處理器主要有兩種工作模式(先不算Jazelle)-ARM狀態(tài)和Thumb狀態(tài)。這些狀態(tài)模式與權(quán)限級別無關(guān),它們主要區(qū)別是指令集,在ARM模式下指令集始終是32-bit,但是在Thumb模式下可以是16-bit或者32-bit。學(xué)會怎么使用Thumb模式對于ARM開發(fā)很重要。編寫ARM殼代碼時(shí),我們需要避免NULL字節(jié),使用16位Thumb指令而不是32位ARM指令可以降低這種風(fēng)險(xiǎn)。ARM各版本的調(diào)用規(guī)范容易讓人混淆,不是所有的ARM版本都支持相同的Thumb指令集。后來,ARM 引入了增強(qiáng)的 Thumb 指令集(偽名稱:Thumbv2),它允許 32 位 Thumb 指令甚至允許條件執(zhí)行,而這在之前的版本中就不行。為了在Thumb中支持條件執(zhí)行,引入了“it”指令。但是,此指令隨后在更高版本中被刪除,并與更簡單的東西進(jìn)行了替換。我不知道所有不同ARM/Thumb指令集的所有不同變體,實(shí)話說,我不關(guān)心。你也最好也別關(guān)心。您只需要知道的是你的目標(biāo)設(shè)備的 ARM 版本及其特定的 Thumb 支持,然后再調(diào)整代碼。ARM 信息中可以幫助您確定ARM 版本的細(xì)節(jié)(http://infocenter.arm.com/help/index.jsp)。
- Thumb-1(16 位指令):在ARMv6和更早的體系結(jié)構(gòu)中使用。
- Thumb-2(16 位和 32 位指令):在Thumb-1基礎(chǔ)上添加更多指令并允許它們?yōu)?16 位或 32 位寬(ARMv6T2、ARMv7)。
- ThumbEE:更改和添加了一些支持動態(tài)生成代碼的功能(在執(zhí)行之前或執(zhí)行期間在設(shè)備上編譯代碼)。
ARM模式和Thumb模式的態(tài)區(qū)別:
- 條件執(zhí)行:在ARM模式下所有的指令都支持條件執(zhí)行。一些版本的ARM處理器可以通過it指令在Thumb工作模式下支持條件執(zhí)行。
- ARM和Thumb模式下的32-bit指令:在Thumb模式下的32-bit指令有.w后綴。
- 桶型位移器(barrel shifter)是ARM模式下的另一個(gè)特點(diǎn)。它可以將多條指令縮減為一條。例如,你可以通過向左位移1位的指令后綴將乘法運(yùn)算直接包含在一條MOV指令中(將一個(gè)寄存器的值乘以2,再將結(jié)果MOV到另一個(gè)寄存器):MOV R1, R0, LSL#1 ;R1 = R0 * 2,而不需要使用專門的乘法指令來運(yùn)算。
要切換處理器在其中執(zhí)行的狀態(tài),必須滿足以下兩個(gè)條件之一:- 我們可以使用分支指令 BX(分支和切換狀態(tài))或 BLX(分支、鏈接和切換狀態(tài)),并將目標(biāo)寄存器的最小有效位設(shè)置為 1??梢酝ㄟ^偏移量加1來實(shí)現(xiàn),例如0x5530+1。您可能會認(rèn)為這將導(dǎo)致對齊問題,因?yàn)橹噶钍?2 或 4 字節(jié)對齊的。這不是問題,因?yàn)樘幚砥鲗⒑雎宰畹陀行弧T斠奝art 6:條件執(zhí)行和分支。
- 如果當(dāng)前程序狀態(tài)寄存器的T位被置位,就說明工作在Thumb模式下。
ARM指令簡介
本節(jié)簡單介紹ARM指令集以及基本用法。了解匯編語言中的最小部分如何操作,它們之間如何銜接,它們之間能組合成什么樣的功能。
ARM指令后面通常跟著兩個(gè)操作數(shù),像下面這樣的形式:
MNEMONIC{S}{condition} {Rd}, Operand1, Operand2由于ARM指令集的靈活性,并不是所有的指令都用到這些字段。這些字段的解釋如下:
MNEMONIC - 操作指令(機(jī)器碼對應(yīng)的助記符)。 {S} - 可選后綴. 如果指定了該后綴,那么條件標(biāo)志將根據(jù)操作結(jié)果進(jìn)行更新。 {condition} - 執(zhí)行指令所需滿足的條件。 {Rd} - 目標(biāo)寄存器,存儲操作結(jié)果。 Operand1 - 第一操作數(shù)(寄存器或者立即數(shù)) Operand2 - 第二操作數(shù). 立即數(shù)或者帶有位移操作后綴(可選)的寄存器。MNEMONIC, S, Rd和Operand1字段比較明了,condition 和 Operand2字段需要再解釋一下。condition字段與CPSR寄存器的值有關(guān),準(zhǔn)確的說是和CPSR某些位有關(guān)。Operand2也叫可變操作數(shù),因?yàn)樗梢杂卸喾N形式--立即數(shù)、寄存器、帶有位移操作的寄存器。例如Operand2可以有以下多種形式:
#123 - 立即數(shù)。 Rx - 寄存器x (如 R1, R2, R3 ...)。 Rx, ASR n - 寄存器x,算術(shù)右移n位 (1 = n = 32)。 Rx, LSL n - 寄存器x,邏輯左移n位 (0 = n = 31)。 Rx, LSR n - 寄存器x,邏輯右移n位 (1 = n = 32)。 Rx, ROR n - 寄存器x,循環(huán)右移n位 (1 = n = 31)。 Rx, RRX - 寄存器x,擴(kuò)展的循環(huán)位移,右移1位。讓我們以一個(gè)簡單的例子看一下這些指令的不同:
ADD R0, R1, R2 - 將寄存器R1內(nèi)的值與寄存器R2內(nèi)的值相加,結(jié)果存儲到R0。 ADD R0, R1, #2 - 將寄存器R1內(nèi)的值加上立即數(shù)2,結(jié)果存儲到R0。 MOVLE R0, #5 - 僅當(dāng)滿足條件LE(小于或等于)時(shí),才將立即數(shù)5移動到R0(編譯器會把它看作MOVLE R0, R0, #5)。 MOV R0, R1, LSL #1 - 將寄存器R1的內(nèi)容向左移動一位然后移動到R0(Rd)。因此,如果R1值是2,它將向左移動一位,并變?yōu)?。然后將4移動到R0。來快速總結(jié)一下,看一下后續(xù)示例中將涉及的一些常用指令:
<end>
總結(jié)
以上是生活随笔為你收集整理的.jsp后缀语言_ARM汇编语言入门(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: awk -f 分隔符 命令_千面 awk
- 下一篇: cdh sqoop 配置_相比于手动搭建