2017-2018-1 20155339 《信息安全系统设计基础》第5周学习总结
2017-2018-1 20155339 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
- gcc 命令调用了一整套的程序,C预处理器扩展源代码、编译器产生两个源文件的汇编代码,名字分别是p1.s和p2.s、汇编器会将汇编代码转化成二进制目标文件p1.o和p2.o、链接器将两个目标代码文件与实现库函数的代码合并,产生最终的可执行代码文件P。
- ISA(指令集体系结构或指令集架构)定义了处理器状态、指令的格式,以及每条指令对状态的影响。
- 程序计数器(通常称为PC,用%rip表示),给出将要执行的下一条指令在内存中的地址。
- 整数寄存器文件:包含16个命名的位置,分别存储64位的值。存储地(对应于C语言的指针)或整数数据。
- 条件码寄存器:保存最近执行的算数或逻辑指令的状态信息,它们用来实现控制或数据流中的条件变化。
- 一组向量寄存器可以存放一个或多个整数或浮点数值。
- 在命令行中使用-s选项,就能看到c语言编译器产生的汇编代码,这回产生一个.s文件
gcc -Og -S xxx.c
-
练习书上p114的代码获得汇编代码文件,如下图
-
设计指令的方式是从某个给定值开始,可以将字节唯一的解码成机器指令。
-
使用-c命令行选项,来编译并汇编该代码,这回产生一个.o文件
gcc -Og -c xxx.c
-
练习书上p114的代码获得.o文件,如下图
-
使用-d命令行来查看目标文件的内容,
objdump -d xxx.o
-
练习书上p114的代码查看目标文件的内容
-
由上图可以发现反汇编器给call和ret这些命令添加了一个q,后缀,省略这些后缀也没有问题。
-
将上面的代码与main.c链接并且反汇编,得到如下图所示的代码
-
比较链接前后mstore.c的反汇编代码,可以看出链接器将这一部分的代码的地址移到了不同的地址范围里面,其他都一样。
链接前
链接后
- ‘.’开头的行可以忽略不看。
- 二进制文件可以用od 命令查看,也可以用gdb的x命令查看,有些输出内容过多,我们可以使用 more或less命令结合管道查看
od mstore.o | more
,也可以定向输出od mstore.o >ms.txt
。
- 64位机器上想要得到32代码:gcc -m32 -S xxx.c
- 寄存器中esi edi可以用来操纵数组,esp ebp用来操纵栈帧。
- 对于寄存器32位的eax,16位的ax,8位的ah,al都是独立的。
- 操作数的三种类型:立即数、寄存器、存储器
- 三种寻址方式:立即数寻址、寄存器寻址方式、存储器寻址方式寻址方式。
- 有效地址计算: Imm + R[rb] + R[ri]*s。
- 数据传送指令MOV:MOV相当于C语言中的赋值指令'='。不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。
- mov指令只会更新目的操作数指定的那些寄存器字节的内存位置。但movl时,会吧寄存器的高4个字节设置成0,movz指令把目的中剩余的字节填充为0,movs类中的指令通过符号扩展来填充,把源操作的最高位进行复制。
- push和pop:push是入栈,pop是弹出,遵循先进后出的原则。
-
- 一元操作:只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置。二元操作:第二个操作数既是源也是又是目的,可以是寄存器或者存储器位置,但是不能同时是存储器位置。
- 移位操作:先给出移位量,第二项给出要移位的数值,未给出时右%cl寄存器的低m位决定。
- 条件码:CF:进位标志、ZF:零标志、SF:符号标志、OF:溢出标志。leal指令不改变任何条件码
- CMP指令根据他们的两个操作数之差来设置条件码。除了只设置条件码而不更新目标寄存器之外,CMP与SUB行为是一样的。
- 条件码的使用方法:一般不直接读取 1.可以根据条件码的某个组合,将一个字节设置成0或1,2.可以跳转到程序某个其他的部分,3.可以有条件的传送数据。
- c语言以及汇编中的控制跳转语句:
c语言:
if(a)
b;
else
c;
汇编:
if(a)
goto l1;
c;
goto end;
l1:
b;
end:
c语言:
do
b;
while(c);
汇编:
l1:
b;
if(c)
goto l1;
- switch语句可以根据一个整数索引值进行多重分支,执行其的关键步骤是通过跳转表来访问代码位置。
- IA32利用程序栈来支持过程调用。
- call指令目标:即指明被调用过程起始的指令地址。调用可以是直接的也可以是间接的。
- ret指令从栈中弹出地址A,并把PC设置为A。
- backtrace/bt:打印当前的函数调用栈的所有信息。加n参数backtrace (-)n/bt -n:n是一个正整数,表示只打印栈顶上(下)n层的栈信息。
- frame n:n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
- up n表示向栈的上面移动n层,不加参数n,表示向上移动一层。
- down n:表示向栈的下面移动n层,不加参数n,表示向下移动一层。
教材学习中的问题和解决过程
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。
- 问题1:cmp与sub有什么区别?
- 问题1解决方案:查看课本练习上学期学习的汇编cmp与sub类似,都是从目的操作数减去源操作数,但sub会将运算结果送至目的操作数,而cmp不会送至目的操作数,cmp用于检测标识符。
代码调试中的问题和解决过程
- 问题1: 64位机器上想要得到32代码运行命令gcc -m32 -S xxx.c,但是在自己的虚拟机上一直不能成功。
- 问题1解决方案:上网查资料,发现在自己的64位机子上可能无法实现,因此到实验楼的终端上进行尝试成功
代码托管
本周结对学习情况
- [20155306](http://www.cnblogs.com/0831j/p/7707419.html)
- 结对照片
- 结对学习内容
第三章内容的学习。
其他(感悟、思考等,可选)
本周着重学习并且复习了上学期的汇编内容,很多知识还是有些印象的,所以学起来稍微不费劲一些,但是感觉要找到适合自己的学习方法,再加强。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 4/100 | 1/1 | 23/20 | |
第二周 | ? | 1/2 | 20/43 | |
第三周 | 327/416 | 1/3 | 15/61 | |
第四周 | 327/416 | 1/4 | 17/78 | |
第五周 | 40/455 | 1/10 | 15/93 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:15小时
-
改进情况:学习效率不高,仍有待改进
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)