1. 程式人生 > >CODE學習筆記七——自動操作3 : 可程式設計定址與跳轉

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和普通的操作不同,我們必須保證跳轉之後,電路能“智慧”的按原有的規律(一個操作,兩個地址)繼續執行下去,彷彿“原本就該這樣”。也就是說,我們或許得對根源-計數器進行一些額外的操作了。 還記得之前的改進版邊沿觸發器嗎

其實只要稍加改進,就可以“強行”改變計數器的值了; 置位為1,復位為0,A輸入進觸發器;置位為0,復位為0,A無法輸入;復位為1,清零; 於是我們又會得到這樣的電路圖

條件跳轉:計算機初步

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不遠啦。