1.4 條件分支和循環機制
程序的流程分為順序執行、條件分支和循環三種。順序執行是指按照地址內容的順序執行指令。條件分支是指根據條件執行任意地址的指令。循環是指重復執行同一地址的指令。順序執行的情況比較簡單,每執行一個指令程序計數器的值就自動加1。但若程序中存在條件分支和循環,機器語言的指令就可以將程序計數器的值設定為任意地址(不是+1)。這樣一來,程序便可以返回到上一個地址來重復執行同一個指令,或者跳轉到任意地址。接下來,我們就以條件分支為例,來具體說明循環時程序計數器的數值設定機制也是一樣的。
圖1-5表示把內存中存儲的數值(示例中是123)的絕對值輸出到顯示器的程序的內存狀態。程序運行的開始位置是0100地址。隨著程序計數器數值的增加,當到達0102地址時,如果累加寄存器的值是正數,則執行跳轉指令(jump指令)跳轉到0104地址。此時,由于累加寄存器的值是123,為正數,因此0103地址的指令被跳過,程序的流程直接跳轉到了0104地址。也就是說,“跳轉到0104地址”這個指令間接執行了“將程序計數器設定成0104地址”這個操作。

圖1-5 執行條件分支的程序示例(顯示絕對值)
條件分支和循環中使用的跳轉指令,會參照當前執行的運算結果來判斷是否跳轉。表1-1所列出的寄存器中,我們提到了標志寄存器。無論當前累加寄存器的運算結果是負數、零還是正數,標志寄存器都會將其保存(也負責存放溢出和奇偶校驗
的結果)。
CPU在進行運算時,標志寄存器的數值會根據運算結果自動設定。條件分支在跳轉指令前會進行比較運算。至于是否執行跳轉指令,則由CPU在參考標志寄存器的數值后進行判斷。運算結果的正、零、負三種狀態由標志寄存器的三個位表示。圖1-6是32位CPU(寄存器的長度是32位)的標志寄存器的示例。標志寄存器的第一個字節位、第二個字節位和第三個字節位的值為1時,表示運算結果分別為正數、零和負數。

圖1-6 比較運算的結果存儲在標志寄存器的三個位中
CPU執行比較的機制很有意思,因此請大家務必牢記。例如,假設要比較累加寄存器中存儲的XXX值和通用寄存器中存儲的YYY值,執行比較的指令后,CPU的運算裝置就會在內部(暗中)進行XXX-YYY的減法運算。而無論減法運算的結果是正數、零還是負數,都會保存到標志寄存器中。結果為正表示XXX比YYY大,零表示XXX和YYY相等,負表示XXX比YYY小。程序中的比較指令,就是在CPU內部做減法運算。怎么樣,是不是挺有意思的?
- Learning C# by Developing Games with Unity 2020
- Oracle 11g從入門到精通(第2版) (軟件開發視頻大講堂)
- Angular UI Development with PrimeNG
- 大學計算機應用基礎實踐教程
- 架構不再難(全5冊)
- Linux核心技術從小白到大牛
- 深入淺出DPDK
- 深度學習:算法入門與Keras編程實踐
- 深入淺出RxJS
- 實戰Java高并發程序設計(第3版)
- 深入淺出Serverless:技術原理與應用實踐
- 深入理解Android:Wi-Fi、NFC和GPS卷
- 焊接機器人系統操作、編程與維護
- Learning Concurrent Programming in Scala
- 微信小程序全棧開發技術與實戰(微課版)