8086CPU的16位數據線如何傳送大於16位的數據?

比如讀取一個指令的時候,這個指令長度可能是24位/32位,已經超過了數據線16位的寬度?


數據匯流排一次讀取16bit數據,不代表CPU一次只能讀取16bit數據。

CPU的解碼器一次可以讀取很多位元組的數據進行解碼,這個位元組數不受寄存器寬度限制,因為它可能是從L1 Cache里讀,L1 cache的一個cache line比寄存器大的多。

Intel CPU 32位模式下單條指令最大長度可以達到15位元組。

補充,沒看清楚原題,題主問的是8086,8086有一個6位元組的指令緩存,被執行的指令是從這個緩存里取的,見下圖紅圈:

來自http://datasheets.chipdb.org/Intel/x86/808x/datashts/8086/231455-006.pdf


8086指令系統採用變長指令,指令的長度可由1~6位元組組成。

短的指令如:INC AX,只有1個位元組。

長的指令如:JMP 1234:5678,有5個位元組。

變長的指令不是一次性從存儲器讀出的,CPU讀取到「第一批次」指令(前16位)後,通過對第1個位元組解碼,獲知這條指令的確切長度。再根據這個確切長度,確定再使用多少個匯流排周期來讀取這條指令。

如何理解匯流排周期呢?這就涉及8086 CPU的匯流排時序了,有幾個概念。

時鐘周期

也就是主頻對應的周期。時序邏輯電路最基本的同步信號。

匯流排周期

訪問一次存儲器所需要的時間。分匯流排讀操作和匯流排寫操作。

一次匯流排讀操作需要好幾個步驟。先要把地址信號傳遞到匯流排上,然後鎖存地址(因為8086的地址線和數據線是復用的,不鎖存數據一來地址就沒了);再等著存儲器把數據送到匯流排上,然後通知CPU讀取。

一次匯流排寫操作也需要好幾個步驟。先要把地址信號傳遞到匯流排上,然後鎖存地址;再把數據信號傳遞到匯流排上,等待數據穩定後寫進存儲器。

這幾個步驟,一個時鐘周期搞不定,需要若干個時鐘周期(&>=4)才能完成。

《Intel 8086 Datasheet》

指令周期

要執行一條指令,就更複雜了。

指令本身好幾個位元組,取指令就可能耗費多個匯流排周期。除立即定址和寄存器定址外,指令還得從存儲器里讀取數據,指令的執行本身也需要時間,指令的執行結果還得寫到存儲器里。所有存儲器讀寫都涉及匯流排操作。

所以一條指令的執行,一個匯流排周期通常搞不定,需要多個匯流排周期。事實上,一個指令周期由若干個匯流排周期組成,不同指令的匯流排周期不等長,簡單的指令只需要一個匯流排周期,複雜的指令需要多個匯流排周期。如乘法指令,需要124個匯流排周期。


16bit是一個時鐘周期傳輸的數據

一個x8 burst 16byte就回來了


一次不行分幾次傳唄


傳兩次


推薦閱讀:

z170+i7 6400t的性價比如何?
CPU供電為啥沒有跟主板24PIN供電合併成一個介面?
逆超線程技術理論上可以實現嗎,現實中困難點是什麼?
復旦大學團隊成功研發世界第一個半浮柵晶體管(SFGT)
復旦大學團研發的世界第一個半浮柵晶體管很厲害嗎?

TAG:中央處理器CPU | 彙編語言 | 數據線 | 寄存器 |