匯編(三) -- 棧(sp\fp寄存器)

前言

最近準(zhǔn)備學(xué)習(xí)匯編,然后在B站上看到叫iOS小賢的作者發(fā)的視頻挺不錯,打算跟著學(xué)揩魂,文章是看視頻的筆記,最后有原視頻鏈接炮温,想看視頻的可以看看通過鏈接查看視頻火脉。

  • 棧:是一種具有特殊的訪問方式的存儲空間(后進(jìn)先出, Last In Out Firt柒啤,LIFO)

Stack 是由內(nèi)存區(qū)域的結(jié)束地址開始倦挂,從高位(地址)向低位(地址)分配。比如担巩,內(nèi)存區(qū)域的結(jié)束地址是0x8000方援,第一幀假定是16字節(jié),那么下一次分配的地址就會從0x7FF0開始涛癌;第二幀假定需要64字節(jié)犯戏,那么地址就會移動到0x7FB0。

bg2018012215.png

注:用戶主動請求而劃分出來的內(nèi)存區(qū)域拳话,叫做 Heap(堆)先匪。它由起始地址開始,從低位(地址)向高位(地址)增長弃衍。Heap 的一個重要特點就是不會自動消失呀非,必須手動釋放,或者由垃圾回收機(jī)制來回收。所謂的堆棧溢出是指堆棧開辟的空間碰到了一起岸裙,重疊猖败,說明空間不夠了。

SP和FP寄存器

  • sp寄存器在任意時刻會保存我們棧頂?shù)牡刂?
  • fp寄存器也稱為x29寄存器屬于通用寄存器,但是在某些時刻我們利用它保存棧底的地址!()

注意:ARM64開始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp
ARM64里面 對棧的操作是16字節(jié)對齊的!!

注:以前push和pop操作的時候需要對寄存器做保護(hù)降允,也就是sp恩闻。做壓棧的操作sp會挪動,之后需要恢復(fù)的時候sp是需要保護(hù)的拟糕,通過fp保護(hù)∨信唬現(xiàn)在push和pop取消了fp就顯得比較雞肋,但是要兼容32位送滞,這個寄存器還保留著侠草。

關(guān)于內(nèi)存讀寫指令

注意:讀/寫 數(shù)據(jù)是都是往高地址讀/寫

str(store register)指令

將數(shù)據(jù)從寄存器中讀出來,存到內(nèi)存中。

ldr(load register)指令

將數(shù)據(jù)從內(nèi)存中讀出來,存到寄存器中

此ldr 和 str 的變種ldp(pair) 和 stp(pair) 還可以操作2個寄存器犁嗅。

堆棧操作練習(xí)

使用32個字節(jié)空間作為這段程序的棻咛椋空間,然后利用棧將x0和x1的值進(jìn)行交換。

sub sp, sp, #0x20 ;拉伸椆游ⅲ空間32個字節(jié)
stp x0, x1, [sp, #0x10] ;sp往上加16個字節(jié),存放x0 和 x1
ldp x1, x0, [sp, #0x10] ;將sp偏移16個字節(jié)的值取出來,放入x1 和 x0

注:sub是減功蜓,sub sp, sp, #0x20是將ap向底地址挪動32個字節(jié),然后賦值給sp宠蚂。str是將寄存器里面的值放到內(nèi)存中式撼,但是str只能操作一個寄存器,stp可以操作兩個求厕,stp x0, x1, [sp, #0x10]是將x0和x1放在[sp, #0x10]著隆,[sp, #0x10]是一塊內(nèi)存區(qū)域,左邊操作數(shù)加上右邊操作數(shù)呀癣,[sp, #-0x10]就是左邊操作數(shù)減去右邊操作數(shù)美浦。

我們來寫一下

屏幕快照 2019-08-04 下午5.22.02.png

然后A()出打斷點,并進(jìn)入A方法项栏。
我們看到在執(zhí)行完sub sp, sp, #0x20后sp是0x000000016d57b8e0浦辨,然后查看一下
屏幕快照 2019-08-04 下午5.15.21.png

我們來看一下內(nèi)存地址,輸入0x000000016d57b8e0沼沈,看到內(nèi)存開辟了16個字節(jié)的空間流酬,當(dāng)前sp是在6129432800處,前面講到列另,寫內(nèi)存是往高地址寫康吵,所以stp x0, x1, [sp, #0x10]是往高地址寫。

屏幕快照 2019-08-04 下午5.16.10.png

現(xiàn)在我們往x0和x1中寫入0xffffffff访递,再ni。

register write x0 0xffffffff
register write x1 0xffffffff
屏幕快照 2019-08-04 下午5.34.33.png
屏幕快照 2019-08-04 下午5.35.50.png

因為stp x0, x1, [sp, #0x10]所以是從sp加16個字節(jié)出開始存數(shù)據(jù)同辣。

注: add sp, sp, #0x20是為了棧平衡拷姿,如果不這么做惭载,棧會一直往低地址走,最終內(nèi)存不夠用响巢,但是當(dāng)函數(shù)調(diào)用完局部變量是不需要了描滔,所以要回收棧空間踪古。

參考:

棧(sp\fp寄存器)
匯編(四)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末含长,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伏穆,更是在濱河造成了極大的恐慌拘泞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枕扫,死亡現(xiàn)場離奇詭異陪腌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烟瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诗鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人参滴,你說我怎么就攤上這事强岸。” “怎么了砾赔?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵蝌箍,是天一觀的道長。 經(jīng)常有香客問我过蹂,道長十绑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任酷勺,我火速辦了婚禮本橙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脆诉。我一直安慰自己甚亭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布击胜。 她就那樣靜靜地躺著亏狰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偶摔。 梳的紋絲不亂的頭發(fā)上暇唾,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼策州。 笑死瘸味,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的够挂。 我是一名探鬼主播旁仿,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼孽糖!你這毒婦竟也來了枯冈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤办悟,失蹤者是張志新(化名)和其女友劉穎尘奏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誉尖,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡罪既,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铡恕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琢感。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖探熔,靈堂內(nèi)的尸體忽然破棺而出驹针,到底是詐尸還是另有隱情,我是刑警寧澤诀艰,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布柬甥,位于F島的核電站,受9級特大地震影響其垄,放射性物質(zhì)發(fā)生泄漏苛蒲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一绿满、第九天 我趴在偏房一處隱蔽的房頂上張望臂外。 院中可真熱鬧,春花似錦喇颁、人聲如沸漏健。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔫浆。三九已至,卻和暖如春姐叁,著一層夾襖步出監(jiān)牢的瞬間瓦盛,已是汗流浹背洗显。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谭溉,地道東北人墙懂。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像扮念,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碧库,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 寄存器 內(nèi)部部件之間由總線連接 對程序員來說柜与,CPU中最主要部件是寄存器,可以通過改變寄存器的內(nèi)容來實現(xiàn)對CPU的...
    成績是汗閱讀 2,089評論 0 3
  • 棧 棧:是一種具有特殊的訪問方式的存儲空間(后進(jìn)先出嵌灰, Last In Out Firt弄匕,LIFO) SP和FP寄...
    Superman168閱讀 2,485評論 0 2
  • 寄存器種類: 通用寄存器: 64位: X0-X30 32位: W0-W30 是低地址 特殊寄存器: 零寄存器:XZ...
    一川煙草i蓑衣閱讀 2,868評論 0 0
  • 函數(shù)的本質(zhì) 關(guān)于CPU的補(bǔ)充 寄存器 CPU由: 控制器, 計算器和寄存器組成. 其中寄存器的作用就是將數(shù)據(jù)進(jìn)行臨...
    請叫我大帥666閱讀 4,442評論 2 9
  • 以arm64為例 xcode調(diào)試匯編 1. xcode 查看運(yùn)行時的匯編代碼 debug -> debug wor...
    meryin閱讀 2,533評論 1 6