热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20212022120212807《Linux内核原理与分析》第二周作业

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




第二周作业


  • 一、本周学习中遇到的问题
    • 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为指令指针。整个运行过程按照注释中的数字顺序进行。



推荐阅读
author-avatar
hnzhenlin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有