• 20145201 《信息安全系统设计基础》第2周学习总结


    20145201 《信息安全系统设计基础》第2周学习总结

    教材学习内容总结

    vim学习使用

    vim的几种模式:

    1.普通模式

    Vim的普通模式用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式,而不是大多数编辑器的插入模式。
    Vim强大的编辑能来自于其普通模式命令。普通模式命令往往需要一个操作符结尾。例如普通模式命令dd删除当前行,但是第一个"d"的后面可以跟另外的移动命令来代替第二个d,比如用移动到下一行的"j"键就可以删除当前行和下一行。另外还可以指定命令重复次数,2dd(重复dd两次),和dj的效果是一样的。
    -=普通模式进入插入模式的方法:a键(append/追加)键或者i(insert/插入)键。=-

    2.插入模式

    在这个模式中,大多数按键都会向文本缓冲中插入文本。
    -=插入模式中回到普通模式:ESC键。=-

    3.可视模式

    与普通模式类似,但移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。

    4.选择模式

    这个模式中,可以用鼠标或者光标键高亮选择文本。

    如果输入任何字符,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。

    5.命令行模式

    在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。

    在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
    -= 命令行模式进入普通模式:Esc 或 Ctrl + [ =-

    6.Ex模式

    这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。

    小结:
    三种常用模式(普通模式、插入模式和命令行模式)的切换:

    • 普通换插入: i 或 a
    • 插入换普通: Esc 或 Ctrl + [
    • 普通换命令行: :
    • 命令行换普通:Esc 或 Ctrl + [
      命令行模式下输入wq ,回车后保存并退出。

    游标移动

    普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。

    按键 说明
    h 左
    l 右(小写L)
    j 下
    k 上
    w 移动到下一个单词
    b 移动到上一个单词
    在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入

    命令 说明
    i 在当前光标处进行编辑
    I 在行首插入
    A 在行末插入
    a 在光标后插入编辑
    o 在当前行后插入一个新行
    O 在当前行前插入一个新行
    cw 替换从光标所在位置后到一个单词结尾的字符
    从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下

    退出vim

    1.命令行模式下退出vim

    从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑

    以下为其它几种退出方式:

    :q! 强制退出,不保存
    :q 退出
    :wq! 强制保存并退出
    :w <文件路径> 另存为
    :saveas 文件路径 另存为
    :x 保存并退出
    :wq 保存并退出
    2.普通模式下退出vim

    普通模式下输入Shift+zz即可保存退出vim

    删除文本

    普通模式下删除vim文本信息

    进入普通模式,使用下列命令可以进行文本快速删除:

    x 删除游标所在的字符
    X 删除游标所在前一个字符
    Delete 同x
    dd 删除整行
    dw 删除一个单词(不适用中文)
    d$或D 删除至行尾
    d^ 删除至行首
    dG 删除到文档结尾处
    d1G 删至文档首部

    复制粘贴和剪切

    1.复制及粘贴文本(普通模式中)

    1. 复制——y

    yy复制游标所在的整行(3yy表示复制3行)
    y^ 复制至行首,或y0。不含光标所在处字符。
    y$ 复制至行尾。含光所在处字符。
    yw 复制一个单词。
    y2w 复制两个单词。
    yG 复制至文本末。
    y1G 复制至文本开头。
    2) 粘贴——p

    p(小写)代表粘贴至光标后(下)
    P(大写)代表粘贴至光标前(上)
    2.剪切及粘贴

    dd删除命令就是剪切,剪切后就可以使用p来粘贴。

    按下tab键可以补全文件名。

       大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。

    gcc

    gcc 支持编译的一些源文件后缀名:

    • gcc编译文件的流程:

    我们可以把编译过程分成四步,以编译hello.c生成可执行文件hello为例,如下图:

    1)预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
    首先gcc会调用预处理程序cpp,由它负责展开在源程序中定义的宏(上例:#include <stdio.h>),向其中插入#include语句所包含的内容(原地展开stdio.h包含的代码)
    其中:.i后缀 hello.i这是一个经过预处理器处理之后的C源文件
    gcc的-E参数可以让gcc在预处理结束后停止编译过程。

    2)编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
    将hello.i编译为目标代码,gcc默认将.i文件看成是预处理后的C语言源代码,因此它会直接跳过预处理,开始编译过程。
    Tips:①gcc预处理源文件的时候(第一步),不会进行语法错误的检查
    ②语法检查会在第二步进行,比如花括号不匹配、行末尾没有分号、关键字错误......

    3)汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
    汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。

    4)链 接:gcc hello.o –o hello ;gcc -o 调用ld
    gcc连接器将目标文件链接为一个可执行文件,一个大致的编译流程结束
    编译过程比较难记,可以简化一下,前三步,GCC的参数连起来是“ESc”,相应输入的文件的后缀是“iso”。

    注意:
    -o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out

    在命令行上运行这个可执行目标文件需要输入它的名字:

    ./a.out

    • 用gcc编译一个c程序

    • gcc 选项列表
      1)gcc常用选项

    -c      只编译不链接,生成目标文件.o
    -S      只编译不汇编,生成汇编代码
    -E      只进行预编译,不做其他处理
    -g      在可执行程序中包含标准调试信息
    -o file 将file文件指定为输出文件
    -v      打印出编译器内部编译各过程的命令行信息和编译器的版本
    -I dir  在头文件的搜索路径列表中添加dir目录
    

    2)库选项

    -static 进行静态编译,即链接静态库,禁止使用动态库
    -shared 1.可以生成动态库文件
            2.进行动态编译,尽可能的链接动态库,没有动态库时才会链接同名静态库
    -L dir  在库文件的搜索路径列表中添加dir目录
    -lname  链接称为libname.a或者libname.so的库文件。
            如果两个库文件都存在,根据编译方式是static还是shared进行链接
    -fPIC   生成使用相对地址的位置无关的目标代码,
    (-fpic) 然后通常使用gcc的-static选项从该pic目标文件生成动态库文件。
    
    

    -静态库

    (1)静态链接

    像Unix ld程序这样的静态链接器,以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。

    为了构造可执行文件,链接器必须完成两个主要任务:

    符号解析
    重定位
    目标文件纯粹是字节块的集合,链接器将这些块链接起来,确定被连接块的运行时位置,并且修改代码和数据块中的各种位置。

    (2)静态库

    所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库,可以作为链接器的输入。当链接器构造一个输出的可执行文件时,它只拷贝静态库里被应用程序引用的目标模块。

    在Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个成员目标文件的大小和位置。存档文件由后缀.a识别。

    gdb

    一般来说,gdb主要帮忙用户完成下面4个方面的功能:

    1.启动程序,可以按照用户自定义的要求随心所欲的运行程序。
    2.可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。
    3.当程序停住时,可以检查此时程序中所发生的事。
    4.动态地改变程序的执行环境。
    从上面来看,gdb和一般的调试工具区别不大,基本上也是完成这些功能,不过在细节上,会发现gdb这个调试工具的强大。大家可能习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。­­­­­­­­­­­­­­­­­­­­­­­­­­­

    注意使用GCC编译时要加“-g”参数。

    GDB最基本的命令有:

    • gdb programm(启动GDB)
    • b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
    • run 开始运行程序
    • bt 打印函数调用堆栈
    • p 查看变量值
    • c 从当前断点继续运行到下一个断点
    • n 单步运行
    • s 单步运行
    • quit 退出GDB

    四种断点:
    1.行断点
    b [行数或函数名] <条件表达式>
    2.函数断点
    b [函数名] <条件表达式>
    3.条件断点
    b [行数或函数名] <if表达式>
    4.临时断点
    tbreak [行数或函数名] <条件表达式>

    Make和Makefile

    make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。

    而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。

    最终实现——自动化编译

    如何进入Makefile?
    $ vim Makefile

    1.Makefile 基本规则

    Makefile的一般写法:

    一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:

    需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;

    要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。

    创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头

    格式为:

    test(目标文件): prog.o code.o(依赖文件列表)
    tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
    .......
    即:
    target: dependency_files
    command
    2.使用带宏的 Makefile

    Makefile中的宏,也称作变量。

    变量是在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。

    在Makefile中定义宏的格式为:

    macroname = macrotext
    使用宏的格式为:

    $(macroname)

    练习

    使用vim 输入以下代码,联系使用“K”查找帮助文档:

    3.练习gcc编译运行代码;

    4.练习gdb调试代码;

    5.把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so;

    6.编写makefile,让代码编译,上述静态库和共享库的使用自动化。

    教材学习中的问题和解决过程

    问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?

    答:我认为应该优先选用n命令。因为n命令它直接是函数的结果,如果正确就继续向下运行,如果不正确说明函数内部有问题,需要用step进入函数检查。

    代码调试中的问题和解决过程

    关于gcc部分
    用Gvim编辑代码时,储存文件名为hello,不能在Xfce终端里正常运行代码。
    解决:需要将文件名直接保存为hello.c。后缀.c为C语言源文件。

    本周代码托管截图

    其他(感悟、思考等,可选)

    本周学习了熟悉vi的基本操作,gcc编译器的使用,gdb调试技术等内容。虽然在vim学习中,第一次需要张我大量的常用按键,但掌握之后发现这些都是非常方便的功能,减去了不必要的麻烦。通过学习本周学习内容发现,老师所给的所有学习资料都是非常有用的,是互补的关系,要充分利用这些教学资源,不断提高自学能力,对以后的学习帮助很大。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 100/100 2/2 25/25
    第二周 100/200 1/3 30/55

    参考资料

  • 相关阅读:
    纪念又一次ak
    hdu5618
    bzoj3393
    bzoj3438
    [JSOI2007]建筑抢修
    [CQOI2014]数三角形
    [BZOJ2662][BeiJing wc2012]冻结
    [NOIP2015]运输计划
    [ZJOI2006]超级麻将
    [APIO2009]抢掠计划
  • 原文地址:https://www.cnblogs.com/20145201lzx/p/5900179.html
Copyright © 2020-2023  润新知