当前位置: 首页 > news >正文

2018-2019-1 20165226 《信息安全系统设计基础》第3周学习总结

2018-2019-1 20165226 《信息安全系统设计基础》第3周学习总结

目录


  • 教材学习内容总结
  • 教材学习中的问题和解决过程
  • 代码学习中的问题和解决过程
  • 代码托管与统计
  • 练习
  • 学习进度条
  • 参考资料

教材学习内容总结


1、机器级代码

①两种抽象

  • ISA(指令集体系结构或指令集架构)——定义机器级程序格式和行为
  • 虚拟地址——机器级程序使用的内存地址

② 隐藏的处理器状态

  • 程序计数器(pc,在x86-64中用%rip表示)——给出将要执行的下一条指令在内存中的地址。
  • 整数寄存器文件包含16个命名的位置
  • 条件码寄存器保存着最近执行的算术或逻辑指令的状态信息
  • 一组向量寄存器可以存放一个或多个整数或浮点数值

gcc -S xxx.c -o xxx.s获得汇编代码,也可以用objdump -d xxx反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧。

  • 编译C语言代码时,使用-S只产生一个汇编文件xxxxx.s,使用-c时会编译并汇编该代码,产生目标代码文件xxxxx.o`

  • 查看机器代码文件内容——反汇编器,objdump -d xxxxx.o
    1047870-20181009094626455-1288620285.png

  • 展示程序的字节表示——x/14xb xxxxx

2、代码示例:

int accum = 0;

int sum(int x, int y)
{
    int t = x + y;
    accum += t;
    return t;
}
  • 输入gcc -c code.c
  • 反汇编结果:
    1047870-20181012104905084-1320214142.png

3、数据格式

C声明汇编代码后缀大小(字节)
charb- 字节1
shortw- 字2
intl- 双字4
longl- 双字4
long long int-8
char *l- 双字4
floats- 单精度4
doublel- 双精度8
long doublet- 扩展精度10/12

movb:传送字节
movw:传送字
movl:传送双字(后缀‘l’也用来表示4字节整数和8字节双精度浮点数)
movq:传送四字

4、有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

5、跳转指令:

  • 直接跳转——.L1
  • 间接跳转——* 操作指示符
  • jmp *%rax——用寄存器%rax中的值作为跳转目标
  • jmp *(%rax)——以%rax值作为读地址,从内存中读出跳转目标

返回目录

教材学习中的问题和解决过程


  • 问题1: 教材P113中的gcc -0g -o p p1.c p2.c中的-0g表示什么优化等级,优化等级有哪些?
  • 问题1解决方案:

    -O0: 不做任何优化,这是默认的编译选项。
    -O和-O1: 对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化。
    -O2: 是比O1更高级的选项,进行更多的优化。Gcc将执行几乎所有的不包含时间和空间折中的优化。当设置O2选项时,编译器并不进行循环打开()loop unrolling以及函数内联。与O1比较而言,O2优化增加了编译时间的基础上,提高了生成代码的执行效率。
    -O3: 比O2更进一步的进行优化。
     -Os: 主要是对程序的尺寸进行优化。打开了大部分O2优化中不会增加程序大小的优化选项,并对程序代码的大小做更深层的优化。(通常我们不需要这种优化)Os会关闭如下选项: -falign-functions -falign-jumps -falign-loops  -falign-labels   -freorder-blocks   -fprefetch-loop-arrays

    O0选项不进行任何优化,在这种情况下,编译器尽量的缩短编译消耗(时间,空间),此时,debug会产出和程序预期的结果。当程序运行被断点打断,此时程序内的各种声明是独立的,我们可以任意的给变量赋值,或者在函数体内把程序计数器指到其他语句,以及从源程序中 精确地获取你期待的结果. 
    O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。 
    O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。 
    O3在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。 
    Os主要是对代码大小的优化,我们基本不用做更多的关心。 通常各种优化都会打乱程序的结构,让调试工作变得无从着手。并且会打乱执行顺序,依赖内存操作顺序的程序需要做相关处理才能确保程序的正确性。  

  • 问题2: CMP和SUB用在什么地方
  • 问题2解决方案:

    CMP 比较指令做了减法运算以后,根据运算结果设置了各个标志位。
    标志位设置过以后,0FFFFH这个减法运算的结果就没用了,它被丢弃,不保存。

    执行过了CMP指令以后,除了CF,ZF,OF, SF,等各个标志位变化外,其它的数据不变。

    对照普通的减法指令 SUB AX, BX,它们的区别就在于:
    SUB指令执行过以后,原来AX中的被减数丢了,被换成了减法的结果。
    CMP指令执行过以后,被减数、减数都保持原样不变。

返回目录

代码学习中的问题和解决过程


  • 问题1:

    gcc 编译出错
    1047870-20180927183551934-1278282012.png

  • 问题1解决办法:

    通过提示,发现将-o误写成了-0,更改后成功运行。

返回目录

代码托管与统计


代码托管
1047870-20181013163944222-502774063.png

返回目录

练习


实验楼课后习题:

  • 代码实现并生成汇编文件
    1047870-20181013154051335-1420065991.png

  • 使用gdb的bt/frame/up/down 指令动态查看调用栈帧的情况
    1047870-20181013154140527-498427408.png

知识点分析

1、backtrace/bt n

  • n是一个正整数,表示只打印栈顶上n层的栈信息。
  • n表一个负整数,表示只打印栈底下n层的栈信息。
    2、frame n
  • n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
    这个指令的意思是移动到n指定的栈帧中去,并打印选中的栈的信息。如果没有n,则打印当前帧的信息。
    3、up n
  • 表示向栈的上面移动n层,可以不打n,表示向上移动一层。
    4、down n
  • 表示向栈的下面移动n层,可以不打n,表示向下移动一层。

返回目录

学习进度条


代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周87/872/220/20
第二周71/1581/312/32
第三周100/2582/513/45

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难,软件工程 估计方法

  • 计划学习时间:10小时

  • 实际学习时间:12小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表)

返回目录

参考资料


  • 《深入理解计算机系统V3》学习指导
  • 向上或向下切换函数堆栈帧 · 100个gdb小技巧 · 看云

返回目录

转载于:https://www.cnblogs.com/musea/p/9759461.html

相关文章:

  • Spring boot初体验
  • Angular2入门教程-2 实现TodoList App
  • 3、桶排序
  • Oracle DB 优化-AWR及相关内容
  • 大话 JavaScript 动画
  • Pycharm的使用一
  • iOS__上传应用到AppStore出现Authenticating with the iTunes store
  • 数字联盟刘晶晶:四年只做一个产品
  • java 通过Unsafe不使用构造器直接创建对象
  • jenkins配置用户角色权限,根据不同权限显示视图、Job
  • JVM虚拟机(五):JDK8内存模型—消失的PermGen
  • Java8 new Time Api
  • Ansible常用模块详解
  • 学以致用二十三-----shell脚本里调用脚本
  • 创建新用户,及用新用户名和密码登录--------------DCL
  • ----------
  • 03Go 类型总结
  • 230. Kth Smallest Element in a BST
  • Android单元测试 - 几个重要问题
  • es6(二):字符串的扩展
  • JavaScript设计模式系列一:工厂模式
  • leetcode讲解--894. All Possible Full Binary Trees
  • log4j2输出到kafka
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Python中eval与exec的使用及区别
  • react-native 安卓真机环境搭建
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Windows Containers 大冒险: 容器网络
  • 包装类对象
  • 闭包--闭包作用之保存(一)
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用putty远程连接linux
  • 一个JAVA程序员成长之路分享
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​【已解决】npm install​卡主不动的情况
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # centos7下FFmpeg环境部署记录
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (万字长文)Spring的核心知识尽揽其中
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转) ns2/nam与nam实现相关的文件
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Sql Server 保留几位小数的两种做法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***测试-HTTP方法
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 项目指定SDK版本
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 中创建支持集合初始化器的类型
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...