匯編(二) -- 寄存器

前言

最近準(zhǔn)備學(xué)習(xí)匯編尤泽,然后在B站上看到叫iOS小賢的作者發(fā)的視頻挺不錯脆淹,打算跟著學(xué)签杈,文章是看視頻的筆記瘫镇,最后有原視頻鏈接,想看視頻的可以看看通過鏈接查看視頻答姥。

寄存器

2990730-13132bfb35556f63.png
  1. 內(nèi)部部件之間由總線連接
  2. 對程序員來說铣除,CPU中最主要部件是寄存器,可以通過改變寄存器的內(nèi)容來實現(xiàn)對CPU的控制
  3. 不同的CPU鹦付,寄存器的個數(shù)尚粘、結(jié)構(gòu)是不相同的(8086是16位結(jié)構(gòu)的CPU)

通用寄存器

  • ARM64擁有有31個64位的通用寄存器 x0 到 x30,這些寄存器通常用來存放一般性的數(shù)據(jù),稱為通用寄存器(有時也有特定用途)

    • 那么w0 到 w28 這些是32位的. 因為64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位.
    • 比如 w0 就是 x0的低32位!

模擬器是X86架構(gòu)敲长,所以用真機測才能看到ARM62的寄存器

屏幕快照 2019-08-04 下午2.18.31.png
  • 通常郎嫁,CPU會先將內(nèi)存中的數(shù)據(jù)存儲到通用寄存器中,然后再對通用寄存器中的數(shù)據(jù)進行運算
  • 假設(shè)內(nèi)存中有塊紅色內(nèi)存空間的值是3祈噪,現(xiàn)在想把它的值加1泽铛,并將結(jié)果存儲到藍色內(nèi)存空間
2990730-853a43b3fc5f733e.png
  • CPU首先會將紅色內(nèi)存空間的值放到X0寄存器中:mov X0,紅色內(nèi)存空間
  • 然后讓X0寄存器與1相加:add X0,1
  • 最后將值賦值給內(nèi)存空間:mov 藍色內(nèi)存空間,X0

注:為什么是64位寄存器,因為CPU是64位的钳降,總線是64位的厚宰,一次通電可以傳遞64位的數(shù)據(jù)給CPU,也就是8個字節(jié),這個數(shù)據(jù)CPU存在寄存器中铲觉,所以寄存器是64位的澈蝙。

問: 每次計算完又開辟內(nèi)存空間存放結(jié)果?
答:匯編里面不存在開辟空間撵幽,銷毀空間灯荧,直接通過內(nèi)存地址訪問,和高級語言不一樣盐杂。

pc寄存器(program counter)

  • 為指令指針寄存器逗载,它指示了CPU當(dāng)前要讀取指令的地址
  • 在內(nèi)存或者磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別链烈,都是二進制信息
  • CPU在工作的時候把有的信息看做指令厉斟,有的信息看做數(shù)據(jù),為同樣的信息賦予了不同的意義
  • 比如 1110 0000 0000 0011 0000 1000 1010 1010
  • 可以當(dāng)做數(shù)據(jù) 0xE003008AA
  • 也可以當(dāng)做指令 mov x0, x8

0x102aaa928 <+0>: sub sp, sp, #0x10左邊是指令地址强衡,右邊是指令擦秽。

Debug -> Debug Workflow -> View Memory 或者通過快捷鍵:shift+command + m 來調(diào)用內(nèi)存查看界面

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

0x102aaa92c - 0x102aaa928 = 4,所以每個指令戰(zhàn)4個字節(jié)漩勤。

FF 43 00 D1就是指令sub sp, sp, #0x10的二進制表現(xiàn)形式感挥。

可以在LLDB輸入ni單步往下走,發(fā)現(xiàn)依然斷點地址依然和pc寄存器一樣的越败。

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

輸入register write pc 0x102aaa92c改寫pc寄存器触幼,可以看到跳轉(zhuǎn)到改寫后地址的下一個寄存器位置。

屏幕快照 2019-08-04 下午2.52.26.png
  • CPU根據(jù)什么將內(nèi)存中的信息看做指令究飞?
  • CPU將pc指向的內(nèi)存單元的內(nèi)容看做指令
  • 如果內(nèi)存中的某段內(nèi)容曾被CPU執(zhí)行過置谦,那么它所在的內(nèi)存單元必然被pc指向過

bl指令

  • CPU從何處執(zhí)行指令是由pc中的內(nèi)容決定的,我們可以通過改變pc的內(nèi)容來控制CPU執(zhí)行目標(biāo)指令
  • ARM64提供了一個mov指令(傳送指令)噪猾,可以用來修改大部分寄存器的值霉祸,比如
    • mov x0,#10筑累、mov x1,#20
  • 但是袱蜡,mov指令不能用于設(shè)置pc的值,ARM64沒有提供這樣的功能
  • ARM64提供了另外的指令來修改PC的值慢宗,這些指令統(tǒng)稱為轉(zhuǎn)移指令坪蚁,最簡單的是bl指令

注:#后面跟個數(shù)字,叫立即數(shù)镜沽,

bl指令 -- 練習(xí)

現(xiàn)在有兩段代碼!假設(shè)程序先執(zhí)行A,請寫出指令執(zhí)行順序.最終寄存器x0的值是多少?

_A:
    mov x0,#0xa0
    mov x1,#0x00
    add x1, x0, #0x14
    mov x0,x1
    bl _B
    mov x0,#0x0
    ret

_B:
    add x0, x0, #0x10
    ret

我們來寫試試看敏晤,在xcode中創(chuàng)建文件,格式選擇Assembly File

.text告訴編譯器在text段缅茉,也就是代碼段嘴脾,.global表示是全局的。
在.m文件中需要加上方法聲明int A();,這樣編譯才能通過译打,因為asm.s是源文件耗拓,編譯的會鏈接到全局函數(shù)_A。

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

在A()打斷點


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

輸入s進入函數(shù)A

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

我們可以看到x0就是a0奏司,此時x1是50輸入ni單步往下走乔询,x1變成0

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

add x1, x0, #0x14是把x0加上14然后賦值給x1,這樣x1就變成b4韵洋。

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

mov x0, x1是把x1的值賦值給x0竿刁,這樣x0和x1都是b4。

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

接下來bl 0x102df2c00跳轉(zhuǎn)到B函數(shù)搪缨。

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

然后一直輸入ni食拜,會發(fā)現(xiàn)死循環(huán)了,至于為什么之后會解釋副编。

關(guān)于CPU&寄存器的補充

寄存器

CPU除了有控制器监婶、運算器還有寄存器。其中寄存器的作用就是進行數(shù)據(jù)的臨時存儲齿桃。

CPU的運算速度是非郴蠡蹋快的,為了性能CPU在內(nèi)部開辟一小塊臨時存儲區(qū)域短纵,并在進行運算時先將數(shù)據(jù)從內(nèi)存復(fù)制到這一小塊臨時存儲區(qū)域中带污,運算時就在這一小快臨時存儲區(qū)域內(nèi)進行。我們稱這一小塊臨時存儲區(qū)域為寄存器香到。

對于arm64系的CPU來說鱼冀, 如果寄存器以x開頭則表明的是一個64位的寄存器,如果以w開頭則表明是一個32位的寄存器悠就,在系統(tǒng)中沒有提供16位和8位的寄存器供訪問和使用千绪。其中32位的寄存器是64位寄存器的低32位部分并不是獨立存在的。

注:如果你改了x0寄存器梗脾,w0寄存器也會改荸型,因為32位的寄存器是64位寄存器的低32位部分并不是獨立存在的。

高速緩存

iPhoneX上搭載的ARM處理器A11它的1級緩存的容量是64KB炸茧,2級緩存的容量8M.

CPU每執(zhí)行一條指令前都需要從內(nèi)存中將指令讀取到CPU內(nèi)并執(zhí)行瑞妇。而寄存器的運行速度相比內(nèi)存讀寫要快很多,為了性能,CPU還集成了一個高速緩存存儲區(qū)域.當(dāng)程序在運行時,先將要執(zhí)行的指令代碼以及數(shù)據(jù)復(fù)制到高速緩存中去(由操作系統(tǒng)完成).CPU直接從高速緩存依次讀取指令來執(zhí)行.

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

數(shù)據(jù)地址寄存器
數(shù)據(jù)地址寄存器通常用來做數(shù)據(jù)計算的臨時存儲梭冠、做累加辕狰、計數(shù)、地址保存等功能控漠。定義這些寄存器的作用主要是用于在CPU指令中保存操作數(shù)蔓倍,在CPU中當(dāng)做一些常規(guī)變量來使用。
ARM64中

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

注意:
有一種特殊的寄存器段寄存器:CS,DS,SS,ES四個寄存器來保存這些段的基地址,這個屬于Intel架構(gòu)CPU中.在ARM中并沒有

注:以前內(nèi)存使用段劃分的,現(xiàn)在是平滑狀態(tài)偶翅,從0到最后他去,只是文件里面分段,內(nèi)存中不再有段了倒堕。

浮點和向量寄存器

因為浮點數(shù)的存儲以及其運算的特殊性,CPU中專門提供浮點數(shù)寄存器來處理浮點數(shù)

2990730-37dee6fae913d736.png
  • 浮點寄存器 64位: D0 - D31 32位: S0 - S31
    現(xiàn)在的CPU支持向量運算.(向量運算在圖形處理相關(guān)的領(lǐng)域用得非常的多)為了支持向量計算系統(tǒng)了也提供了眾多的向量寄存器.

  • 向量寄存器 128位:V0-V31

以上講的都是ARM64寄存器灾测,附上8086的寄存器

  • 都是16位的
  • 可以存放2個字節(jié)
6850908-ef6c9773663b620b.png

參考:
寄存器
關(guān)于CPU&寄存器的補充
匯編(二)
匯編(三)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市垦巴,隨后出現(xiàn)的幾起案子媳搪,更是在濱河造成了極大的恐慌,老刑警劉巖骤宣,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦爆,死亡現(xiàn)場離奇詭異,居然都是意外死亡憔披,警方通過查閱死者的電腦和手機等限,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芬膝,“玉大人望门,你說我怎么就攤上這事∶趟” “怎么了筹误?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長癣缅。 經(jīng)常有香客問我厨剪,道長,這世上最難降的妖魔是什么友存? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任祷膳,我火速辦了婚禮,結(jié)果婚禮上屡立,老公的妹妹穿的比我還像新娘直晨。我一直安慰自己,他們只是感情好侠驯,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布抡秆。 她就那樣靜靜地躺著,像睡著了一般吟策。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上的止,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天檩坚,我揣著相機與錄音,去河邊找鬼。 笑死匾委,一個胖子當(dāng)著我的面吹牛拖叙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赂乐,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薯鳍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挨措?” 一聲冷哼從身側(cè)響起挖滤,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浅役,沒想到半個月后斩松,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡觉既,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年惧盹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞪讼。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钧椰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出符欠,到底是詐尸還是另有隱情演侯,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布背亥,位于F島的核電站秒际,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狡汉。R本人自食惡果不足惜娄徊,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盾戴。 院中可真熱鬧寄锐,春花似錦、人聲如沸尖啡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衅斩。三九已至盆顾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畏梆,已是汗流浹背您宪。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工奈懒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪巨。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓磷杏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捏卓。 傳聞我的和親對象是個殘疾皇子极祸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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