Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317564
  • 博文数量: 239
  • 博客积分: 481
  • 博客等级: 下士
  • 技术积分: 1170
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-15 17:28
文章分类

全部博文(239)

文章存档

2014年(13)

2013年(6)

2012年(122)

2011年(98)

分类:

2011-08-18 15:44:51

原文地址:用GDB查看大小端 作者:Jelline

摘要:
  写这篇博文一来重温下大小端,二来学习下GDB查看内存的相关命令。本文简要介绍大小端,并通过用GDB查看内存的方式判断大小端,最后详细介绍了GDB查看内存详细用法。

一、大小端
    Endian表示数据在存储器中的存放顺序,大端将高字节存放在低地址,小端将低字节存放在低地址。可以这样记忆,将高低字节存放在低地址对应于大小端。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理[1]。
例:整数0x12345678,78为低字节,12为高字节,其大小端表示如下图:
图1 整型0x12345678大小端表示[2]


二、用GDB查看大小端
    判断大小端有很多种方法。可以参考处理器手册,一般来说,DEC、Inter X86属于小端,Sun、PowerPC属于大端,ARM则可以自主选择大小端。也可以写程序测试,这里介绍一种用GDB查看大小端方法,即声明一个变量,通过GDB查看其存放方式来判断大小端。
2.1 源程序如下:
  1. //filename:endian_test.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5.     int test = 0x12345678;
  6.     return 0;
  7. }
2.2 编译进入调试
  1. jelline@jelline:~$ gcc -o endian_test -g endian_test.c /*需要加-g编译选项*/
  2. jelline@jelline:~$ gdb endian_test
2.3 查看内存,判断大小端
  1. (gdb) l                        /*列出源代码,以便设置断点*/
  2. 1 //filename:endian_test.c
  3. 2 #include <stdio.h>
  4. 3 int main()
  5. 4 {
  6. 5 int test = 0x12345678;
  7. 6 return 0;
  8. 7 }
  9. 8
  10. (gdb) break 6                 /*设置断点*/
  11. Breakpoint 1 at 0x80483c1: file endian_test.c, line 6.
  12. (gdb) r                       /*执行到断点处*/
  13. Starting program: /home/jelline/endian_test
  14. Breakpoint 1, main () at endian_test.c:6
  15. 6 return 0;
  16. (gdb) print &test             /*打印test地址,即test第一个字节的地址*/
  17. $1 = (int *) 0xbffff2a4
  18. (gdb) x/4xb 0xbffff2a4        /*命令解析见后文*/
  19. 0xbffff2a4: 0x78 0x56 0x34 0x12
  20. (gdb) quit
由此可见,0x78(低字节)是存放在低地址,所以是小端。

三、GDB查看内存x命令用法
    print命令可以打印表达式的值,但只能指定打印格式f,不能指定打印数目n以及字节大小u。而x命令可以,其表达式[3]:x/[n/f/s] ADDRESS,其中[n/f/s]是可选的,各参数意义如下:

n:指定显示内存长度,以字节为单位
默认值为1
f:指定显示地址内容的格式
o(octal)
x(hex)
d(decimal)
u(unsigned decimal),
t(binary)
f(float)
a(address)
i(instruction)
c(char)
s(string)
默认值为上一次操作指定的值
u:指定字节长度,即以几个字节作为一组显示,并取决于格式
b(byte)
h(halfword)
w(word)
g(giant, 8 bytes)
默认值为上一次操作指定的值
ADDRESS:指定内存地址
默认值为最后执行命令print的地址值



参考资料:
[1] 博文《
[2] 图1来自博文《大端、小端、网络字节序
[3] 博文《gdb中看内存(x命令)
阅读(649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~