官术网_书友最值得收藏!

1.4 條件分支和循環機制

程序的流程分為順序執行、條件分支和循環三種。順序執行是指按照地址內容的順序執行指令。條件分支是指根據條件執行任意地址的指令。循環是指重復執行同一地址的指令。順序執行的情況比較簡單,每執行一個指令程序計數器的值就自動加1。但若程序中存在條件分支和循環,機器語言的指令就可以將程序計數器的值設定為任意地址(不是+1)。這樣一來,程序便可以返回到上一個地址來重復執行同一個指令,或者跳轉到任意地址。接下來,我們就以條件分支為例,來具體說明循環時程序計數器的數值設定機制也是一樣的。

圖1-5表示把內存中存儲的數值(示例中是123)的絕對值輸出到顯示器的程序的內存狀態。程序運行的開始位置是0100地址。隨著程序計數器數值的增加,當到達0102地址時,如果累加寄存器的值是正數,則執行跳轉指令(jump指令)跳轉到0104地址。此時,由于累加寄存器的值是123,為正數,因此0103地址的指令被跳過,程序的流程直接跳轉到了0104地址。也就是說,“跳轉到0104地址”這個指令間接執行了“將程序計數器設定成0104地址”這個操作。

圖1-5 執行條件分支的程序示例(顯示絕對值)

條件分支和循環中使用的跳轉指令,會參照當前執行的運算結果來判斷是否跳轉。表1-1所列出的寄存器中,我們提到了標志寄存器。無論當前累加寄存器的運算結果是負數、零還是正數,標志寄存器都會將其保存(也負責存放溢出溢出(overflow)是指運算的結果超出了寄存器的長度范圍。和奇偶校驗奇偶校驗(parity check)是指檢查運算結果的值是偶數還是奇數。的結果)。

CPU在進行運算時,標志寄存器的數值會根據運算結果自動設定。條件分支在跳轉指令前會進行比較運算。至于是否執行跳轉指令,則由CPU在參考標志寄存器的數值后進行判斷。運算結果的正、零、負三種狀態由標志寄存器的三個位1位(bit=binary digit)就是一個位數的二進制數,表示0或1的數值。32位CPU指的就是用32位的二進制數來表示數據及地址的數值。關于二進制數的詳細內容,請讀者參閱第2章。表示。圖1-6是32位CPU(寄存器的長度是32位)的標志寄存器的示例。標志寄存器的第一個字節位、第二個字節位和第三個字節位的值為1時,表示運算結果分別為正數、零和負數。

圖1-6 比較運算的結果存儲在標志寄存器的三個位中

CPU執行比較的機制很有意思,因此請大家務必牢記。例如,假設要比較累加寄存器中存儲的XXX值和通用寄存器中存儲的YYY值,執行比較的指令后,CPU的運算裝置就會在內部(暗中)進行XXX-YYY的減法運算。而無論減法運算的結果是正數、零還是負數,都會保存到標志寄存器中。結果為正表示XXX比YYY大,零表示XXX和YYY相等,負表示XXX比YYY小。程序中的比較指令,就是在CPU內部做減法運算。怎么樣,是不是挺有意思的?

主站蜘蛛池模板: 仁化县| 五家渠市| 大埔区| 博客| 大石桥市| 广昌县| 华蓥市| 明水县| 利川市| 内江市| 边坝县| 凯里市| 东辽县| 黑龙江省| 青浦区| 嘉兴市| 上栗县| 武夷山市| 安图县| 榆林市| 屏东市| 湖北省| 珲春市| 吉木萨尔县| 泉州市| 奎屯市| 安福县| 明溪县| 城固县| 襄城县| 潞城市| 乐至县| 高淳县| 确山县| 锡林郭勒盟| 胶南市| 沅陵县| 收藏| 宁远县| 乌什县| 盘锦市|