blog 文章

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 帳號。