在64位系统上调测程序时查看内存或数据段里面的数据时,很容易搞混。尤其是在64位里取32位参与运算,且运算移动为+4,而非+8,这样一来,更易混淆。从下面的代码段地址来看地址里的数据,做个简易的记录。
(gdb) x/8xb 0x55555555ab78
0x55555555ab78: 0x2c 0xbf 0xff 0xff 0x9d 0xbe 0xff 0xff
(gdb) x/4xh 0x55555555ab78
0x55555555ab78: 0xbf2c 0xffff 0xbe9d 0xffff
(gdb) x/2xw 0x55555555ab78
0x55555555ab78: 0xffffbf2c 0xffffbe9d
(gdb) x/xg 0x55555555ab78
0x55555555ab78: 0xffffbe9dffffbf2c
以上是用gdb查看 0x55555555ab78 地址的数据,使用 8、16、32、64 格式显示数据的长度。显示出来的数据需搞清楚数据的大小端方式。回顾一下大小端,高字节存高位,是小端;高字节存低位,是大端。
先看
0x55555555ab78: 0x2c 0xbf 0xff 0xff 0x9d 0xbe 0xff 0xff
地址如下:
78 79 7A 7B 7C 7D 7E 7F
0x2c 0xbf 0xff 0xff 0x9d 0xbe 0xff 0xff
高字节排在高位地址,是小端模式。有效数据,要倒着看;
再看
0x55555555ab78: 0xffffbe9dffffbf2c
78 79 7A 7B 7C 7D 7E 7F
0xff 0xff 0xbe 0x9d 0xff 0xff 0xbf 0x2c
高字节排在低位地址,是大端模式。有效数据,符合书写习惯;
数据放在寄存器或内存的地址并没有变,变的是我们看数据的方式,有大小端的显示问题,注意一下就行。