gdb 查看內存


難記的大端小端

曾經被電面到一個題目,如何判斷一個系統是大端還是小端, 方法其實很簡單

int main(){
	int i = 0x12345678;  // 注意必須是16進制,否則難以判斷
	return *(char*)&i;
}

在linux 的執行結果

gcc test.c          
$./a.out 
$echo $?
120

120 即 0x78, 證明低位放在了低地址,所以是小端系統(little endian )。
這樣說可能不夠直觀,而且內存中怎么分布本來就比較抽象,所以這里演示打印內存並畫個圖來表示

用gdb 打印內存地址

使用disassemble命令反匯編后,可見我們的i在 -0xc(%rbp) 位置,也就是 %rbp-0xc

│  >0x555555555150 <main+23>                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) 

畫個圖

c7 c6 c5 c4
0x12 0x34 0x56 0x78

而我們的i指針地址指的是 c4, 所以c4是, lsb處在端位置,所以是小端系統, little endian

(gdb) p $rbp - 0xc
$2 = (void *) 0x7fffffffe7c4

也可以看出,系統通過一個地址取值是從低地址取到高地址。 c4 c5 c6 c7

區分endian

搞清楚了,就很好判斷endian, 給兩個圖理解什么是big endian

文章的第一個字母都是比較大, 這叫big endian

總結

Linux 是一個小端系統, windows也是, 可以順便說網絡 字節序是 大端


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM