IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 2021-2022-1 20212808《Linux内核原理与分析》第二周作业 -> 正文阅读

[系统运维]2021-2022-1 20212808《Linux内核原理与分析》第二周作业

遇到的问题:

汇编代码的理解还不够熟练,需要画图,对照着代码一步一步走。
比如寄存器相关知识:
%eax,%后面是寄存器的名称。
%ebx是指这个起存器中存的值是内存地址。
(%ebx)是指这个内存地址所存储的数据。
寄存器寻址:movl %eax,%edx这句指的是把寄存器%eax内容放到%edx中.

在这里插入图片描述

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

实验步骤

  1. 在实验楼环境中进入目录Code(注:进入Code文件是为了保存相关代码文件),创建main.c,并编辑main.c文件,截图如下:
    在这里插入图片描述
  2. vim编辑器编辑main.c程序,代码如下:
int g(int x)
{
    return x + 3;
}

int f(int x)
{
    return g(x);
}

int main(void)
{
    return f(6) + 2;
}

在这里插入图片描述
3. 用 gcc 将main.c编译成汇编代码,代码如下:

$ gcc main.c
$ ./a.out
$ echo $?
$ gcc –S –o main.s main.c -m32

在这里插入图片描述

查看main.s,源码繁琐,删除以点开头的,剩下就是纯汇编代码:
在这里插入图片描述
简化后汇编代码:
在这里插入图片描述

实验分析如下:

程序从main 函数开始执行,具体过程如下:

main:

  • pushl %ebp,ESP的地址减4即ESP指向标号1,将EBP寄存器的值放到栈顶;
  • movl %esp,%ebp,将EBP指向ESP所指的位置即标号1;
  • subl $4,%esp,ESP寄存器减4 即ESP指向标号2;
  • movl $6,(%esp) ,将立即数6放入到ESP所指向的位置,为即将调用的f函数做准备;
  • call f, 把EIP的值23压入栈顶,再将函数f的第一条指令的位置9放到EIP中,ESP指向标号3;
    f:
  • pushl %ebp, ESP指向标号4,将EBP寄存器的值放到栈顶;
  • movl %esp,%ebp, 将EBP指向ESP所指的位置即标号4;
  • subl $4,%esp,ESP寄存器指向标号5;
  • movl $8(%ebp),%eax ,EBP寄存器变址寻址,EBP寄存器的值加8,指向立即数为6的位置,将立即数6放到EAX寄存器中;
  • movl %eax,(%esp), 将EAX中存储的立即数6放到ESP所指的位置;
  • call g,把EIP的值即15压入栈顶,再将函数g的第一条指令的位置2放到EIP中,ESP指向标号6;
    g:
  • pushl %ebp, ESP指向标号7,将EBP寄存器的值放到栈顶;
  • movl %esp,%ebp,将EBP指向ESP所指的位置,并且EIP的值加一,指向8(%ebp),%eax。
  • movl 8(%ebp),%eax,EBP寄存器变址寻址,EBP寄存器的值加8,指向立即数为1的位置,将立即数1放到了EAX寄存器中;
  • addl $3,%eax,将立即数3加到EAX中,EAX的值即6+3为9;
  • popl %ebp,恢复函数f的函数调用堆栈基址EBP寄存器,即EBP指向标号4,ESP指向标号6;
  • ret ,将ESP寄存器所指向的栈空间存储单元放到EIP寄存器中,即EIP指向第15行指令,ESP指向标号5;
    f:
  • leave ,撤销函数堆栈,EBP指向标号1,ESP指向标号3;
  • ret ,将ESP寄存器所指向的内容放到EIP寄存器中,即EIP指向第23行指令,ESP指向标号2;
    main:
  • add $2,%eax, 把EAX寄存器立即数加2,即9+2为11。EAX存储器是默认存储函数返回值的寄存器;
  • leave,撤销函数main的堆栈;

《Linux内核分析》第一章知识

  • 冯 诺依曼体系结构:运算器、存储器、控制器、输入设备和输出设备。
  • 计算机内部采用二进制表示指令和数据。
  • CPU就是执行下一条指令,从内存中取下一条指令来执行。
  • ABI接口主要是一些指令的编码。
  • 通用寄存器
    EAX:累加器
    EBX:基地址寄存器
    ECX:计数寄存器
    EDX:数据寄存器
    EBP:堆栈基址针
    ESI、EDI:变址寄存器
    ESP:堆栈顶指针
  • 段寄存器
    CS:代码段寄存器,其值为代码段的段值
    DS:数据段寄存器,其值为数据段的段值
    ES:附加段寄存器,其值为附加段的段值
    SS:堆栈段寄存器,其值为堆栈段的段值
    FS:附加段寄存器,其值为附加数据段的段值
    GS:附加段寄存器,其值为附加数据段的段值
  • 最常见的汇编指令是mov指令,movl中的l是指32位。
  • %eax,%后面是寄存器的名称。
    %ebx是指这个寄存器中存的值是内存地址。
    (%ebx)是指这个内存地址所存储的数据。
  • 几个重要指令:pushl/pop 压栈/出栈和call/ret 调用函数/返回函数
    在这里插入图片描述
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:25:02  更:2021-10-03 17:25:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:05:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码