• # 2017-2018-1 20155331 《信息安全系统设计基础》第5周学习总结


    2017-2018-1 20155331 《信息安全系统设计基础》第5周学习总结

    教材学习内容总结

    X86 寻址方式经历三代:

    DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。

    8060的分段模式

    IA32的带保护模式的平坦模式

    程序编码

    gcc -01 -o p p1.c p2.c
    

    编译选项-01告诉编译器使用第一级优化;第二级优化(选项-02指定)被认为是较好选择。

    机器级编程:两种抽象尤为重要。第一种是机器级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。第二种是,机器级程序使用的存储地址是虚拟地址。

    程序计数器(在IA32中,称为“PC”,用%eip表示)指示将要执行的下一条指令在存储器中的地址。

    整数寄存器文件包含8个命名的位置,分别存储32位的值。

    条形码寄存器保存着最近执行的算数或逻辑指令的状态信息。他们用来实现控制或数据流中的,比如说用来实现if和while语句。

    关于格式的注解:

    所有以‘.’开头的行都是指导会编辑器和连接器的命令。我们通常可以忽略。

    数据格式

    C语言数据类型在IA32中的大小:

    访问讯息

    一个IA32中央处理单元(CPU)包含一组8个存储32位值得寄存器。它们的名字都以%e开头,不过它们都另有特殊的名字。

    在大多数情况,前6个寄存器都可以看成通用寄存器,对他们的使用没有限制。我们说“在大多数情况”是因为有些指令以固定的寄存器作为源寄存器和/或目的寄存器。

    最后两个寄存器(%ebp和%esp)保存着指向程序栈中重要位置的指针。只有根据栈管理的标准惯例才能修改这两个寄存器中的值。

    操作数指示符

    各种不同的操作数被分为三种类型:

    立即数,也就是常数值

    寄存器,表示某个寄存器的内容

    存储器,根据计算出来的地址(有效地址)访问某个存储器位置。有效地址的计算方式:Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

    算数逻辑操作

    加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器。

    一元操作和二元操作:

    一元操作:只有一个操作数,可以是寄存器也可是存储器位置。

    二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 ;目的操作数是第二个,可以是寄存器、存储器;两个不能同时为存储器。

    移位操作:移位量,用单个字节编码(只允许0-31位的移位),可以是立即数或者放在单字节寄存器%cl中 ;
    算术右移SAR,填上符号位;逻辑右移SHR,填上0。目的操作数可以是一个寄存器或存储器。

    控制

    机器代码提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流或者数据流。

    条件码

    CF:无符号溢出
    
    ZF:零
    
    SF:负数
    
    OF:有符号溢出
    

    访问条件码

    条件码通常不会直接读取,常用的使用方法有三种:

    根据条件码的某个组合,将一个字节设置为0或1;

    可以条件跳转到程序的某个其他部分;

    可以有条件的传送数据。

    跳转指令及其编码

    jmp指令是无条件跳转,它可以是直接跳转(即跳转目标是作为指令的一部分编码的)也可以是间接跳转(即跳转目标是从寄存器或存储位置中读出的)。

    翻译条件分支

    最常用的方式是结合有条件跳转和无条件跳转

    循环

    用条件测试和跳转组合起来实现循环的效果。

    条件传送指令

    实现条件操作的传统方式: 利用控制的条件转移。

    条件数据传送提供了一种用条件控制转移来实现条件操作的替代策略。

    switch语句

    跳转表是一种非常有效的实现多重分支的方法,是一个数组,表项i是一个代码段的地址,这个代码段实现当开关索引值等于i时程序应该采取的动作。

    switch语句的关键步骤是通过跳转表来访问代码位置。

    程序的机器级表示过程

    大多数机器,包括IA32,只提供转移控制到过程和从过程中转移出控制这种简单的指令。数据传递、局部变量的分配和释放通过操纵程序栈来实现。

    栈帧结构

    什么是栈帧,相信很多从事C编程的童鞋还是没有搞明白,首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。”。

    最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,而寄存器%esp为栈指针。

    转移控制过程调用和返回的指令:

    指令 描述

    call Label--过程调用
    
    call Operand--过程调用
    
    leave --为返回准备栈
    
    ret --从过程调用中返回
    

    call指令有一个目标,即指明被调用过程起始的指令地址。call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。

    寄存器使用惯例

    根据惯例,寄存器%eax、%edx、%ecx被划分为调用者保存寄存器,当过程P调用Q时,Q可以覆盖这些寄存器,而不会破坏任何P所需要的数据。

    寄存器%ebx、%esi和%edi被划分为被调用者保存寄存器。

    递归过程

     int rfact(int n)
    
    {int result;
    
    if (n<=1)
    
    result = nrfact(n-1);
    
    return result;
    
    }
    

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

    问题:什么是反汇编?
    回答:在网上查得:反汇编即是指将这些执行文件反编译还原成汇编语言或其他高级语言。但通常反编译出来的程序与原程序会存在许多不同,虽然执行效果相同,但程序代码 会发生很大的变化。

    结对及互评

    点评模板:

    博客中值得学习的或问题:

    xxx

    xxx

    ...

    代码中值得学习的或问题:

    xxx

    xxx

    ...

    其他(感悟、思考等,可选)

    在这个学期的学习中,感觉比上个学期还吃力,所以今后会更加努力的学习。

  • 相关阅读:
    MongoDB自学日记2——权限
    最近项目的几个问题
    MongoDB自学日记1——基本操作
    一次JVM调优的笔记
    Memcached学习笔记
    为博客添加计数器的方法
    关于多核系统同步互斥的小研究
    Linux中同步互斥机制研究之原子操作
    你真的懂printf么?
    Lingo安装
  • 原文地址:https://www.cnblogs.com/dd1174751354/p/7712524.html
Copyright © 2020-2023  润新知