- 程序是怎樣跑起來的(第3版)
- (日)矢澤久雄
- 1002字
- 2023-06-20 18:13:11
1.4 條件分支和循環(huán)的原理
程序的流程分為順序執(zhí)行、條件分支和循環(huán)三種。順序執(zhí)行就是按照地址的數(shù)值順序執(zhí)行指令。條件分支就是按照條件執(zhí)行任意地址的指令。循環(huán)就是重復(fù)執(zhí)行同一地址的指令。在順序執(zhí)行中,只要將程序計數(shù)器的值每次加1就可以了,但如果程序中存在條件分支和循環(huán),機器語言的指令就可以將程序計數(shù)器的值設(shè)置為任意地址(不是不不1的值)。通過這樣的方式,程序就可以返回之前的地址重復(fù)執(zhí)行指令,或者跳轉(zhuǎn)到任意地址從而實現(xiàn)分支。在這里,我們會展示一個條件分支的具體示例,循環(huán)也是以同樣的原理通過設(shè)置程序計數(shù)器的值來實現(xiàn)的。
圖1-5展示了內(nèi)存中的一段程序,這段程序的功能是將內(nèi)存中的值(這里是123)的絕對值輸出到屏幕上。程序運行的起始位置是地址0100。隨著程序計數(shù)器的值增加,程序執(zhí)行到地址0102,此時如果累加器的值是正數(shù),則會執(zhí)行一條跳轉(zhuǎn)到地址0104的指令(跳轉(zhuǎn)指令)。由于此時累加器的值123是一個正數(shù),所以地址0103的指令會被跳過,程序流程直接跳轉(zhuǎn)到了地址0104。“跳轉(zhuǎn)到地址0104”這條指令,實際上就是間接地執(zhí)行了“將程序計數(shù)器的值設(shè)為地址0104”的操作。

圖1-5 條件分支的程序示例(顯示絕對值)
條件分支中所使用的跳轉(zhuǎn)指令需要根據(jù)前一條指令的運算結(jié)果來判斷是否進行跳轉(zhuǎn)。在表1-1所列出的CPU寄存器中,有一個標(biāo)志寄存器。標(biāo)志寄存器會根據(jù)上次運算的結(jié)果,保存累加器和通用寄存器的值,無論值是正數(shù)、零還是負(fù)數(shù),都會將其保存(也會保存溢出和奇偶校驗
的結(jié)果)。
CPU在每次讀取數(shù)據(jù)或進行運算后,都會根據(jù)結(jié)果自動設(shè)置標(biāo)志寄存器的值。在條件分支中,執(zhí)行跳轉(zhuǎn)指令之前會進行比較運算,CPU會根據(jù)標(biāo)志寄存器的值來判斷是否執(zhí)行跳轉(zhuǎn)指令。運算結(jié)果的正、零、負(fù)3種狀態(tài)分別由標(biāo)志寄存器中的3個比特來表示。圖1-6是32位CPU(寄存器的長度為32比特)的標(biāo)志寄存器示例。在這個標(biāo)志寄存器中,第0個、第1個、第2個比特的值若為1,則代表運算結(jié)果分別為正數(shù)、零、負(fù)數(shù)。

圖1-6 比較運算的結(jié)果存放在標(biāo)志寄存器的3個比特中
CPU進行比較的方式非常有趣,請大家一定要了解一下。假設(shè)要將累加器中的值XXX和通用寄存器中的YYY進行比較,當(dāng)執(zhí)行比較指令時,CPU的運算器會在內(nèi)部(暗中)執(zhí)行“XXX-YYY”的減法運算,無論結(jié)果是正數(shù)、零,還是負(fù)數(shù),都會保存到標(biāo)志寄存器中。如果結(jié)果為正,則表示XXX大于YYY ;如果為零,則表示XXX等于YYY ;如果為負(fù),則表示XXX小于YYY。也就是說,程序中的比較指令在CPU內(nèi)部實際上是通過減法運算來實現(xiàn)的。怎么樣,是不是很有趣呢?
- Learning LibGDX Game Development(Second Edition)
- 人人都是網(wǎng)站分析師:從分析師的視角理解網(wǎng)站和解讀數(shù)據(jù)
- Mastering Git
- Python爬蟲、數(shù)據(jù)分析與可視化:工具詳解與案例實戰(zhàn)
- Mastering Python Design Patterns
- Python 3 數(shù)據(jù)分析與機器學(xué)習(xí)實戰(zhàn)
- 計算機應(yīng)用技能實訓(xùn)教程
- 交互式程序設(shè)計(第2版)
- ASP.NET Web API Security Essentials
- 青少年學(xué)Python(第2冊)
- Learning Concurrency in Python
- Qt 5.12實戰(zhàn)
- 你必須知道的.NET(第2版)
- WCF全面解析
- HTML5程序開發(fā)范例寶典