2021-2022-1 20212807《Linux内核原理与分析》第二周作业
2021/10/4 7:14:38
本文主要是介绍2021-2022-1 20212807《Linux内核原理与分析》第二周作业,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
第二周作业
- 一、本周学习中遇到的问题
- 1.程序无法连接动态库
- 2.-m32
- 二、 实验一 通过反汇编一个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 。
二、 实验一 通过反汇编一个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为指令指针。整个运行过程按照注释中的数字顺序进行。
这篇关于2021-2022-1 20212807《Linux内核原理与分析》第二周作业的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南