image.png
寄存器
內(nèi)部部件之間由總線連接
image.png
- 對程序員來說,CPU中最主要部件是寄存器,可以通過改變寄存器的內(nèi)容來實現(xiàn)對CPU的控制
- 不同的CPU,寄存器的個數(shù)、結(jié)構(gòu)是不相同的
通用寄存器
- ARM64擁有有31個64位的通用寄存器 x0 到 x30,這些寄存器通常用來存放一般性的數(shù)據(jù),稱為通用寄存器(有時也有特定用途)
- 那么w0 到 w28 這些是32位的. 因為64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位.
- 比如 w0 就是 x0的低32位!
image.png
- 通常,CPU會先將內(nèi)存中的數(shù)據(jù)存儲到通用寄存器中,然后再對通用寄存器中的數(shù)據(jù)進行運算
-
假設內(nèi)存中有塊紅色內(nèi)存空間的值是3,現(xiàn)在想把它的值加1,并將結(jié)果存儲到藍色內(nèi)存空間
image.png
- CPU首先會將紅色內(nèi)存空間的值放到X0寄存器中:mov X0,紅色內(nèi)存空間
- 然后讓X0寄存器與1相加:add X0,1
- 最后將值賦值給內(nèi)存空間:mov 藍色內(nèi)存空間,X0
pc寄存器(program counter)
- 為指令指針寄存器,它指示了CPU當前要讀取指令的地址
- 在內(nèi)存或者磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別,都是二進制信息
- CPU在工作的時候把有的信息看做指令,有的信息看做數(shù)據(jù),為同樣的信息賦予了不同的意義
- 比如 1110 0000 0000 0011 0000 1000 1010 1010
- 可以當做數(shù)據(jù) 0xE003008AA
- 也可以當做指令 mov x0, x8
- 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í)行目標指令
-
ARM64提供了一個mov指令(傳送指令),可以用來修改大部分寄存器的值,比如
- mov x0,#10、mov x1,#20
但是,mov指令不能用于設置pc的值,ARM64沒有提供這樣的功能
ARM64提供了另外的指令來修改PC的值,這些指令統(tǒng)稱為轉(zhuǎn)移指令,最簡單的是bl指令
bl指令 -- 練習
現(xiàn)在有兩段代碼!假設程序先執(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
ARM匯編入門(一) — 進制本質(zhì)
ARM匯編入門(二) — 寄存器&pc&bl指令
ARM匯編入門(三) — 寄存器&cpu補充
ARM匯編入門(四) — 棧SP&FP寄存器
ARM匯編入門(五) — bl&ret函數(shù)的調(diào)用與返回
ARM匯編入門(六) — 函數(shù)的參數(shù)和返回值
ARM匯編入門(七) — 函數(shù)的局部變量與嵌套調(diào)用
ARM匯編入門(八) — 狀態(tài)寄存器
ARM匯編入門(九) — 內(nèi)存分區(qū)全局變量和局部變量
ARM匯編入門(十) — 循環(huán)選擇判斷
待續(xù)…