CODE學習筆記七——自動操作3 : 可程式設計定址與跳轉
目錄
上回我們構造了一個可以自動進行加法操作,並且可以自動儲存的機器;雖然結構看上去很清晰,但是程式碼與資料分別存在兩個RAM中,在另一個角度看來是有些冗餘的;我們可以嘗試著把程式碼與資料共同存放在一個RAM裡,儘管在管理不當的情況下會造成比較嚴重的問題,但是在清晰的操作下,它的靈活性得到了巨大的改善!這是可以接受的。
定址
在之前的自動操作器(姑且這麼叫吧),操作碼與資料地址是一一對應的,它們通過計數器相關聯。一個操作碼無法“越位”對與它不匹配的地址資料進行操作;如果我們希望改變這種笨拙的狀態,或許可以試試把地址存在操作碼儲存中。
改進前 | 改進後 | ||||
---|---|---|---|---|---|
程式碼地址 | 程式碼 | 程式碼地址 | 程式碼 | 程式碼地址 | 程式碼 |
0000h | Load | 0000h | Load | 0004h | 00h |
0001h | Add | 0001h | 00h | 0005h | 01h |
0002h | Store | 0002h | 00h | 0006h | Store |
0003h | Halt | 0003h | Add | … | … |
每個指令後跟著要操作的地址,原有的結構中,由計數器指向資料儲存的通路將被抹去;而由程式碼輸出端提供。但是因為一個RAM要按順序輸出三個資料,一方面我們的速度下降了(一個時鐘週期能完成的任務變成了需要四個週期執行),另一方面對控制訊號也需要進行更復雜的改變。
合併
更進一步,我們可以把兩個RAM合併,以此提高利用率!在這些精巧的設計中,時序是非常重要的,控制訊號仍需要花費一定的功夫來實現。下圖僅僅是操作控制方面的電路圖,省略了資料處理方面的電路圖,當然二者有很多部件是共用的。
但是仍然存在問題;我們無法預估要執行多少的指令才能完成一項任務,也就是說,隨著指令的增多,存放指令的地址可能會增加到資料儲存的地址,甚至覆蓋之;如果我們想高效的合併兩個RAM,我們或許還得給指令集加上一個Jump操作。
JUMP:重要的操作碼
jump和普通的操作不同,我們必須保證跳轉之後,電路能“智慧”的按原有的規律(一個操作,兩個地址)繼續執行下去,彷彿“原本就該這樣”。也就是說,我們或許得對根源-計數器進行一些額外的操作了。 還記得之前的改進版邊沿觸發器嗎
條件跳轉:計算機初步
Jump大大改進了自動操作機的功能,而更進一步的Conditional Jump將真正讓我們的機器初顯“智慧”;也就是loop,迴圈操作的基礎; 像高階語言中的if條件語句要實現在電路中還是要從基本的做起
零鎖存器(Zero latch)
把一位邊沿觸發鎖存器和加法器進行如下聯接,僅當八位加法器輸出0時,DI才為1;把零標誌位(Zero flag)與Jump控制訊號進行一定的組合,就可以很容易得到Jump if Zero
Conditional Jump
將Zero latch 的Zero flag 作為控制訊號的一員通過不同方式接近控制電路,可以得到四個Conditional Jump指令 Jump If Zero、Jump If Carry、Jump If Not Zero、Jump If Not Carry; 很容易想到,只要設定一個數A,每次執行後A–1,當A為零時過程就執行了A次;再每次-1後使用Jump If Not Zero指令,就實現了迴圈操作!!!
迴圈操作
別忘記Halt的操作碼是FFh,如果其作為資料與任意資料相加後,就相當於-1,也即是說我們的A-1其實只需要與FFh相加即可!並不需要而外設定一個地址儲存1; 迴圈操作是計算器與計算機的一個重大區別,行至此處,我們的自動操作器已經離cpu不遠啦。