初識匯編(三)

函數(shù)的本質(zhì)


關(guān)于CPU的補(bǔ)充

寄存器

CPU由: 控制器, 計算器和寄存器組成. 其中寄存器的作用就是將數(shù)據(jù)進(jìn)行臨時存儲

CPU的運(yùn)行速度非乘钔担快,為了性能CPU會在內(nèi)部開辟一小塊臨時存儲區(qū)域, 并在運(yùn)算時先將數(shù)據(jù)從內(nèi)存復(fù)制到這小塊臨時存儲區(qū)域中, 在這小塊區(qū)域進(jìn)行運(yùn)算,這小塊臨時區(qū)域就稱作寄存器.

  • 對于ARM64架構(gòu)的CPU, 以 X 開頭的就是64位的寄存器, 以 W 開頭的就是32位的寄存器, 其中32位寄存器就是64位寄存器的低32位部分


    Snip20180422_33.png

    Snip20180422_34.png

系統(tǒng)中沒有提供16位 和 8位的寄存器供以訪問(注意: 查看時要使用真機(jī)調(diào)試, 模擬器使用的X86的架構(gòu))

高速緩存

iPhoneX搭載的ARM64處理器A11, 它的一級緩存容量是64KB, 二級緩存容量是8M (現(xiàn)在普遍也只有二級緩存)

CPU每執(zhí)行一條指令都需要從內(nèi)存中將指令讀取到CPU中執(zhí)行, 而寄存器運(yùn)行速度要比內(nèi)存的讀寫速度快很多, CPU還集成了一個高速緩存存儲區(qū)域來提高性能. 當(dāng)程序運(yùn)行時, 先將要執(zhí)行的指令代碼存儲到高速緩存存儲區(qū)域中(由操作系統(tǒng)完成), CPU直接從高速緩存中依次讀取指令來執(zhí)行.


寄存器的補(bǔ)充

數(shù)據(jù)地址存儲器

數(shù)據(jù)地址存儲器通常作為數(shù)據(jù)計算的臨時存儲, 做累加, 計數(shù)地址保存等功能. 這些寄存器的作用主要用于在CPU指令中保存操作數(shù), 在CPU中當(dāng)做常規(guī)變量使用.

ARM64中

  • 64位: X0 - X30 , XZR(零寄存器)
  • 32位: W0 - W30 , WZR(零寄存器)

注意: 8086匯編中有一種寄存器, 段寄存器: CS, ES, DS, SS四個寄存器用來保存段的基地址, 這屬于Intel CPU中, 在ARM中沒有.

浮點(diǎn)和向量寄存器

Snip20180422_35.png

現(xiàn)在CPU支持向量運(yùn)算(向量運(yùn)算在圖形處理中使用比較廣泛), 為支持向量運(yùn)算, 故提供了更多向量寄存器.

  • 向量寄存器: 128位 v0 - v128
Snip20180422_36.png

因為浮點(diǎn)數(shù)以及其運(yùn)算的特殊性, CPU專門提供浮點(diǎn)寄存器來計算浮點(diǎn)數(shù)

  • 浮點(diǎn)寄存器: 64位s0 - s31 和 32位d0 - d31

  • 棧: 是一種具有特殊方式的訪問存儲空間(先進(jìn)后出)


    15193998892055.jpg

sp, fp寄存器

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

注意: ARM64開始取消32位的LDM, STM, PUSH, POP指令. 與之替代的是 ldr/ ldp, str/ stp
ARM64里面 對棧的操作都是16進(jìn)制對齊的!!!

Snip20180424_41.png

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

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

str(store register)寫入指令
將數(shù)據(jù)從寄存器中讀出來, 寫入到內(nèi)存中

ldr(load register)讀取指令
將數(shù)據(jù)從內(nèi)存中讀取出來, 存到寄存器中

ldp/stp 是 ldr/str 的衍生, 可以同時讀/寫兩個寄存器, ldr/str只能讀寫一個

匯編代碼--堆棧操作練習(xí)

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

sub sp, sp, #0x20 ; 拉伸椏敢兀空間32(20 = 2*16)個字節(jié)
stp x0 , x1, [sp, #0x10] ; sp往上加16(10 = 1 * 16)個字節(jié),存放x0 和 x1
ldp x1 , x0, [sp, #0x10] ; 將sp偏移16個字節(jié)的值取出來,放入x1 和 x0

注意: 拉伸椂峥耍空間是往低地址拉伸, 拉伸的字節(jié)數(shù)只能是16的倍數(shù), 否則會崩潰(對照上面 16進(jìn)制對齊理解 )

第一句代碼: sp = sp - #0x20, 將sp的地址往低地址偏移32個字節(jié)

Snip20180424_43.png

有sub就會有add, 這就是棧平衡, 如果只有sub沒有add, 會導(dǎo)致內(nèi)存不夠用, 堆棧溢出

第二,三句代碼: sp指向的地址不會變, 只是將x0, x1的值從相應(yīng)地址存入或讀取.


bl 和 ret 指令

bl: 跳轉(zhuǎn)指令
1. 將下一條指令的地址存放到 lr(x30) 寄存器中
2. 跳轉(zhuǎn)到對應(yīng)函數(shù)中執(zhí)行指令

Snip20180424_44.png

ret: 返回指令
默認(rèn)使用 lr(x30) 寄存器的值, 通過底層指令提示CPU這是下一條指令的地址.
ARM64架構(gòu)中的特色指令, 面向硬件做了優(yōu)化處理

Snip20180424_46.png
lr (x30) 寄存器
  • x30寄存器存放的是函數(shù)返回的地址, 當(dāng)ret執(zhí)行指令時, 會尋找這個寄存器中保存的地址

注意: 在函數(shù)嵌套調(diào)用中, 需要將x30入棧, 否則可能會造成死循環(huán).

函數(shù)的參數(shù)和返回值

ARM64下, 參數(shù)都是保存在x0-x7 (w0-w7) 這8個寄存器中, 如果超過這8個參數(shù)就會入棧, 函數(shù)的返回值是放在 x0寄存器中的.

函數(shù)的局部變量

函數(shù)的局部變量都是保存在棧里面.

好了, 第三篇對于初識匯編的復(fù)習(xí)和梳理就到這了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掏导,一起剝皮案震驚了整個濱河市资盅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愿伴,老刑警劉巖肺魁,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隔节,居然都是意外死亡鹅经,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門怎诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘾晃,“玉大人,你說我怎么就攤上這事幻妓”奈螅” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵肉津,是天一觀的道長强胰。 經(jīng)常有香客問我,道長妹沙,這世上最難降的妖魔是什么偶洋? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮距糖,結(jié)果婚禮上玄窝,老公的妹妹穿的比我還像新娘。我一直安慰自己肾筐,他們只是感情好哆料,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吗铐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杏节。 梳的紋絲不亂的頭發(fā)上唬渗,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天典阵,我揣著相機(jī)與錄音,去河邊找鬼镊逝。 笑死壮啊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撑蒜。 我是一名探鬼主播歹啼,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼座菠!你這毒婦竟也來了狸眼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浴滴,失蹤者是張志新(化名)和其女友劉穎拓萌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體升略,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了品嚣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕倘。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翰撑,靈堂內(nèi)的尸體忽然破棺而出激才,到底是詐尸還是另有隱情,我是刑警寧澤额嘿,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布瘸恼,位于F島的核電站,受9級特大地震影響册养,放射性物質(zhì)發(fā)生泄漏东帅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一球拦、第九天 我趴在偏房一處隱蔽的房頂上張望靠闭。 院中可真熱鬧,春花似錦坎炼、人聲如沸愧膀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩淋。三九已至,卻和暖如春萄金,著一層夾襖步出監(jiān)牢的瞬間蟀悦,已是汗流浹背媚朦。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留日戈,地道東北人询张。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像浙炼,于是被迫代替她去往敵國和親份氧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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

  • 組件 計算機(jī)是一種數(shù)據(jù)處理設(shè)備弯屈,它由CPU和內(nèi)存以及外部設(shè)備組成蜗帜。CPU負(fù)責(zé)數(shù)據(jù)處理,內(nèi)存負(fù)責(zé)存儲季俩,外部設(shè)備負(fù)責(zé)數(shù)...
    哆啦灬少A夢閱讀 1,594評論 1 2
  • 一彈指六十剎那钮糖,一剎那九百生滅。 --《仁王經(jīng)》 組件 計算機(jī)是一種數(shù)據(jù)處理設(shè)備酌住,它由CPU和內(nèi)存以及外部設(shè)備組成...
    歐陽大哥2013閱讀 21,355評論 15 147
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記欺矫,在此感謝他和像他一樣...
    Gibbs基閱讀 37,237評論 8 114
  • 我對動物不是特別喜愛纱新,但也不恨。我家有一只狗狗穆趴,名叫豆豆脸爱,是我老家的狗生的崽崽。生的比較多未妹,送了些給別人 簿废,還剩下...
    愛的簡史閱讀 253評論 0 0
  • 原題鏈接poj Description You are trapped in a 3D dungeon and n...
    Gadore千里閱讀 616評論 0 2