2017-2018-1 20155301 《信息安全系统设计基础》第5周学习总结
2017-2018-1 20155301 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
-
历史观点:x86经历了一个长期的,不断发展的过程
8060->80286->i386->i486->Pentium->PentiumPro->Pentium/MMX->Pentium II->Pentium III->Pentium 4->Pentium 4E->Core 2->Core i7
-
程序编码,gcc命令指的就是GCC C编译器,我们也可以单纯的用cc来启动它。
编译选项-Og告诉编译器使用会生成符合原始代码C代码整体结构的机器代码的优化等级。
-
机器及代码有两种抽象尤为重要,机器级程序的格式和行为,定义了处理器状态,指令的格式,以及每条指令对状态的影响。将程序的行为描述成好像每条指令是按顺序执行的
-
机器级程序使用的存储器地址是虚拟地址,存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来
-
计算机是从16位体系结构扩展成32位的,Intel用术语“字”表示16为数据类型。因此,32位数称为双字,64位称为“四字”
C声明 | 汇编代码后缀 |
---|---|
char | b |
short | w |
int | l |
long | q |
char* | q |
float | s |
double | l |
-
数据传送指令有四个变种:movb(传送字节)、movw(传送字)、movl(传送双字)、movq(传送四字),这些指令都执行同样的操作。
主要区别在于他们操作的数据大小不同:分别是1、2、4、8字节。
-
算数和逻辑操作,指令类add由四条加法指令组成:addb、addw、addl、addq,分别是字节加法、字加法、双字加法、四字加法。
-
栈,遵循“后进先出”的原则
push压栈把数据压入栈中,pop出栈 删除数据。
栈顶:总是从这端插入和删除元素,栈顶元素的地址是最低的,栈指针%esp保存着栈顶元素的地址
-
一元和二元操作。
一元操作,只有一个操作数,既是源又是目的,这个操作数可以是一个寄存器,也可以是一个内存位置。
第三组是二元操作,其中,第二个操作数既是源又是目的。
-
算数和逻辑操作
指令 | 效果 |
---|---|
Leaq S,D | D<-&S |
INC D | D<-D+1 |
DEG D | D<-D-1 |
NEG D | D<- -D |
NOT D | D<-~D |
ADD S,D | D<-D+S |
SUB S,D | D<-D-S |
IMUL D S,D | D<-D*S |
XOR S,D | D<-D^S |
OR S,D | D<-D |
AND S,D | D<-D&S |
SAL K,D | D<-D<<K |
SHL K,D | D<-D-S |
SAR K,D | D<-D>>S |
SHR K,D | D<-D>>S |
-
条件码寄存器描述了最近的算术或逻辑操作的属性,可以检测这些寄存器来执行条件分支指令,常用条件码:CF ZF SF OF。
CF:进位标志。
ZF:零标志。
SF:符号标志。
OF:溢出标志。
-
访问条件码
指令 | 效果 |
---|---|
sete D | D<-ZF |
setne D | D<-~ZF |
sets D | D<-SF |
setns D | D<-~SF |
setg D | D<-(SF^OF)&ZF |
setge D | D<=~(SF^OF) |
setl D | D<-SF^OF |
setle D | D<-(SF^OF) |
seta D | D<-CF&ZF |
setae D | D<-~CF |
setb D | D<-CF |
setbe D | D<-CF |
-
call指令有一个目标,即指明被调用过程起始的指令地址,效果是将返回地址入栈,并跳转到被调用过程的起始处。
-
ret指令从栈中弹出地址,并跳转到这个位置,使用这个指令栈指针要指向call指令存储返回地址的位置。
函数返回值存在%eax中 -
跳转指令
会导致执行切换到程序中一个全新的位置,跳转的目的地通常用一个标号指明。控制中最核心的是跳转语句:有条件跳转(实现if,switch,while,for),无条件跳转jmp(实现goto)
无条件跳转:JMP可以是直接跳转也可以是间接跳转(写法是*后面加操作数指示符)
有条件跳转:根据条件码的某个组合,或者跳转或者继续执行下一条指令。
教材学习中的问题和解决过程
void cond (long a,long *p)
{
if(p&&a>*p)
*p=a;
}
GCC会产生下面的汇编代码
void cond(long a,long *p)
a in %rdi,p in %rsi
cond:
testq %rsi,%rsi
je .L1
cmpq %rdi,(%rsi)
jge .L1
movq %rdi,(%rsi)
.L:1:
rep;ret
只有一个if语句,为什么汇编代码中有两个分支,&&是表达式实现的一部分,如果p是空,则会跳过第二个测试。
代码调试中的问题和解决过程
代码托管
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
[20155317](http://www.cnblogs.com/wxwddp/p/7671075.html)
![image](http://note.youdao.com/favicon.ico)
- 结对学习内容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)