補坑計劃——ARM(一)

開始進入移動安全這個坑的時候,並沒有好好看ARM彙編。依靠x86的基礎和ARM手冊,各種博客上零星的知識點外加搜索引擎也就這麼過來了。最近想稍微抽空重新過一遍ARM彙編,查漏補缺,或者應該算女媧補天。。。


處理器工作模式

用戶模式(usr):正常的程序執行狀態

快速中斷模式(fiq):用於高速數據傳輸或者通道處理

外部中斷模式(irq):用於通用的中斷處理

管理模式(svc):保護模式

中斷模式(abt):當指令或者數據預取終止時進入,用於虛擬存儲及存儲保護

未定義指令模式(und):當未定義的指令執行時進入該模式,用於支持硬件協處理器的軟件仿真(後半段看不懂)

系統模式(sys):具有特權的操作系統任務


處理器工作狀態

ARM狀態:執行32位的ARM指令集

Thumb狀態:執行16位Thumb指令集


ARM寄存器

31個通用寄存器,6個狀態寄存器

最多可有18個活動寄存器(16個數據寄存器和2個處理器狀態寄存器)


通用寄存器

R0~R15

1、未分組寄存器:

R0~R7,在所有工作模式下,都指向同一個物理寄存器

2、分組寄存器:

R8~R14,每一次所訪問的物理寄存器與處理器的工作模式有關


R8~R12對應兩個不同的物理寄存器,fiq狀態下使用Rx_fiq,其他狀態下Rx_usr

R13和R14各對應6中不同的物理寄存器,用戶模式和系統模式共用,其他狀態下各一個。

R13常用做堆棧指針,用戶也可以使用其他寄存器作爲堆棧指針,在Thumb指令集中,某些指令強制使用R13做堆棧指針。

由於每種狀態各有一個R13,在應用程序初始化部分,一般初始化每種模式的R13,相當於分配了不同模式的棧空間,便於保存程序運行狀態。

R14作子程序連接寄存器,或連接寄存器LR。當執行BL子程序調用時,得到PC寄存器的備份。當發送中斷或異常時,對應的分組寄存器保存R15的返回值。

3、程序寄存器

R15


狀態寄存器

ARM體系有一個當前程序狀態寄存器CPSR(R16)和5個備份的程序狀態寄存器(SPSRs)。



Thumb寄存器

Thumb狀態下寄存器是ARM狀態下子集,可直接訪問R0~R7、PC(R15)、SP(R13)、LR(R14)和CPSR



指令格式

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

<>必不可少,{}可選

<opcode>指令符

{<cond>}執行條件

{S}是否影響狀態寄存器

<Rd>目的寄存器

<Rn>第一個操作數,爲寄存器

<OP2>第二個操作數,可以是立即數、寄存器和寄存器移位操作符


指令可選後綴

S後綴,條件標誌位將會刷新,如是否溢出,是否進位

SUB R1,R0,R3
R0減R3,結果保存到R1

SUBS R1, R0,R3
R0減R3,結果保存到R1,影響標誌位


! 後綴,基址寄存器中的地址值發生變化

LDR  R3,[R0,#4]
R0加4做地址指針,將數據保存到R3

LDR  R3,[R0,#4] !
R0加4做地址指針,將數據保存到R3,R0的值變爲原值加4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章