2019-2020-1 20199324《Linux内核原理与分析》第二周作业

一.知识点总结

1.冯诺依曼体系结构的要点:

①五大基本类型部件:运算器、控制器、存储器、输入设备、输出设备
②用二进制来表示指令和数据
核心:存储程序计算机

2.常见的汇编指令

mov指令(l指32位,b指8位,w指16位,指64位)

pushl %eax

把EAX寄存器的值压到堆栈栈顶 ,栈在增长

popl %eax

从堆栈栈顶取一个存储单元,从堆栈栈顶的位置放到EAX寄存器中,栈在收缩

call 0x12345

call指令是函数调用,调用一个地址

ret

ret指令是函数返回

3.寻址方式

寄存器寻址:操作的是寄存器,不和内存打交道

movl %eax, %edx

立即寻址:也和内存没有关系

movl $0x123, %edx

直接寻址:用内存地址直接访问内存中的数据

movl 0x123, %edx

间接寻址:寄存器加个小括号

movl (%ebx), %edx

变址寻址:在间接寻址的基础上,在原地址上加一个立即数4

movl 4(%ebx), %edx

4.几个比较重要的寄存器

EAX 累加寄存器
EBX 基址寄存器
ECX 计数寄存器
EDX 数据寄存器
EBP 堆栈基址指针
ESI EDI 变址寄存器
ESP 堆栈栈顶寄存器

二.实验:反汇编一个简单的C程序

1.反汇编的定义:

把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思。

2.实验过程:

在命令行下输入“ vi main.c ”命令即可打开文本编辑器VIM编辑main.c文件

然后按“ i ”键进入输入状态,从剪切板复制程序(修改了其中部分数字)

然后点击【esc】键退出编辑模式,然后点击“ : ”键进入命令行模式,输入wq,将粘贴的代码保存到main.c文件中

编译main.c这个代码文件

gcc main.c

此时会生成一个a.out文件,但是执行效果没有任何输出信息
通过如下命令查看程序的返回值

echo $?


可以看到程序返回值为49

使用如下命令把main.c编译成一个汇编代码

gcc –S –o main.s main.c -m32

打开main.s文件,发现该汇编文件有一些以“.cfi_”和"."打头的字符串
通过如下命令可以删除所有以”.“打头的命令

可以获得“干净”的汇编代码

3.分析main.c中的汇编代码:



4. 遇到的问题

1.

在使用命令

echo $?

查看程序的返回值时,一定要执行目标文件,否则得到的返回值为0.

2.

在VIM中,通过“ g ^ .s * / d”命令即可删除所有以 . 打头的字符串 没有实现。
最后查阅其他同学的博客发现该命令为

3.

指令

movl  8(%ebp),%eax

是把EBX寄存器存储的数值加8,也就是说,把所对应的的立即数放到EAX寄存器中去,而当前EBP的寄存器所指向的位置不变。

4.

在使用VIM编辑器的时候遇到一些问题,通过询问同学和查阅资料,总结如下:
①vim是个“文本编辑器”;可以将vim视为vi的高级版本;
②vi共有三种模式:
一般模式:以vi打开一个文件就可以进入一般模式,在这个模式中,可以使用上下左右健开移动光标、删除字符、复制粘贴文件数据(但是无法编辑内容);
编辑模式:按下“i,I,o,O,a,A,r,R”等任何一个字母之后会进入编辑模式,若要回到编辑模式,按下【esc】即可退出编辑模式;
命令行模式:在一般模式下,输入“:、/、?”3个中的任意一个按钮,可将光标移到最下面一行。该模式可以提供查找数据的操作,可读取,保存,大量替换字符,离开vi,显示行号等操作。
一般模式与编辑模式及命令行模式可以互相切换。但编辑模式和命令行模式之间不可以互相切换

原文地址:https://www.cnblogs.com/yangdd/p/11557316.html