2017年6月2日 星期五

big endian

fig 1. 俗稱「大白」的 ppc apple notebook
寫程式的朋友們一定聽過 big endian, little endian, 但是可能沒什麼機會看到 big endian 的機器, 目前主流的 x86, arm 幾乎都是 little endian 的設計, 早期 apple 電腦的 cpu 是 powerpc (這是我為什麼之前買了 3 台 powerpc apple 電腦的原因之一, 我想看看什麼是 big endian 電腦), 這是 big endian 的 cpu, 我們來看看和 little endian 的機器有什麼不同, 一樣讓程式碼來說話。

a.cpp 是這次的範例程式, 就這麼簡單, 宣告一個 int i 而已, 程式雖然簡單, 但能幫助我們理解 big endican, little endian。

a.cpp
1 int main()
2 {
3   int i=0x12345678;
4   return i;
5 }

我的環境不是 mac os X, 而是 linux, 這個版本的 linux 是 powerpc 的版本, 一樣安裝gnu toolchain, 就算是用 apple notebook, 我也能使用熟悉的 toolchain, 將平台的差異性降到最低。

硬體平台是 fig 1 的 powerpc apple notebook, 俗稱的「大白」, 忘記在 200x 購入, 是二手機器, 28000 nt, 有獨立顯示卡, ati 的, 在裝 linux/X 時遇到很大問題, X 無法完全發揮該張顯示卡的功能, 我的 X 老是頓頓的。

拉回來, 想法是這樣: 將程式編譯後, 透過 gdb 來觀察變量變數 i 怎麼擺放 0x12345678, 觀察 big endian, little endian 在記憶體中的排列方式有什麼不同。有了真實機器的驗證, 相信更能理解其中的不同。

list 1. big endian i 的最高位位元組是 0x12 存儲在最低的記憶體位址處 (0xbfff f0d8)

list 1. powerpc (big endian) linux
 1 (gdb) b main
 2 Breakpoint 1 at 0x10000430: file a.cpp, line 3.
 3 (gdb) r
 4 Starting program: /home/descent/git/a 
 5 
 6 Breakpoint 1, main () at a.cpp:3
 7 3   int i=0x12345678;
 8 (gdb) p i
 9 $1 = 0
10 (gdb) p &i
11 $2 = (int *) 0xbffff0d8
12 (gdb) x/4xb 0xbffff0d8
13 0xbffff0d8: 0x00 0x00 0x00 0x00
14 (gdb) n
15 4   return i;
16 (gdb) x/4xb 0xbffff0d8
17 0xbffff0d8: 0x12 0x34 0x56 0x78


list 2. little endian i 的最高位位元組是 0x12 存儲在最高的記憶體位址處 (0xffffd307)

list 2. intel x86 32bit linux
 1 Starting program: /tmp/ia
 2
 3 Breakpoint 1, main () at ia.cpp:3
 4 3       int i=0x12345678;
 5 (gdb) n
 6 4       return i;
 7 (gdb) p i
 8 $1 = 305419896
 9 (gdb) p &i
10 $2 = (int *) 0xffffd304
11 (gdb) x/4xb 0xffffd304
12 0xffffd304:   0x78    0x56    0x34    0x12
13 (gdb)

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。