對一個 16位元的系統來說,意味著,系統有16條data bus,各能存取一個
bit資料。
16位元當然就是2bytes,正如我們2個一數,數數會是2,4,6,8一樣,address
也不會(也不需要)出現奇數位置1,3,5,7...
現在來看看硬體存取一個byte在奇偶數地址的情況:
1.
要取偶數位置E時,會抓到 (E,E+1)一個WORD(因為data bus是16bits),
因為E是在Lo Byte 所以硬體只要把 Hi Bytes 拋棄掉就成了。
2.
要取奇數位置O時,會抓到 (O-1,O)一個WORD(因為data bus
是16bits), 因為O是在Hi Byte 所以硬體得要把 Hi Bytes 搬到 Lo Bytes
才能算完成存取。
看到奇數地址存取會比偶數地址麻煩了嗎?差一點點而已有什麼關係?
好吧!我們再來看看硬體存取一個WORD在奇偶數地址的情況:
3.
要取偶數位置(E,E+1)時,會抓到 (E,E+1)一個WORD,這樣就完成
存取了。
4.
要取奇數位置(O,O+1)時,要先抓到 (O-1,O)取得Lo Byte O,然後
再抓(O,O+1)得到 Hi Byte(O+1),最後合併(O,O+1)才算完成一個奇數
位址WORD的存取。
比較一下3,4,你就不會說只差一點點了吧!?
在32位元和64位元的系統,可以類推。這也是為什麼很多編譯器會預設
把變數位置調整在 2/4/8 倍數上來得到較佳的存取效率。
但這樣做會使像結構的資料大小意外的變化,若是某個結構的大小是很重要
的,你就必需找出編譯器相關的設定或directive(如VC的pack)來控制
aligment。
沒有留言:
張貼留言