崩潰分析匯編基礎

棧、調用棧、棧幀

在當今多數計算機體系架構中,函數的參數傳遞、局部變量的分配和釋放都是通過操縱棧來實現的。

Stack Frame

每次調用一個函數,都要為該次調用的函數實例分配棧空間。為單個函數分配的那部分棧空間就叫做棧幀。關于Stack Frame 更詳細的內容請查看Peeking Stack Frame

Call Stack

調用棧就是正在使用的棧空間,由多個嵌套調用函數所使用的棧幀組成。具體來說,Call Stack 就是指存放某個程序的正在運行的函數的信息的棧。Call Stack 由 Stack Frames 組成,每個 Stack Frame 對應于一個未完成運行的函數。

在內存中,棧是從高地址向低地址延伸的,即棧底對應高地址,棧頂對應低地址。

幾個重要的寄存器

  • SP寄存器(x31/arm64,r11/armv7), Stack Pointer, 指向棧低的指針.
  • PC寄存器(r15/armv7), Program Counter, 記錄當前執行的代碼的地址. 它是一個隱含的寄存器, 無法被直接訪問, 只能被特定的指令隱含訪問.
  • LR寄存器 (x30/arm64,r14/armv7), Link Register, 指向返回地址, 即return時回到的地址.
    *FP寄存器 (x29/arm64,r11/armv7), Frame Pointer, 指向上一次方法調用的frame的最高位地址, frame位于棧上。
在i386 下,對應的寄存器有:
ESP 寄存器為 Stack Pointer ,它始終指向棧頂的位置。
EIP 寄存器為返回地址,它是調用函數( Caller )在執行完 Call 指令后的下一條指令的地址。
EBP 寄存器為 Frame Pointer

Frame

frame其實就是一個按照方法調用順序, 從棧的高地址向低地址依次存放的一組數據。stack frame的兩個邊界分別由FP和SP來限定:


常用指令

b 跳轉到地址(無返回), 不會改變LR寄存器的值
bl 跳轉到地址(有返回), 會改變LR寄存器的值為返回地址
ldr/ldur 地址對應的內容加載到寄存器
str/stur 寄存器內容存儲到內存地址
cbz/cbnz 為零跳轉到地址/不為零跳轉到
add 加法運算
mov 寄存器之間內容移動
ldp/stp 從棧取/存數據
adrp, 用來定位數據段中的數據用, 因為aslr會導致代碼及數據的地址隨機化, 用adrp來根據pc做輔助定位
ldp 命令能一次獲取給兩個寄存器賦值。

add x0,x0,#1             x0 = x0 + 1
add x0,x0,#0x30          x0 = x0 + 0x30
add x0,x1,x3             x0 =x1+x3
add x0,x1,[x2]           x0 =x1+[x2], 把x1的內容加上x2的內容作為地址取內存內容放入x0
ldr x0,[x1]              x0 =[x1], 把x1的內容作為地址取內存內容放入x0
str x0,[x1]              *x1 = x0 , 把x0的內容放入,x1的內容作為地址的內存中
ldr x0,[x1,#4]           x0 =[x1+4], 把x1的內容加上4, 作為內存地址, 取其內容放入x0
ldr x0,[x1],#4           x0 =[x1] 、x1 =x1+4, 把x1的內容作為內存地址取內存內容放入x0, 并把x1的內容加上4放入x1
ldr x0,[x1,x2]           x0 =[x1+x2], 把x1和x2的內容相加, 作為內存地址取內存內容放入x0

調用約定

31個 64位的通用(整數)寄存器, 在A64指令集里 全部可見,分別是r0-r30
在64位環境中, 這些寄存器 一般用x0-x30的名字
在32位環境中, 這些寄存器 使用 w0-w30的名字


Screen Shot 2017-05-07 at 10.32.02 AM.png

相關更多信息點擊查看
在iOS 上參數傳遞的順序:self ,selector ,param....

x0 存self, 另外,x0也可以作為函數返回值時候的寄存器。
x1 selector 
x2,x3,x4 參數

根據文檔5.4.2,stage B 里面說到,當參數是一個大于16 bytes 的復合類型,caller會分配內存保存參數。然后這個內存地址的值會存入寄存器x8。callee可以隨時修改x8 上的數據。

FYI
* callee: 指向正在執行的函數
* caller: 指向調用當前函數的函數 

To be continue .....

Ref:
Assemble Language Function Calls
objc-msg-arm64
Procedure Call Standard for the ARM 64-bitArchitecture
ARM 64 bit mode

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容