開始進入移動安全這個坑的時候,並沒有好好看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