注:本系列內(nèi)容為閱讀《程序是怎樣跑起來的》書籍后的記錄筆記,部分內(nèi)容參考于書中眉抬,轉(zhuǎn)載請注明出處唐责。
第一章 CPU是什么
1.1 CPU構(gòu)成
CPU構(gòu)成:CPU是由寄存器、控制器卑惜、運算器和時鐘四個部分構(gòu)成膏执。
- 寄存器:可用來暫存指令、數(shù)據(jù)等處理對象露久,可以將其看做是內(nèi)存的一種更米。
- 控制器:負(fù)責(zé)把內(nèi)存上的指令、數(shù)據(jù)等讀入寄存器毫痕,并根據(jù)指令的執(zhí)行結(jié)果來控制整個計算機(jī)征峦。
- 運算器:負(fù)責(zé)運算從內(nèi)存讀入寄存器的數(shù)據(jù)迟几。
- 時鐘:負(fù)責(zé)發(fā)出CPU開始計時的時鐘信號。(部分CPU的時鐘位于CPU外部)
CPU簡易工作流程:程序啟動后栏笆,根據(jù)時鐘信號类腮,控制器會從內(nèi)存(DRAM)中讀取指令和數(shù)據(jù)。通過對這些指令加以解釋和運行竖伯,運算器就會對數(shù)據(jù)進(jìn)行運算存哲,控制器根據(jù)該運算結(jié)果來控制計算機(jī)。
詞條解釋:
- 高級編程語言:能夠使用類似于人類語言語法來記述的語言七婴,如BASIC祟偷、C、C++打厘、OC等
- 低級編程語言:與高級編程語言相對修肠,包括機(jī)器語言和匯編語言。
- 匯編語言:采用助記符來編寫程序的語言户盯,有時也稱之為匯編嵌施。
- 助記符:通常為指令功能的英文單詞的簡寫,比如mov和add分別是數(shù)據(jù)的存儲(move)和相加(addition)的簡寫莽鸭。
- 匯編:通常將匯編語言編寫的程序轉(zhuǎn)化成機(jī)器語言的過程稱之為匯編吗伤。
- 反匯編:機(jī)器語言程序轉(zhuǎn)化成匯編語言程序的過程則稱之為反匯編。
- 編譯:將使用高級編程語言編寫的程序轉(zhuǎn)換為機(jī)器語言的過程硫眨。
1.2 寄存器的重要性
對于程序員來說足淆,CPU可以看做是具有各種功能的寄存器的集合體。
寄存器種類:
- 累加寄存器:只有一個礁阁,存儲執(zhí)行運算的數(shù)據(jù)和運算后的數(shù)據(jù)巧号。
- 標(biāo)志寄存器:只有一個,存儲運算處理后的CPU的狀態(tài)姥闭。
- 程序計數(shù)器:只有一個丹鸿,存儲下一條指令所在內(nèi)存的地址。
- 棧 寄 存 器 :只有一個棚品,存儲棧區(qū)域的起始地址靠欢。
- 指令寄存器:只有一個,存儲指令铜跑。CPU內(nèi)部使用门怪,程序員無法通過程序?qū)υ摷拇嫫鬟M(jìn)行讀寫操作。
- 基址寄存器:多個疼进,存儲數(shù)據(jù)內(nèi)存的起始地址薪缆。
- 變址寄存器:多個秧廉,存儲基址寄存器的相對地址伞广。
- 通用寄存器:多個拣帽,存儲任意數(shù)據(jù)。
詞條解釋:
溢出:是指運算的結(jié)果超出了寄存器的長度范圍嚼锄。
1.3 程序計數(shù)器
程序計數(shù)器決定著程序的執(zhí)行流程减拭。
CPU每執(zhí)行一個指令,程序計數(shù)器的值就會加1区丑,然后CPU的控制器就會參照程序計數(shù)器的數(shù)值拧粪,從內(nèi)存中讀取命令并執(zhí)行。
1.4 條件分支和循環(huán)分支
程序的流程分為順序執(zhí)行沧侥、條件分支和循環(huán)三種可霎。
- 順序執(zhí)行:按照命令地址內(nèi)容的順序執(zhí)行指令。每次執(zhí)行一個指令程序宴杀,程序計數(shù)器的值就自動加1癣朗。
- 條件分支:是指根據(jù)條件執(zhí)行任意命令地址的指令。程序計數(shù)器執(zhí)行跳轉(zhuǎn)指令旺罢,程序計數(shù)器的值指向任意指定值旷余。
- 循環(huán)執(zhí)行:是指重復(fù)執(zhí)行同一命令地址的指令。程序計數(shù)器執(zhí)行跳轉(zhuǎn)指令扁达,程序計數(shù)器的值指向任意指定值正卧。
CPU在進(jìn)行運算時,標(biāo)志寄存器的值會根據(jù)運算結(jié)果自動設(shè)定跪解。條件炉旷、循環(huán)分支在跳轉(zhuǎn)指令前會比較運算,是否執(zhí)行跳轉(zhuǎn)指令惠遏,由CPU在參考標(biāo)志寄存器的數(shù)值后進(jìn)行判斷砾跃。
運算結(jié)果的正、負(fù)和零三種狀態(tài)是由標(biāo)志寄存器的三個位表示节吮。
以32位CPU(寄存器的長度是32位)的標(biāo)志寄存器為例抽高,如圖:
CPU的比較機(jī)制,就是一個數(shù)減去另一個數(shù)透绩,然后將結(jié)果保存到標(biāo)志寄存器中翘骂。
1.5 函數(shù)的調(diào)用機(jī)制
為了處理在函數(shù)內(nèi)部處理完成后,處理流程(程序計數(shù)器)能夠再返回到函數(shù)調(diào)用點繼續(xù)執(zhí)行帚豪,機(jī)器語言采用的是call指令和return指令碳竟。
在將函數(shù)的入口地址設(shè)定到程序計數(shù)器之前,call指令會把調(diào)用函數(shù)后要執(zhí)行的指令的地址存儲在棧內(nèi)存中狸臣。函數(shù)處理完畢后莹桅,再通過函數(shù)的出口來執(zhí)行return指令,把存儲在棧中的指令地址設(shè)定到程序計數(shù)器中烛亦。
1.6 通過地址和索引實現(xiàn)數(shù)組
數(shù)組的實際地址 = 基址寄存器(固定) + 變址寄存器(變化)
1000 0000 = 1000 0000 + 0000 0000
1000 0001 = 1000 0000 + 0000 0001
1000 0002 = 1000 0000 + 0000 0002
變址寄存器相當(dāng)于高級編程語言中數(shù)組的索引功能诈泼。
1.7 機(jī)器語言的指令
機(jī)器語言指令的主要類型和功能:
類型 | 功能 |
---|---|
數(shù)據(jù)傳送指令 | 寄存器和內(nèi)存懂拾、內(nèi)存和內(nèi)存、寄存器和外圍設(shè)備之間的數(shù)據(jù)讀寫和操作 |
運算指令 | 用累加寄存器執(zhí)行算數(shù)運算铐达、邏輯運算岖赋、比較運算和移位運算 |
跳轉(zhuǎn)指令 | 實現(xiàn)條件分支、循環(huán)和強(qiáng)制跳轉(zhuǎn)等 |
call\return指令 | 函數(shù)的調(diào)用瓮孙、返回調(diào)用前的地址 |