[toc]
對程序員來說, CPU 是什么
概念
- 程序由數(shù)據(jù)和指令組成
- 內(nèi)存地址 - 用來表示指令和數(shù)據(jù)存儲位置的數(shù)值
cpu 結(jié)構(gòu)
- 寄存器 - 用于暫存指令, 數(shù)據(jù)等處理處理對象, 可以看作內(nèi)存的一種.
- 控制器 - 負(fù)責(zé)將內(nèi)存中的指令和數(shù)據(jù)讀入寄存器, 并根據(jù)指令執(zhí)行結(jié)果控制計(jì)算機(jī).
- 運(yùn)算器 - 負(fù)責(zé)運(yùn)算從內(nèi)存讀入寄存器的數(shù)據(jù).
- 時鐘 - 負(fù)責(zé)發(fā)出 CPU 開始計(jì)時的時鐘信號. 1 GHz = 1 億次 / s 代表處理器運(yùn)算速度.
內(nèi)存
通常所說的內(nèi)存指的是計(jì)算機(jī)的主存儲器(main memory), 通過控制器與 CPU 連接, 負(fù)責(zé)存儲數(shù)據(jù)和指令, 每個字節(jié)(8 位)都帶有地址編號.
內(nèi)存通常使用 DRAM (dynamic Random Access Memory), 動態(tài)隨機(jī)存取儲存, 需要保持穩(wěn)定的電源供給并時常刷新(確保最新數(shù)據(jù)), 斷電清除數(shù)據(jù).
運(yùn)行過程
程序啟動后, 根據(jù)時鐘信號, 控制器從內(nèi)存讀取指令和數(shù)據(jù). 運(yùn)算器運(yùn)行指令對數(shù)據(jù)運(yùn)算, 控制器根據(jù)運(yùn)算結(jié)果控制計(jì)算機(jī).
控制 - 數(shù)據(jù)運(yùn)算之外的處理, 主要指數(shù)據(jù)的輸入輸出時機(jī)控制.
對程序員來說, CPU 是寄存器的集合
匯編語言
匯編 : 匯編語言 -> 機(jī)器語言 的過程.
匯編語言與機(jī)器語言基本上是一一對應(yīng)的.
匯編語言關(guān)鍵字 : 助記符 對應(yīng) 機(jī)器語言指令, 使用指令功能的英語簡寫.
mov // move 數(shù)據(jù)存儲
add // addition 數(shù)據(jù)累加
匯編語言以寄存器為單元描述
// 寄存器名稱(區(qū)分種類)
eax - 累加寄存器
ebp - 基址寄存器
mov eax, dword ptr [ebp-8] // 將數(shù)據(jù)從內(nèi)存復(fù)制到寄存器 eax
add eax, dword ptr [ebp-oCh] // eax 與內(nèi)存數(shù)據(jù)累加
mov dword ptr [ebp-4], eax // 將累加結(jié)果存儲到內(nèi)存
寄存器分類
種類 | 功能 | 特點(diǎn) |
---|---|---|
累加寄存器(accumulator register) | 存儲執(zhí)行運(yùn)算的數(shù)據(jù)和運(yùn)算后的數(shù)據(jù) | 唯一 |
標(biāo)志寄存器(flag register) | 存儲運(yùn)算處理后的 CPU 狀態(tài) | 唯一 比較 |
程序計(jì)數(shù)器(program counter) | 存儲下一條指令所在內(nèi)存地址 | 唯一 執(zhí)行順序 |
基址寄存器(base register) | 存儲數(shù)據(jù)內(nèi)存的起始地址 | 多個 |
變址寄存器(index register) | 存儲基址寄存器的相對地址 | 多個 腳標(biāo) |
通用寄存器(general purpose register) | 存儲任意數(shù)據(jù) | 多個 |
指令寄存器(instruction register) | 存儲指令,內(nèi)部使用, 程序員無法控制 | 唯一 不可控 |
棧寄存器(stack register) | 存儲站區(qū)域起始地址 | 唯一 |
寄存器可用于存儲數(shù)據(jù)和指令, 數(shù)據(jù)分為 "用于計(jì)算的數(shù)值" 和 "表示內(nèi)存地址的數(shù)值" . 根據(jù)數(shù)據(jù)種類不同, 所使用的寄存器也不同.
程序流程控制
程序計(jì)數(shù)器 (program counter) 存儲下一條指令所在內(nèi)存的地址
實(shí)際情況中, 一條指令和數(shù)據(jù)通常被存儲在多個地址上. 此處為方便說明簡化為單個地址.
CPU 每執(zhí)行一個指令, 程序計(jì)數(shù)器就會自動累加(累加數(shù)值根據(jù)指令所占地址數(shù)), CPU 控制器參照程序計(jì)數(shù)器的數(shù)值, 繼續(xù)從內(nèi)存讀取命令. 也就是說, 程序計(jì)數(shù)器決定這程序的流程.
條件分支與循環(huán)
- 條件分支 - 根據(jù)條件執(zhí)行指定地址指令
- 循環(huán) - 重復(fù)執(zhí)行同一地址指令
以 絕對值計(jì)算過程 為例
0102 大于 0 則跳轉(zhuǎn)到 0104 地址
0103 取相反數(shù)
0104 直接輸出
0102 執(zhí)行了邏輯判斷并根據(jù)結(jié)果, 執(zhí)行跳轉(zhuǎn)指令
標(biāo)志寄存器 比較
標(biāo)志寄存器 (flag register) 存儲運(yùn)算處理后的 CPU 狀態(tài)
無論累加寄存器運(yùn)算結(jié)果為正數(shù), 零還是負(fù)數(shù). 標(biāo)志寄存器都會將其保存, 并負(fù)責(zé)存放結(jié)果超出寄存器長度的溢出和對結(jié)果奇偶的校驗(yàn).
條件分支中進(jìn)行比較運(yùn)算, 其結(jié)果參照標(biāo)志寄存器的低 3 位.
低 1 位, 結(jié)果為正 值為 1
低 2 位, 結(jié)果為 0 值為 1
低 1 位, 結(jié)果為負(fù) 值為 1
比較過程, 內(nèi)部執(zhí)行了相減運(yùn)算, 根據(jù)運(yùn)算結(jié)果在標(biāo)志寄存器的第三位得出結(jié)果.
函數(shù)調(diào)用機(jī)制
函數(shù)調(diào)用通過將程序計(jì)數(shù)器設(shè)定為函數(shù)存儲地址實(shí)現(xiàn), 但是與條件分支機(jī)制不同. 函數(shù)執(zhí)行完成后需要回到函數(shù)調(diào)用點(diǎn)順序執(zhí)行, 單純的跳轉(zhuǎn)執(zhí)行無法實(shí)現(xiàn).
通過機(jī)器語言的 call 指令 實(shí)現(xiàn)函數(shù)調(diào)用, 而在將程序計(jì)數(shù)器設(shè)值為函數(shù)入口地址前, call 指令會將函數(shù)調(diào)用完成后要執(zhí)行的指令地址存儲在 棧內(nèi)存
中.
函數(shù)處理完成后, 通過函數(shù)的出口來執(zhí)行 return 指令. 將保存在 棧內(nèi)存
中的地址設(shè)值到程序計(jì)數(shù)器中.
通過地址和索引實(shí)現(xiàn)數(shù)組
- 基址寄存器 (base register) 存儲數(shù)據(jù)內(nèi)存的起始地址
- 變址寄存器 (index register) 存儲基址寄存器的相對地址
通過兩種寄存器的配合使用, 實(shí)現(xiàn)在內(nèi)存上特定內(nèi)存區(qū)域的劃分, 以實(shí)現(xiàn)類似數(shù)組的操作.
使用 十六進(jìn)制 劃分 00000000 ~ FFFFFFFF 區(qū)域的內(nèi)存. 該區(qū)域使用 一個32位寄存器 即可查看全部的地址. 而想實(shí)現(xiàn)類似數(shù)組的分割區(qū)域, 連續(xù)查看的目的, 使用兩種寄存器更加方便.
通過將基址寄存器中的基礎(chǔ)地址與變址寄存器中的相對地址相加得到具體的地址. 使用變址寄存器作為 數(shù)組
的 index .
CPU 機(jī)器語言指令分類
類型 | 功能 |
---|---|
數(shù)據(jù)轉(zhuǎn)送 | 寄存器-內(nèi)存, 內(nèi)存-內(nèi)存, 寄存器-外圍設(shè)備 間的數(shù)據(jù)讀寫. |
運(yùn)算 | 使用累加寄存器執(zhí)行 算數(shù), 邏輯, 比較, 位移 |
跳轉(zhuǎn) | 條件分支, 循環(huán), 強(qiáng)制跳轉(zhuǎn) |
call / return | 函數(shù)調(diào)用 / 返回調(diào)用前地址 |
參考資料
<程序是怎樣跑起來的>