学习目标:
复习LInux命令,特别是man -k,cheat,grep -nr xxx/usr/include
复习vi,gcc,gdb,make的使用
复习教材内容1-4,6,7
复习前面的考题
Linux命令
格式:man -k keyword。
举例:man -k ad 显示man手册中所有包含ad的命令或说明文件并列条显示
1.使用vim命令进入vim界面
vim后面加上你要打开的已存在的文件名或者不存在(则作为新建文件)的文件名。
直接使用vim也可以打开vim编辑器,但是不会打开任何文件。
进入命令行模式后输入:e 文件路径 同样可以打开相应文件。
2.游标移动
在进入vim后,按下i键进入插入模式。
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
按键
说明
h
左
l
右(小写L)
j
下
k
上
w
移动到下一个单词
b
移动到上一个单词
1.进入插入模式
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入
命令
说明
i
在当前光标处进行编辑
I
在行首插入
A
在行末插入
a
在光标后插入编辑
o
在当前行后插入一个新行
O
在当前行前插入一个新行
cw
替换从光标所在位置后到一个单词结尾的字符
注意每次要先回到普通模式才能切换成以不同的方式进入插入模式
1.命令行模式下保存文档
从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下
退出vim
1.命令行模式下退出vim
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑。
命令
说明
:q!
强制退出,不保存
:q
退出
:wq!
强制保存并退出
:w <文件路径>
另存为
:saveas 文件路径
另存为
:x
保存并退出
:wq
保存并退出
2.普通模式下退出vim
普通模式下输入Shift+zz即可保存退出vim
1.普通模式下删除vim文本信息
进入普通模式:
命令
说明
x
删除游标所在的字符
X
删除游标所在前一个字符
Delete
同x
dd
删除整行
dw
删除一个单词(不适用中文)
d$或D
删除至行尾
d^
删除至行首
dG
删除到文档结尾处
d1G
删至文档首部
除此之外,你还可以在命令之前加上数字,表示一次删除多行,如:
2dd表示一次删除2行
1.重复执行上次命令
在普通模式下.(小数点)表示重复上一次的命令操作
普通模式下输入x,删除第一个字符,输入.(小数点)会再次删除一个字符,除此之外也可以重复dd的删除操作
2.执行指定次数相同的命令
进入普通模式输入N,N表示重复后面的次数,
在普通模式下,可以使用dw或者daw(delete a word)删除一个单词,到dnw表示删除n个单词
1.行间跳转
命令
说明
nG(n Shift+g)
游标移动到第 n 行(如果默认没有显示行号,请先进入命令模式,输入:set nu以显示行号)
gg
游标移动到到第一行
G(Shift+g)
到最后一行
使用Ctrl+o快速回到上一次(跳转前)光标所在位置
2.行内跳转
普通模式下使用下列命令在行内按照单词为单位进行跳转
命令
说明
w
到下一个单词的开头
e
到下一个单词的结尾
b
到前一个单词的开头
ge
到前一个单词的结尾
0或^
到行头
$
到行尾
f<字母>
向后搜索<字母>并跳转到第一个匹配的位置(非常实用)
F<字母>
向前搜索<字母>并跳转到第一个匹配的位置
t<字母>
向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用)
T<字母>
向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)
1.复制及粘贴文本
普通模式中使用y复制
普通模式中,yy复制游标所在的整行(3yy表示复制3行)
普通模式中,y^ 复制至行首,或y0。不含光标所在处字符。
普通模式中,y$ 复制至行尾。含光所在处字符。
普通模式中,yw 复制一个单词。
普通模式中,y2w 复制两个单词。
普通模式中,yG 复制至文本末。
普通模式中,y1G 复制至文本开头。
普通模式中使用p粘贴
普通模式中,p(小写)代表粘贴至光标后(下)
普通模式中,P(大写)代表粘贴至光标前(上)
2.剪切及粘贴
使用p来粘贴
交换上下行:ddp
1.替换和撤销(Undo)命令
替换和Undo命令都是针对普通模式下的操作
命令
说明
r+<待替换字母>
将游标所在字母替换为指定字母
R
连续替换,直到按下Esc
cc
替换整行,即删除游标所在行,并进入插入模式
cw
替换一个单词,即删除一个单词,并进入插入模式
C(大写)
替换游标以后至行末
~
反转游标所在字母大小写
u{n}
撤销一次或n次操作
U(大写)
撤销当前行的所有修改
Ctrl+r
redo,即撤销undo的操作
1.使用命令进行快速调整缩进操作
普通模式下输入>> 整行将向右缩进(使用,用于格式化代码超爽)
普通模式下输入<< 整行向左回退
普通模式下输入:进入命令行模式下对shiftwidth值进行设置可以控制缩进和回退的字符数
2.shiftwidth命令
设置可以控制缩进和回退的字符数 获取目前的设定值:
:set shiftwidth
设置缩进为10个字符:
:set shiftwidth=10
3.调整文本位置
命令行模式下输入:ce(center)命令使本行内容居中
命令行模式下输入:ri(right)命令使本行文本靠右
命令行模式下输入:le(left)命令使本行内容靠左
1.快速查找
普通模式下输入/然后键入需要查找的字符串 按回车后就会进行查找。 ?与/功能相同,只不过?是向上而/是向下查找。 进入查找之后,输入n和N可以继续查找n表示继续查找,N反向查找
2.高级查找
普通模式下输入*寻找游标所在处的单词
普通模式下输入#同上,但 * 是向前(上)找,#则是向后(下)找
普通模式下输入g*同* ,但部分符合该单词即可
普通模式下输入g#同# ,但部分符合该单词即可
以上查找n,N 的继续查找命令依然可以用
1.使用vim编辑多个文件
编辑多个文件有两种形式,一种是在进入vim前使用的参数就是多个文件。另一种就是进入vim后再编辑其他的文件。 同时创建两个新文件并编辑
$ vim 1.txt 2.txt
默认进入1.txt文件的编辑界面
命令行模式下输入:n编辑2.txt文件,可以加!即:n!强制切换,之前一个文件的输入没有保存,仅仅切换到另一个文件
命令行模式下输入:N编辑1.txt文件,可以加!即:N!强制切换,之前文件内的输入没有保存,仅仅是切换到另一个文件
2.进入vim后打开新文件
命令行模式下输入:e 3.txt 打开新文件3.txt
命令行模式下输入:e# 回到前一个文件
命令行模式下输入:ls可以列出以前编辑过的文档
命令行模式下输入:b 2.txt(或者编号)可以直接进入文件2.txt编辑
命令行模式下输入:bd 2.txt(或者编号)可以删除以前编辑过的列表中的文件项目
命令行模式下输入:e! 4.txt,新打开文件4.txt,放弃正在编辑的文件
命令行模式下输入:f 显示正在编辑的文件名
命令行模式下输入:f new.txt,改变正在编辑的文件名字为new.txt
3.恢复文件
如果因为断电等原因造成文档没有保存,可以采用恢复方式,vim -r进入文档后,输入:ewcover 1.txt来恢复
$ vim -r 1.txt
1.可视模式命令简介
在普通模式下输入v(小写),进入字符选择模式,就可以移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。
在普通模式下输入Shift+v(小写),进入行选择模式,按下V之后就会把整行选取,您可以上下移动光标选更多的行,同样,再按一次Shift+v就可以取消选取。
在普通模式下输入 Ctrl+v(小写),这是区域选择模式,可以进行矩形区域选择,再按一次Ctrl+v取消选取。
在普通模式下输入d删除选取区域内容
在普通模式下输入y复制选取区域内容
2.可视模式命令练习
Shift+v(小写V),进入可视模式进行行选择
在普通模式下输入 Ctrl+v(小写v),进入可视模式进行矩形区域选择
1.视窗操作简介
命令行模式下输入:sp 1.txt 打开新的横向视窗来编辑1.txt
命令行模式下输入:vsp 2.txt 打开新的纵向视窗来编辑1.txt
普通模式下Ctrl-w s 将当前窗口分割成两个水平的窗口
普通模式下Ctrl-w v 将当前窗口分割成两个垂直的窗口
普通模式下Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
普通模式下Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗
普通模式下Ctrl-w j 移至下面视窗
普通模式下Ctrl-w k 移至上面视窗
普通模式下Ctrl-w h 移至左边视窗
普通模式下Ctrl-w l 移至右边视窗
普通模式下Ctrl-w J 将当前视窗移至下面
普通模式下Ctrl-w K 将当前视窗移至上面
普通模式下Ctrl-w H 将当前视窗移至左边
普通模式下Ctrl-w L 将当前视窗移至右边
普通模式下Ctrl-w - 减小视窗的高度
普通模式下Ctrl-w + 增加视窗的高度
1.创建加密文档
Vim –x file1
在vim执行外部命令
在命令行模式中输入!可以执行外部的shell命令
:!ls 用于显示当前目录的内容
:!rm FILENAME用于删除名为 FILENAME 的文件
:w FILENAME可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件
1.vim中的查看帮助
普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
命令行模式下输入:ver 显示版本及参数
1.vim的功能设定
可以在编辑文件的时候进行功能设定,要永久保存配置需要修改vim配置文件。 vim的配置文件~/.vimrc
2.获取目前的设定
命令行模式下输入:set或者:se显示所有修改过的配置
命令行模式下输入:set all 显示所有的设定值
命令行模式下输入:set option? 显示option的设定值
命令行模式下输入:set nooption 取消当期设定值
3.set功能的说明
命令行模式下输入:set autoindent(ai) 设置自动缩进
命令行模式下输入:set autowrite(aw) 设置自动存档,默认未打开
命令行模式下输入:set background=dark或light,设置背景风格
命令行模式下输入:set backup(bk) 设置自动备份,默认未打开
命令行模式下输入: set cindent(cin) 设置C语言风格缩进
全称GNU CC ,符合ANSI C标准,可编译语言:c,c++,object c,java,Fortran,Pascal,Modula-3,Ada.
GCC的编译流程:
预处理:对包含的头文件(#include)和宏定义(#define、#ifdef)等进行处理。编译器将包含的头文件stdio.h编译进来,并且用户可以使用gcc的选项-E进行查看。例:gcc –E hello.c –o hello.i.选项-o 是指目标文件,“.i”文件为已经过预处理的C程序。
编译:将代码翻译成汇编语言。例:gcc -S hello.i –o hello.s
汇编:将编译阶段生成的.s文件转成目标文件。例:gcc –c hello.s –o hello.o
链接:函数库。静态库.a,动态库(默认.so)
gcc编译选项分析中体现了静态库、动态库的创建和使用,由于字数过多,在这里不一一打出,只体现一些关键的选项:
静态库:
创建静态库:gcc -c unsgn_pow.c //unsgn_pow为函数名
ar rcsv libpow.a unsgn_pow.o
a - unsgn_pow.o
编译主程序:gcc -o pow_test pow_test.c -L. -lpow。
动态库:
为动态库构造目标文件:gcc -fpic -Wall -C unsgn_pow.c
生成动态可:gcc -shared -o libpow.so unsgn_pow.o
链接到刚生成的动态库:gcc -o pow_test pow_test.c -L. -lpow
Vim编写,gcc编译:gcc –g test.c –o test, gdb调试:gdb test
查看文件:l
设置断点:在b后加入相对应的行号。例b 6
查看断点情况:设置完断电后键入info b,在gdb中可以设置多个断点。bt 查询调用函数的情况。
运行代码:默认从首行开始运行代码,键入r
查看变量值:p 变量。例:p n
单步运行:n或s。若有函数调用的时候,s会进入函数但是n不会进入函数。
恢复程序运行:c
功能:自动编译管理器
makefile的基本结构(make读入的唯一配置文件):
格式:target:dependency_files
command
再make target
makefile变量:(p78)
makefile规则:包括了目标体、依赖文件及其之间的命令语句
隐含规则
模式规则
对计算机系统的大致介绍,是全书的梗概。
1.截断数字。
2.整数运算(包括无符号加法和补码加法)的溢出问题:加法逆元的计算,补码加法溢出条件。乘以常数部分不是看得很懂。
3.有符号数和无符号数之间的转换。
总结:最重要的是公式。很多复杂的等式都是由多个公式嵌套形成的,需要记住顺序和名称。
1.这章前面基本没有难点,与之前学过的汇编即为相同,很多指令的用法能够烂熟于心。但是尽管这样,我们目前的水平仍然无法独立地编写一个较大的汇编文件。
2.本章运用较多的操作是汇编与反汇编。
3.难点:栈帧分析。指令都是熟悉的,但是汇编文件并没有c语言那样直接明了,如果要看懂一个汇编文件需要进行大量的分析来确定该文件的功能。由于本章后面的内容没有过多学习,所以目前主要是针对函数嵌套的汇编文件进行分析。
1.一个更简单的指令集Y86,可以实现与IA32相同的功能。书上有一些题要求仿照IA32的程序写一个Y86程序,所以要注意两个指令集的区别。
2.硬件描述语言HCL。
3.组合和时序逻辑元素。
4.对我而言,重难点Y86顺序实现的5个过程,有些混杂,原理无法理解。
1.最新学的一章,需要实践的部分很少,但是大篇幅的文字更加缺乏理解性。
2.高速缓存处理器的部分对我来说不是很好理解,会做题但是不知道为什么。例如,标记位,有效位,偏移位,块和组这几者之间的关系。
这章是配合另一本书学习的,这本书讲得更深入,但总感觉没有另一本形象,更容易理解。对于相关概念讲述得很详细,类似于百科全书。
在这块学习的时候,遇到的比较难以操作的一部分是makefile。gcc和gdb比较好学,容易操作。
填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键)。
判断:Linux Bash中,强制删除test文件的命令是(rm -f test )。
填空:Linux Bash中,查找home目录中前天创建的文件的命令是(find ~ -ctime 2)。
填空:Linux Bash中,使用wc统计hello.c共有几行代码的的命令是( wc -l hello.c )
填空:Linux Bash中,把ls命令显示当前目录的结果存入ls.txt的命令输出重定向命令是(ls > ls.txt)
填空:Linux Bash中,(tee )命令可以同时重定向到多个文件。
man -k 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)
cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )
find 填空:查找当前目录下所有目录的find命令是(find . -type d)
grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)
man -k 填空:Linux中显示文件(file )属性(status)的命令是( stat )
cheat 填空:使用du命令对当前目录下的目录或文件按大小排序 的命令是( du -sk | sort -rn )
gdb 判断: gdb中next和step都可以单步跟踪,根据自顶向下原则应该优先选用step. (X )
regex 判断: 正则表达式r.t可以匹配rt. (x)
regex 判断:正则r表达式zo可以匹配z. (ok)
3.14 判断: 汇编代码不会记录程序值的类型。(ok)
CH04 判断:Y86中,有5个双字节指令。(x)
CH06 判断:存储器山中山脊代表空间局部性。(x)
确实是本值得推荐的好书,基本上面面俱到,涉及到了目前所学习内容的方方面面,对任何一门专业课都能起到启蒙作用。其中最大的收获是提高实际操作能力的提高,能够将理论和实践形成统一。
并不是弄懂了已经学过的每一个知识点,学习有些囫囵吞枣,对于老师布置过练习题的知识点掌握得更好,其他部分则有些似懂非懂,仅仅学完以后留下了残余的印象。
希望老师能够在大家自己看完书以后给大家先讲一讲再考试。大多情况下不是每一个知识点我们都能看懂,而且一旦书上讲得太深我们基本上就有点发蒙,如果老师能够在这种时候点拨一下那我们的效率应该会更高。如果问题太多的情况下,把所有问题都截图标注再发到小组提问中很费精力,而且师生之间的交互效率也不高,通常情况下在小组中一问一答就用了很长时间。