閑扯ARM指令集一
由於最近在研究ARM的VMP方案與ARM模擬執行技術,所以每天都要苦逼著看ARM的文檔,我在這裡做個簡單的小結。
ARMv7 同時支持兩種主要的指令集:ARM和Thumb 指令集。
ARM與Thumb指令集的區別
- Thumb 指令集指令長度:16或32,16位為主
- Thumb-16 大部分只能訪問前8個寄存器 R0-R7(少數可以訪問R8-R15)
- Thumb-32 可以訪問所有的ARM core 寄存器 R0-R15
- ARM 指令集都是32位的,內存中4位元組對齊
ARM和Thumb 指令集能自由的切換,怎麼切換呢?
處理器無論在ARM還是Thumb狀態下都可以通過BX/BLX/LDR /LDM 切換不同的指令集。
條件執行
ARM和Thumb的大部分指令都是可以「條件執行」,顧名思義就是需要滿足某種條件指令才會執行否則等效於空指令。
ARM中有一個特殊的寄存器:APSR寄存器,APSR寄存器叫做標誌寄存器,裡面的每一項二進位位都賦予了一定的意義。
其中比較著名的:N,Z,C,V 條件標誌,指令中有一個cond 描述欄位,用於描述指令執行的條件,只有執行條件與APSR的條件標誌寄存器滿足,那麼執行會執行。否則就是一條NOP!NOP!NOP!
Thumb指令集的條件執行實現原理稍微有點複雜,不過大部分還是和ARM指令相同,只有少部分不同(例如:CBZ/CBNZ / 16-bit If-Then instruction 這些指令)
ARM指令集編碼格式
cond 欄位:條件執行碼
如果cond = 1111,指令只會被無條件執行。
條件碼的含義如下:
op1 欄位與op共同定義了「指令類別」對應關係如下(表示0 or 1任意)
今天就到這裡吧~明天繼續!
推薦閱讀:
※自動化二進位文件分析框架:angr
※那些年病毒用過的損招——攻擊調試器
※安卓逆向入門(一)
※演算法逆向1——簡單演算法逆向
※GCHQ 對卡巴斯基實驗室的商業軟體進行逆向工程,卡巴斯基實驗室是否可以提起法律訴訟?