zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199315《Linux内核原理与分析》第二周作业

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

    上周修正

    “Linux还是要多用”,于是下载了虚拟机。

    本周所学

    《庖丁解牛Linux》第一章

    8086CPU中总共有14个16位寄存器

    • 通用寄存器分为数据寄存器、指针寄存器、变址寄存器
      • 数据寄存器
        • AX:累加寄存器,也称为累加器
        • BX:基地址寄存器
        • CX:计数器寄存器
        • DX:数据寄存器
      • 指针寄存器
        • SP:堆栈指针寄存器
        • BP:基指针寄存器
      • 变址寄存器
        • SI:源变址寄存器
        • DI:目的变址寄存器
    • 控制寄存器分为指令指针寄存器IP、标志寄存器FLAG
    • 段寄存器又分为代码段寄存器CS、指数据段寄存器DS、堆栈段寄存器SS和附加段寄存器ES

    pushl/popl和call/ret汇编指令

    范例指令 对应的指令动作
    pushl %eax subl $4, %esp movl %eax,(%esp)
    popl %eax movl(%esp),%eax add $4,%esp
    call 0x12345 pushl %eip() movl $0x12345,%eip()
    ret popl %eip(*)

    课后实验

    将C语言代码汇编成“.s”文件,并分析“.s”文件中的汇编代码的执行过程

    保存复制的代码到“实验楼”的虚拟机环境

    在“实验楼”的虚拟机环境下粘贴代码

    将粘贴的代码保存到main文件

    编译main.c代码文件,查看程序返回值,再将其编译成以“.s”作为扩展名的汇编代码文件

    查看main.s文件,查看代码执行过程

    代码:

    
    #进入文本编辑模式
    $ vi main.c
    #直接编译
    $ gcc main.c
    #查看程序返回值
    $ echo $?
    #把main.c编译成以“.s”作为扩展名的汇编代码文件
    $ gcc -S -o main.s main.c -m32
    #查看main.s文件
    $ vi main.s
    
    

    云班课视频《计算机是如何工作》

    参考资料

    //在64位环境下编译成32位的汇编
    gcc -S -o ccode32.s ccode.c -m32
    //链接时会缺少构建32 位可执行程序缺少的包,使用以下指令安装:
    sudo apt-get install libc6-dev-i386
    //编译链接成32位的可执行文件
    gcc -o ccode32 ccode.c -m32

    mov指令及几种内存寻址方式

    b,w,l,q分别代表8位,16位,32位和64位

    指令 相当于
    movl %eax %edx edx=eax 寄存器寻址,以%开头的寄存器标识符
    movl $0x123 %edx edx=0x123 立即寻址,立即数以$开头的数值
    movl 0x123 %edx edx=(int32_t)0x123 直接寻址,直接访问一个指定的内存地址的数据
    movl (%ebx) %edx edx=(int32_t)ebx 间接寻址,将寄存器的值作为一个内存地址来访问内存
    movl 4(%ebx) %edx edx=(int32_t)(ebx+4) 变址寻址,在间接寻址之时改变寄存器的数值

    其他

    eip寄存器不能被直接修改,只能通过特殊指令间接修改

    实验楼之实验一

    跟课本作业差不多,不赘述了。

    疑难困惑

    Markdown插入表格语法

    Markdown 代码:

    左对齐标题 右对齐标题 居中对齐标题
    短文本 中等文本 稍微长一点的文本
    稍微长一点的文本 短文本 中等文本

    语法说明
    1)|、-、:之间的多余空格会被忽略,不影响布局。
    2)默认标题栏居中对齐,内容居左对齐。
    3)-:表示内容和标题栏居右对齐,:-表示内容和标题栏居左对齐,:-:表示内容和标题栏居中对齐。
    4)内容和|之间的多余空格会被忽略,每行第一个|和最后一个|可以省略,-的数量至少有一个。
    5)表格的语句上一行必须为空行,不然表格不生效。

    文本编辑器的退出

    在保存并退出文本编辑器时候,按照课本提示,按“shift”+“:”,输入“wq”保存退出无效,如下图所示:

    后发现需要先按esc退出编辑状态。现将本次所了解的知识简单记录:

    当文本编辑结束之后,通常需要退出编辑器。退出编辑器又分为4种情况:保存退出、正常退出、不保存退出及强制退出。
    按键盘左上角的"ESC",此时,左下角的插入状态不见了。此时输入“冒号”,即":"(不需双引号),在下方会出现冒号,等待输入命令。

    按下esc键和输入冒号(:)之后,输入的命令不同,代表不同的退出方式:

    1. 保存退出:WQ

    W:write,写入
    Q:quit,退出
    保存退出还有二个方法:
    A:在最后输入命令时,直接输入"x",也是一样的,即X=WQ。
    B:最快捷的方法:按了ESC后,直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了,即是按2下大写的Z。

    1. 正常退出:q

    正常退出有个前提条件是:打开的文本文件在内容上没有被改动过。
    如果在上次的基础上有改动,输入q报错如下:
    只有在q后面加了感叹号!才能退出,因为有所改动!只能选不保存退出或强制退出

    1. 不保存退出:q!
    2. 强制退出!

    删除以“.”打头的辅助字段

    在拜读了娄豪同学的博客之后,尝试了使用下行代码删除以“.”打头的辅助字段

    g/.s*/d
    
    

    最初错误地在终端直接输入了命令,报错

    后经仔细阅读课本,发现应该在vim中输入该命令

    十分感激娄豪君!没有他的博客,我就会忽视该命令的学习!

    此为本人Linux学习第二周的内容,如有不足,还请批评指正,不胜感激。

    以上

  • 相关阅读:
    MySQL基础学习笔记
    网络编程入门笔记
    JUC并发编程学习笔记
    育儿技巧
    无法下载安装文件,请检查internet连接
    用户 'NT ServiceSSISScaleOutMaster140' 登录失败
    Javascript中apply、call、bind
    JQuery 源码解析一
    docker容器中部署 kafka 和 elk
    查找库中所有表所有字段中某个指定的字符
  • 原文地址:https://www.cnblogs.com/qianxiaoxu/p/11561647.html
Copyright © 2011-2022 走看看