• 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,显示行号等操作。
    一般模式与编辑模式及命令行模式可以互相切换。但编辑模式和命令行模式之间不可以互相切换

  • 相关阅读:
    ios 关于collectionView.performBatchUpdates()方法 --时时更新
    [iOS Xcode注释插件]
    Markdown编辑器简单总结
    [iOS Keychain本地长期键值存储]
    [iOS 利用MapKit和CoreLocation框架打造精简的定位和导航]
    <转>iOS9 Day-by-Day:iOS开发者必须了解的iOS 9新技术与API
    [PHP 作为iOS后台Json格式HTTP通信及文件上传的实现]
    [iOS AFNetworking框架实现HTTP请求、多文件图片上传下载]
    [Java 实现AES加密解密]
    [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]
  • 原文地址:https://www.cnblogs.com/yangdd/p/11557316.html
Copyright © 2020-2023  润新知