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 学会生成汇编文件并查看

参考资料

posted on 2016-10-16 22:59  20145206邹京儒  阅读(281)  评论(2编辑  收藏  举报