1、Thumb指令與ARM指令
Thumb指令為16位,是以存儲代碼的密度高,節儉存儲空間。然則功效不全,它只是ARM指令(32位)集的彌補,是ARM指令集下的一個子集。在低級階段我們不須要懂得這些常識,只需有個概念曉得有這麼個器械便可以。
2、ARM的存放器初步懂得
R0-R3: 用於函數參數及前往值的傳遞,跨越4個參數,其它參數存在棧中,在ARM中棧是向下發展的,R0還可以作為前往值。
R4-R6, R8,R10-R11: 沒有特別劃定,就是通俗的通用存放器
R7: 棧幀指針,指向母函數與被挪用子函數在棧中的接壤。
R9: 在IOS3.0被操作體系保存
R12: 外部進程挪用存放器,靜態鏈接時會用到,不用深究
R13: SP(stack pointer),是棧頂指針
R14: LR(link register),寄存函數的前往地址。
R15: PC(program counter),指向以後指令地址。
CPSR: 以後法式狀況存放器,在用戶狀況下寄存像condition標記中止禁用等標記的。
別的還有VFP(向量浮點運算)相干的存放器,不在羅列。
3、經常使用匯編
助記符 解釋
ADC 帶進位的加法
ADD 加法
AND 邏輯與
B 分支跳轉,很少零丁應用
BL 分支跳轉,跳轉後前往地址存入r14
BX 分支跳轉,並切換指令形式(Thumb/ARM)
CMP 比擬值,成果存在法式狀況存放器,普通用於分支斷定
BEQ 成果為0則跳轉
BNE 成果不為0跳轉
LDR 加存放器,從內存加載到存放器
LDRB 裝載字節到存放器
LDRH 裝載半字到存放器(一個字是32位)
LSL 邏輯左移這是一個選項,不是指令
LSR 邏輯右移這是一個選項,不是指令
MOV 傳送值/存放器到一個存放器
STR 存儲一個存放器,存放器值存到內存
STRB 存儲一個字節
STRH 存儲一個半字
SUB 減法
PUSH POP 客棧操作
4、函數挪用
函數的參數、部分變量、前往地址都在棧上存著,這部門棧上的內存稱為棧幀。和R0~R15(紛歧定全體)、CPSR等一路組成了函數的運轉情況。每個函數體系都邑分派一個棧幀,履行完成後體系主動發出。每一個函數都認為R0~R15、CPSR等CPU相干存放器為本身一人享有,所以要做一些需要操作。
舉個例子:假定A挪用B時,那末A要保留本身的運轉情況(保留現場),B履行完後,要恢復A的運轉情況(恢復現場);別的A還可以經由過程R0—R4來傳遞參數,參數跨越4個可以經由過程棧,B前往時可以經由過程R0傳遞前往值。個中重要觸及的就是棧的操作和存放器的操作。下圖為函數挪用前後棧的結構,右邊為挪用前,左邊為挪用後,當B前往時應回到右邊狀況(A挪用B之前的狀況,就像沒有挪用B一樣)。
在上圖中,一個棧幀除曾經提到的參數區域(parameter area)、鏈接區域(linkage area)、部分變量存儲區(local storage area)外還有棧幀指針寄存區域(saved frame pointer)、存放器存儲區(saved registers area),棧幀存放器就不再說明,存放器存儲區:保留非易掉存放器(R4,R5,R6,R8,R10,R11),前面的匯編代碼例子會引見。
開端挪用(現場掩護):
1)LR入棧;
2)R7入棧,包存要恢復的存放器入棧;
3)R7 = SP地址;
4)將callee會修正且在前往caller時須要恢復的存放器入棧;
5)分派棧空間給子法式應用。
下圖為匯編代碼(應用hopper disassemble反編譯的代碼),剖析以下:
第一行:將LR, R7, R4-R6入棧;
第二行:r7=sp-0xc(指向old R7),之所以減去0xc由於PUSH後,r4,r5,r6占去12個字節;
第三行:保留要恢復的存放器;
第四行:給以後函數開拓棧空間。
函數前往(恢復現場):
1)釋放棧空間;
2)恢復所保留的存放器;
3)恢復R7;
4)將之前寄存的LR從棧上彈出到PC,如許函數就前往了。
下圖為匯編代碼(應用hopper disassemble反編譯的代碼),剖析以下:
第一行:釋放棧空間;
第二行:恢復保留的存放器;
第三行:恢復保留的存放器,恢復R7,將之前寄存的LR從棧上彈出到PC。
【應用ARM匯編破解iOS法式基本常識分享】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!