计算机系统实验(1)-实验与开发环境的使用

第一周 实验与开发环境的使用

第一章 基本实验工具GCC的使用

一、程序的转换过程
在这里插入图片描述

说明:Linux的gcc编译驱动程序可以实现呈现的转换过程
二、gcc常用命令

  • 2.1、预编译

gcc -E hello.c -o hello.i
说明:
-E,只预编译。直接输出预编译结果。
-E参数,进行预编译时,将输出信息,将程序所包含的头文件,函数,宏定义等,进行扩展。

  • 2.2、编译

gcc -S hello.i -o hello.s
说明:
S,只执行到源代码到汇编代码的转换,输出汇编代码。

  • 2.3、汇编

gcc -c hello.s -o hello.o
-o, 指定输出文件名 该参数可以省略。默认下(gcc sourceFile.c):生成名为a.out的可执行文件。
-c:生成名为hello.o目标文件。(进行编译,不链接)

  • 2.4 链接

gcc hello.o -o hello

  • 2.5 直接生成可执行目标文件

gcc hello.c -o hello

  • 2.6 其他

-o0 表示编译时采用的优化级别
-m32 表示编译成×86-32位的指令
三、示例

  • 3.1用gcc命令生成可执行目标文件

hello.c文件
在这里插入图片描述
在这里插入图片描述

  • 3.2 文本文件和二进制文件
  • 3.2.1文本文件

用ASCII码存储,文件中每一个英文字符用8位的ASCII码表示
如:hello.c、hello.i、hello.s

  • 3.2.2二进制文件

用01序列存储的机器指令、数据和其他信息
如:hello.o、hello

  • 3.2.3机器指令

1、计算机可识别和执行的,所以称为目标代码。
2、目标文件分为可重定位目标文件和可执行目标文件。
3、可重定位目标文件:由单个模块组成,不可以直接执行,如hello.o文件

第二章 基本实验工具Objdump的使用

Objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。

一、基本Objdump命令
※反汇编
objdump -S gdbtest.o> gdbtesto.txt
objdump -S gdbtest> gdbtest.txt
说明:
“-S”表示在反汇编后的内容加入源代码
“>” 表示将反汇编内容保存到文本文件中
二、示例
将gdbtest.c编译为可执行目标文件
在这里插入图片描述

对gdbtest.o和gdbtest进行反汇编
在这里插入图片描述

打开反汇编文件

在这里插入图片描述

三、反汇编文件解释说明
1、十六进制表示的机器指令
在这里插入图片描述

2、机器指令反汇编后的机器指令
在这里插入图片描述

3、机器指令存储的地址
在这里插入图片描述

4、可执行目标文件中指令和数据都有一个确定的地址
按照操作系统给定的存储器地址映射空间分配
不是内存的物理地址,是一个虚拟地址
第三章基本实验工具GCC的使用
一、GBD调试的基本步骤
第一步:启动GDB调试工具,加载要被调试的可执行文件
在这里插入图片描述

第二步:设置断点
在这里插入图片描述

第三步:启动并运行程序
在这里插入图片描述

第四步:查看程序运行时的当前状态
1、程序的当前断点
含义:反映程序执行到了哪一步,下一步要执行哪一条指令
eip寄存器:保存下一条将要执行的指令地址
指令: i r eip(或i r)
2、通用寄存器的内容
指令:i r eax ebx ecx edx(或i r)
3、存储器的单元内容
指令:x/8xb 0xffffd2bc
X/2xw 0xffffd2bc
指令说明:b:按字节显示 w:按4字节显示
“8”、“2”表示要显示的数据单元个数
“0xffffd2bc”表示要显示的存储单元起始地置
4、栈帧信息
当前栈帧字节数:y=R[ebp]-R[esp]+4
指令:
(1)当前栈帧范围: i r esp ebp //esp是栈顶指针,ebp是栈底指针
(2)显示当前栈帧内容:x/yxb $esp
x/zxw $esp //z=y/4
在这里插入图片描述

第五步:执行下一条指令或语句
第六步:退出调试
在这里插入图片描述

二、示例
在这里插入图片描述

反汇编代码
在这里插入图片描述

第一步:启动调试
在这里插入图片描述

第二步:在main函数处设置断点
在这里插入图片描述

第三步: run
//启动运行程序
在这里插入图片描述

第四步4: si (或s)
//执行-条指令(或c语句)
在这里插入图片描述

第五步: i r
//查看各寄存器的内容
在这里插入图片描述

第六步: i r eip
//查看eip寄存器的内容
在这里插入图片描述

第七步: i r esp ebp
//查看esp和ebp寄存器的内容
在这里插入图片描述

第八步: x/yxb $esp
//按字节显示当前栈帧内容
//y=R[ebp]-R[esp] +4
或x/zxw $esp
在这里插入图片描述

//按4字节显示当前栈帧内容
在这里插入图片描述

//z=(R[ebp]-R[esp]+ 4)/4
第九步: quit
//退出调试
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值