曾經被電面到乙個題目,如何判斷乙個系統是大端還是小端, 方法其實很簡單
int main()
在linux 的執行結果
gcc test.c
$./a.out
$echo $?
120
120 即 0x78, 證明低位放在了低位址,所以是小端系統(little endian )。
這樣說可能不夠直觀,而且記憶體中怎麼分布本來就比較抽象,所以這裡演示列印記憶體並畫個圖來表示
使用disassemble命令反彙編後,可見我們的i在 -0xc(%rbp) 位置,也就是 %rbp-0xc
│ >0x555555555150 movl $0x12345678,-0xc(%rbp)
列印4個位元組的記憶體,用到x命令,方法是 x/fmt,若記不住,只需要在gdb內使用help x
(gdb) x/4xb $rbp - 0xc
0x7fffffffe7c4: 0x78 0x56 0x34 0x12
(gdb)
4 表示重複4次,x表示顯示為16進製制,b表示每次列印的長度為1位元組
(gdb) x/1xb $rbp - 0xc
0x7fffffffe7c4: 0x78
(gdb) x/1xb $rbp - 0xb
0x7fffffffe7c5: 0x56
(gdb) x/1xb $rbp - 0xa
0x7fffffffe7c6: 0x34
(gdb) x/1xb $rbp - 0x9
0x7fffffffe7c7: 0x12
(gdb)
畫個圖
c7c6
c5c4
0x12
0x34
0x56
0x78
而我們的i指標位址指的是 c4, 所以c4是端,lsb
處在端位置,所以是小端系統, little endian
(gdb) p $rbp - 0xc
$2 = (void *) 0x7fffffffe7c4
也可以看出,系統通過乙個位址取值是從低位址取到高位址。 c4 c5 c6 c7
搞清楚了端
,就很好判斷endian, 給兩個圖理解什麼是big endian
文章的第乙個字母都是比較大, 這叫big endian
linux 是乙個小端系統, windows也是, 可以順便說網路 位元組序是 大端
gdb檢視記憶體
格式 x nfu 說明 x 是 examine 的縮寫 n表示要顯示的記憶體單元的個數 f表示顯示方式,可取如下值 x 按十六進製制格式顯示變數。d 按十進位制格式顯示變數。u 按十進位制格式顯示無符號整型。o 按八進位制格式顯示變數。t 按二進位制格式顯示變數。a 按十六進製制格式顯示變數。i 指...
GDB教程 檢視記憶體)
先看 n f u是可選的引數,表示乙個記憶體位址 1 n 是乙個正整數,表示顯示記憶體的長度,也就是說從當前位址向後顯示幾個位址的內容 2 f 表示顯示的格式 3 u 表示將多少個位元組作為乙個值取出來,如果不指定的話,gdb預設是4個bytes,如果不指定的話,預設是4個bytes。當我們指定了位...
用gdb檢視記憶體
用gdb檢視記憶體 格式 x nfu 說明 x 是 examine 的縮寫 n表示要顯示的記憶體單元的個數 f表示顯示方式,可取如下值 x 按十六進製制格式顯示變數。d 按十進位制格式顯示變數。u 按十進位制格式顯示無符號整型。o 按八進位制格式顯示變數。t 按二進位制格式顯示變數。a 按十六進製制...