本來想繼續補齊第二周前面的 x86 課程
不過卻發現已經有厲害的網友寫了 x86架構方興未艾 這個主題
所以就直接前進第三周的硬體實現部分好了XD
之前是使用 ADD R0, [6] 為例來說明一條指令是如何被執行的
請參考 淺入淺出計組之旅(05)計算機執行指令的過程
這條比較接近 x86 的指令,因為他可以直接對存儲器進行操作
而為了讓執行步驟精簡,接下來我們會採用先前介紹的 MIPS 來做範例
add $8, $9, $10 = 000000 01001 01010 01000 00000 10000
這條編碼將會儲存在存儲器中,當 CPU 要執行這條指令時
會如先前所說把它從存儲器搬到 IR 暫存器中進行譯碼
當翻譯出這是一條 R 型加法指令後控制電路會發出訊號給運算器
接這通過內部總線連接將 R9, R10 分別連到運算器的輸入兩端
運算器進行加法運算後再將結果通過內部總線傳到 R8 儲存,完成一次加法運算
接下來如果是有立即數的加法運算呢
addi $21 = $22 + (-50) = 001000 10110 10101 1111 1111 1100 1110
我們可以看到與上方不同的是當 CPU 知道有一個來源是立即數
他就會通過內部總線直接擷取指令的後 16bits 傳給運算器
值得注意的是因為立即數只有 16bits,而暫存器都是 32bits
所以這裡必須做 SignExtension = { 16 { imm[15] } , imm }
也就是在 imm 的前方補上 16位 imm 最高位數字
如果是正數當然是零,如果是負數則都補上一
如此一來就可以將原先的 16位數延伸成數值相同的 32位數
下圖就是算術運算的指令說明
除了算術運算還有一大類是邏輯運算,邏輯運算基本上與算術運算相同
差別在於立即數的擴展是通通補上零,因為在邏輯運算時並沒有正負數的考量
1'b0 一開始看不太懂,後來查了一下發現是 一位元二進制之值為1
明天將繼續說明這些運算是怎麼具體實現的~:)