在我們明白了我們用電腦的唯一目的是資料處理之後,我們開始給資料鋪路。我們設計了匯流排,將將各個裝置串連到匯流排上,再設計類似“紅綠燈”的規則,控制同一時刻,資料流動不產生混亂,同時我們開始對匯流排上的資料存放區空間進行編址,這樣cpu裝置就可以和這些地址空間交換資料。
更強大的做法是,我們設計了指令來控制cpu與其他裝置進行資料互動,以及cpu內部的算數運算和邏輯運算。這樣通過電腦指令的組合基本上就能完成所有的功能了。
但是,這些電腦指令的集合如何讓cpu自己去順序執行呢?他們巧妙的設計了指令指標寄存器這麼個東西。指令指標寄存器指向的是記憶體中需要執行的下一條指令的地址。每執行一條指令,指令指標寄存器就自動指向下一條指令。這樣cpu就可以機械的迴圈的去工作了。這裡面隱藏的一個問題是指令的長度有不同,有的指令沒運算元,可能就1個位元組,有的指令後面可能帶了運算元,不止一個位元組。這裡面需要區別對待。但這也有巧妙的實現,就是前一條指令讀了多少個位元組,那麼下一條指令就向後位移多少位元組就不會有錯了。
是不是這樣就萬事大吉了呢?還不行。我們還需要分支和迴圈控制。這個用來協助程式員寫出更優雅的代碼,而不是從1加到100要寫100條指令。而且,為了增加程式的適應性,程式編寫的時候並不知道程式在以後運行中面對的是什麼情境,在程式中需要根據不同的背景需求執行不同的代碼,這個就需要分支。
分支和迴圈,都是通過跳轉指令來實現。一般cpu提供了條件跳轉和無條件跳轉指令來實現。分支和迴圈的控制通過條件跳轉來實現。所謂條件跳轉,就是在cpu中添加了狀態寄存器,在這個寄存器中設定了標註位,在條件跳轉指令中有一個跳轉的地址,在執行的時候先判斷標誌位,如果符合就跳轉。如果不符合就什麼也不做,執行下一條指令。往往在程式中需要跳轉的時候,我們先執行會影響標誌位的“判斷”指令,再執行條件跳轉,即可實現我們的需求。這點只在組合語言中需要考慮,在進階語言中已經用自然語言屏蔽了底層實現原理。
有了這些流程式控制制指令,cpu基本上就能在程式指令控制下完成各種業務需求了,程式員也就能夠通過編寫程式讓電腦完成各種任務,這是一個偉大的創造。使得電腦硬體越來越通用,而電腦軟體越來越強大。