栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

2021-2022-1 20212807《Linux内核原理与分析》第二周作业

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-2022-1 20212807《Linux内核原理与分析》第二周作业

第二周作业
  • 一、本周学习中遇到的问题
    • 1.程序无法连接动态库
    • 2.-m32
    • 3.括号问题
  • 二、 实验一 通过反汇编一个C程序,分析汇编代码理解计算机是如何工作的
    • 1.实验过程
    • 2.汇编代码分析
  • 三、第一章知识点


一、本周学习中遇到的问题 1.程序无法连接动态库

运行后出现如下错误:error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory.

为何会出现这个错误:链接器ld提示找不到库文件。ld默认的目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道库文件所在的路径。

解决方法:将文件libmath.so复制到目录/usr/lib中。

2.-m32

实验楼中环境是64位Linux环境,所以在汇编时,gcc -S -o main.s main.c 语句后需要加 -m32 。

3.括号问题

在学习汇编指令时,发现%ebp有的加了括号有的没加,不太理解。后来了解到,%esp表示地址,(%esp)表示地址对应的存储单元上存放的数据。

二、 实验一 通过反汇编一个C程序,分析汇编代码理解计算机是如何工作的 1.实验过程

新建一个简单的C程序


用gcc将main.c汇编成汇编代码

打开main.s,删除所有以点开头后的内容,留下来的就是纯汇编代码。

2.汇编代码分析
g:
    pushl	%ebp			12//ebp入栈
	movl	%esp,%ebp		13//ebp=esp,生成新的堆栈空间
	movl	8(%ebp),%eax	14//将变址寻址ebp+8所指向内存的值存入eax,其值为为第10步中
	addl	$2, %eax		15//将eax的值加2
	popl	%ebp			16//pop第12步中的ebp,ebp回到第7步
	ret						17//返回,继续执行第11步的下一条指令
f:
	pushl	%ebp			6//将ebp入栈,保存f的栈底
	movl	%esp, %ebp		7//ebp=esp,生成新的堆栈空间
	subl	$4, %esp		8//esp减4
	movl	8(%ebp), %eax	9//ebp变址寻址,即将ebp加8,然后获取ebp指向内存里的值,存入eax,此时eax中内容是main第四行存入的6
	movl	%eax, (%esp)	10//eax内容存入esp指向的内存
	call	g				11//eip入栈,调用g
	leave					18//相当于move ebp,esp;pop ebp
	ret						19//相当于pop eip,执行后返回
							  //到第5步的下一条指令
main:
	pushl	%ebp			1//ebp入栈,保存main的栈底
	movl	%esp, %ebp		2//edp=esp,生成新的堆栈
	subl	$4, %esp		3//esp减4,增加一个存储空间
	movl	$6, (%esp)		4//esp指向的内存存入数值6
	call	f				5//此时eip的内容为call的下一条指令地址,call相当于执行了:pushl %eip;movel f,%eip
	addl	$1, %eax		20//eax=+1
	leave					21//栈回到初始状态
	ret						22//pop eip,退出main

汇编代码中,默认使用eax寄存器返回函数的返回值给上一次调用函数。ebp为栈底指针,esp为栈顶指针,eip为指令指针。整个运行过程按照注释中的数字顺序进行。

三、第一章知识点

1.寄存器
①数据寄存器:
数据寄存器包括:AX(Accumulator)、BX(base)、CX(Counter)、DX(Data)四个通用寄存器。数据寄存器可以以字节(8位)为单位,也可以以字(16位)为单位进行操作。
AX:AH,AL作为累加器,在算术、逻辑运算中,也在某些指令中隐含使用。
BX:BH,BL经常用作基址寄存器。
CX:CH,CL在循环指令和串操作指令中隐含作为计数器用。
DX:DH,DL经常用在乘法除法存放高位字,存放I/O端口地址。
②段寄存器:
CS(Code Segment)为代码段寄存器,只能存放程序段首地址。
DS(Data Segment)为数据段寄存器,只能存放数据段首地址。
ES(Extra Segment)为附加段寄存器,只能存放数据段首地址。
SS(Stack Segment)为堆栈段寄存器,只能存放堆栈段首地址。
主存划分成多少个存储段是任意的。但是把由段寄存器CS,DS,ES,SS指明的段称为当前段,在程序运行的任何时刻,主存最多只能有4个当前段。
③控制寄存器:
IP(Instruction Point)指令指针
IP是指令地址指针,用以指示程序运行至何处。程序运行时,IP的值自动修改,但始终存放即将执行指令的段内偏移地址。
IP不能用指令直接访问,即不能用指令去取出IP的值或者给IP设定值。
FR(Flags Register)标志寄存器
标志寄存器FR体现了处理器CPU的当前状态和某些控制。FR共有9个标志位。其中6个(CF,PF,AF,ZF,SF,OF)为标志位,反映算术或逻辑运指令执行后的某些状态;另外3个标志位(TF,IF,DF)为控制标志位,用以体现处理器CPU的控制。

2.常用汇编指令

简单传送指令:

简单加减指令:

堆栈和堆栈操作:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291669.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号