摘要:
写这篇博文一来重温下大小端,二来学习下GDB查看内存的相关命令。本文简要介绍大小端,并通过用GDB查看内存的方式判断大小端,最后详细介绍了GDB查看内存详细用法。
一、大小端
Endian表示数据在存储器中的存放顺序,大端将高字节存放在低地址,小端将低字节存放在低地址。可以这样记忆,将高低字节存放在低地址对应于大小端。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理[1]。
例:整数0x12345678,78为低字节,12为高字节,其大小端表示如下图:
图1 整型0x12345678大小端表示[2]
二、用GDB查看大小端
判断大小端有很多种方法。可以参考处理器手册,一般来说,DEC、Inter X86属于小端,Sun、PowerPC属于大端,ARM则可以自主选择大小端。也可以写程序测试,这里介绍一种用GDB查看大小端方法,即声明一个变量,通过GDB查看其存放方式来判断大小端。
2.1 源程序如下:
- //filename:endian_test.c
-
#include <stdio.h>
-
int main()
-
{
-
int test = 0x12345678;
-
return 0;
-
}
2.2 编译进入调试
- jelline@jelline:~$ gcc -o endian_test -g endian_test.c /*需要加-g编译选项*/
-
jelline@jelline:~$ gdb endian_test
2.3 查看内存,判断大小端
- (gdb) l /*列出源代码,以便设置断点*/
-
1 //filename:endian_test.c
-
2 #include <stdio.h>
-
3 int main()
-
4 {
-
5 int test = 0x12345678;
-
6 return 0;
-
7 }
-
8
-
(gdb) break 6 /*设置断点*/
-
Breakpoint 1 at 0x80483c1: file endian_test.c, line 6.
-
(gdb) r /*执行到断点处*/
-
Starting program: /home/jelline/endian_test
-
Breakpoint 1, main () at endian_test.c:6
-
6 return 0;
-
(gdb) print &test /*打印test地址,即test第一个字节的地址*/
-
$1 = (int *) 0xbffff2a4
-
(gdb) x/4xb 0xbffff2a4 /*命令解析见后文*/
-
0xbffff2a4: 0x78 0x56 0x34 0x12
-
(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)
默认值为上一次操作指定的值
阅读(649) | 评论(0) | 转发(0) |