20145206 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
·X86 寻址方式经历三代:
DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
8086的分段模式
IA32的带保护模式的平坦模式
· gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧。MAC OS中没有objdump, 有个基本等价的命令otool
Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
· 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
·esi edi可以用来操纵数组,esp ebp用来操纵栈帧。对于寄存器,32位的eax,16位的ax,8位的ah,al都是独立的。
·操作数的三种类型:立即数、寄存器、存储器;有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
· MOV相当于C语言的赋值”=“,不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。
MOV:MOV类中的指令将源操作数的值复制到目的操作数中。
MOVS和MOVZ:MOVS和MOVZ指令类都是将一个较小的源数据复制到一个较大的数据位置,高位用符号位扩展(MOVS)或者零扩展(MOVZ)进行填充。
·栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。
·指针就是地址;局部变量保存在寄存器中。
·控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)
· 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)注意leal不改变条件码寄存器
思考一下:CMP和SUB用在什么地方
答:CMP指令根据它们的两个操作数之差来设置条件码。除了只设置条件码而不更新目标寄存器之外,CMP指令与SUB指令的行为是一样的。
·SET指令根据t=a-b的结果设置条件码
· 跳转与标号
· if-else 的汇编结构
·IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序.
·call/ret; 函数返回值存在%eax中
· bt/frame/up/down :关于栈帧的gdb命令
·反汇编器:
根据目标代码产生一种类似于汇编代码的格式。在linux中,可以通过objdump -d xxx.o 实现
实验楼学习情况
·用vim编辑器编写代码:
·查看汇编文件:
·去掉以.开头的语句后的汇编代码:
教材学习中的问题和解决过程
练习3.5
C代码如下:
编译成汇编文件如下:
练习3.9
补充C语言代码中缺失的那部分之后:
编译成汇编文件如下:
练习3.14
考虑以下C语言代码:
int test(data_t a)
{
return a TEST 0;
}
根据以下每条指令序列,确定哪种数据类型和比较TEST会使编译器产生这样的代码?
A. testl %eax,%eax setne %al
B. testb %al,%al setg %al
练习3.16
已知下列C代码:
void cond(int a,int *p)
{
if(p&&a>0)
*p +=a;
}
用C语言写一个goto版本:
练习3.29
补充之后的C语言代码:
int switcher(int a,int b,int c)
{
int answer;
switch(a)
{
case 5 :
c = b ^ 15;
case 0 :
answer = c+112;
break;
case 2 :
case 7 :
answer = (c+b)<<2;
break;
case 4 :
answer = a;
break;
default :
answer = b;
}
return answer;
}
本周代码托管截图
·托管实验楼中的代码
·托管练习中的代码
其他(感悟、思考等,可选)
本周学习内容联系到很多汇编知识,由于上学期学过汇编课程,所以对于汇编有一些了解,但还需要更加深入地学习,这周学会了通过C语言文件汇编成汇编文件,从而查看,练习方面还需要多做以巩固这一部分的知识。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 20/30 | 学习了一些Linux核心命令 |
第二周 | 250/250 | 1/3 | 20/50 | 学习了vim编辑器基础 |
第三周 | 280/530 | 1/4 | 18/68 | 熟练在vim里编程并运行 |
第五周 | 300/830 | 1/5 | 15/83 | 学会生成汇编文件并查看 |