简介
之前有说到大小端的问题,今天就来举个栗子吧!!!
如果你忘记了,或者想看之前的理论部分,不要99,不要9.9,免费白嫖见下方~~~
狗都不学计算机——大端与小端
案例代码
代码功能非常简单,就是将abcdefgh
赋值给buffer
字符数组中,然后将字符数组的内容输出出来。
# 文件名:main.c
#include <stdio.h>
int main()
{
char buffer[10] = "abcdefgh";
printf("buffer = %s\n",buffer);
return 0;
}
实验环境
- WSL子系统ubuntu22.04
- gcc版本11.04
- gdb版本12.1(使用gef插件)
实验测试
1)使用gcc
将案例代码进行编译:gcc main.c -o main
,编译完成后可以运行查看结果。
2)在Linux下可以使用file
命令查看可执行文件的信息:file main
3)使用gdb进行动态调试
-
运行程序:
gdb-gef main
(因为使用了gef
插件,因此gdb
被我修改为gdb-gef
)
-
设置
main
处断点:b main
-
运行程序:
r
(第二张图为程序的相关信息)
-------------------------美丽的图片分割线---------------------------------
-
向下单步执行程序:
ni
,当看到程序执行到下图红框处时停止使用ni
命令
-
查看
rax
寄存器,可以看到存储的是buffer
的值
-
再执行一次
ni
,然后查看栈中的内容
接下来,详细看一下栈中的内容。
-
使用
x/s
命令,以字符串的形式输出内存中的内容
-
使用
x/xg
,以十六进制的形式输出8字节的内容
-
再使用
x/xb
,以十六进制的形式输出8字节的内容
x/xg
命令得到的结果为0x6867666564636261
(注意结果为十六进制),我们将其进行转换。
通过转换可以发现,字符串是以hgfedcba
的形式进行存储的,a
被存储在低位(注:x/s
会对输出结果进行处理,便于调试,真正存储是按二进制存储的,但一般便于观察,像gdb
这类的软件都是以十六进制进行显示的)
无情的广告时间
哈哈哈哈,又到了大家喜欢的广告时间了,喜欢的话给个关注呗,公众号:编码魔坊
,谢谢您的关注!!!