zoukankan      html  css  js  c++  java
  • 20135315-信息安全系统设计基础第五周学习总结

     

    第三章 程序的机器级表示

    3.1 X86 寻址方式经历三代:

    DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
    8060的分段模式
    IA32的带保护模式的平坦模式

    3.2 程序编程

    1、代码含义

    gcc -01 -o p p1.c

    -01 表示使用第一级优化。优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择。
    -o 表示将p1.c编译后的可执行文件命名为p

    2、机器级编程的两种抽象

    (1)指令集结构ISA

    是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。

    (2)机器级程序使用的存储器地址是虚拟地址

    看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。

    执行汇编命令:gcc –s xxx.c –o xxx.s
    反汇编命令:objdump –d xxx 
    64位处理器得到32代码的命令:gcc –m32 –s xxx.c

    3.3 数据格式

    3.4 访问信息

    1、三种操作数:

    立即数:常数值。表示为$c标准表示的整数。
    寄存器:表示某个寄存器的内容。
    存储器:根据计算出来的地址访问某个存储器位置

    2、数据传送指令

    (1)栈的特点

    a、 遵循“后进先出”的原则 
    b、 push压栈,pop出栈
    c、 栈顶:总是从这端插入和删除元素
    d、 栈顶元素的地址是最低的
    e、 栈指针%esp保存着栈顶元素的地址

    (2)数据传送指令图表

    3、数据传送示例

    (1)局部变量通常保存在寄存器中;
    (2)寄存器访问比存储器访问要快的多。

    3.5 算术和逻辑操作

    1、四组操作

    加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器。
    一元操作:只有一个操作数,可以是寄存器也可是存储器位置。
    二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 ;目的操作数是第二个,可以是寄存器、存储器;两个不能同时为存储器。
    移位##:第一个是移位量,用单个字节编码(只允许0-31位的移位),可以是立即数或者放在单字节寄存器%cl中 ;算术右移SAR,填上符号位;逻辑右移SHR,填上0。目的操作数可以是一个寄存器或存储器。

    2、特殊的算术操作

    3.6 控制

    1、条件码

    CF:进位标志 
    ZF:零标志
    SF:符号标志
    OF:溢出标志

    2、访问条件码

    (1)条件码常用的使用方法

    根据条件码的某个组合,将一个字节设置为0或1。SET指令根据t=a-b的结果设置条件码; 
    可以条件跳转到程序的某个其他部分;
    可以有条件的传送数据。

    3、跳转指令及其编码

    (1)jump指令

    直接跳转:后面跟标号作为跳转目标
    间接跳转:*后面跟一个操作数指示符

    (2)其他跳转指令

    除了jump指令外,其他跳转指令都是有条件的。有条件跳转是指根据条件码的某个组合,或者跳转或者继续执行下一条指令。

    4、翻译条件分支

    将条件表达式和语句从c语言翻译成机器语言,最常用的方式就是结合有条件和无条件跳转。

    5、循环

    (1)循环结构的三种形式

    do-while:先执行循环体语句,再执行判断,循环体至少执行一次。
    while: 把循环改成do-while的样子,然后用goto翻译 
    for: 把循环改成do-while的样子,然后用goto翻译

    汇编中用条件测试和跳转组合实现循环的效果。大多数汇编器根据do-while形式来产生循环代码,其他的循环会首先转换成do-while形式,然后再编译成机器代码。

    6、条件传送指令

    (1)实现条件转移的方式

    传统方式: 利用控制的条件转移。当条件满足时就,程序沿着一条执行路径进行,而当条件不满足时,就走另一路径。
    数据的条件转移方式。

    注意:基于条件数据传送的代码比基于条件控制转移的代码性能好。

    7、switch语句

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

    3.7过程

    1、栈帧结构

    机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。
    最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。

    2、转移控制

    (1)call指令

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

    (2)ret指令

    ret指从栈中弹出地址,并跳转到这个位置。
    ret指令返回到call指令后的那条指令。

    (3)leave指令

    leave指令可以使栈做好返回的准备 等价于:

    movl %ebp,%esp
    popl %ebp

    3、寄存器使用惯例

    (1)程序寄存器组是唯一能被所有过程共享的资源。

    惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖

    (2)使用惯例:

    %eax,%edx,%ecx 调用者保存寄存器 
    %ebx,%esi,%edi 被调用者保存寄存器 
    %ebp,%esp 保持寄存器

    (3)保存某值的两种方式

    由调用者保存。在调用之前就压进栈。 
    由被调用者保存,在刚被调用的时候就压进栈,并在返回之前恢复。

    3.8 gdb调试

    实验部分

    对scn.c文件进行编译,生成汇编文件

    生成的汇编文件如下:

    将含有代码中以"."开头的编译器指令删除后的结果

    遇到的问题

    1、练习题3.15的B题,为什么是ox8048359-25,-25是oxe7的补码表示,但25是转换成十进制的数,为什么可以直接和十六进制的数进行运算,为什么不能直接ox8048359+oxe7计算,这样的结果是ox8048440,但按照答案的解释是 ox8048340。

    参考资料

    1、《深入理解计算机系统》课本第三章

    2、实验楼实验指导书:https://www.shiyanlou.com/courses/413 实验四

    3、每周重点:http://group.cnblogs.com/topic/73069.html

  • 相关阅读:
    BZOJ1257:[CQOI2007]余数之和——题解+证明
    BZOJ3781:小B的询问——题解
    BZOJ2038:[2009国家集训队]小Z的袜子——题解
    BZOJ3052 & UOJ58:[WC2013]糖果公园——题解
    BZOJ1086:[SCOI2005]王室联邦——题解
    BZOJ1878:[SDOI2009]HH的项链——题解
    BZOJ2453:维护队列——题解
    美团新零售招聘-高级测试开发(20k-50k/月)
    Shopee招聘-测试开发leader(30k-60k/月)
    蚂蚁金服招聘-无线测试开发(20k-36k/月)
  • 原文地址:https://www.cnblogs.com/java-stx/p/4868616.html
Copyright © 2011-2022 走看看