zoukankan      html  css  js  c++  java
  • 20145235 《信息安全系统设计基础》第05周学习总结——2

    之前内容在这→20145235 《信息安全系统设计基础》第05周学习总结

    3.5 算术和逻辑操作

    • 加载有效地址
    • 一元操作
    • 二元操作
    • 移位操作

    3.5.1 加载有效地址

    加油有效地址“leal”-将有效地址写到目的操作数,目的操作数必须是一个寄存器。

    3.5.2 一元操作和二元操作

    • 一元操作,它只有一个操作数,既是原操作数又是目的操作数,操作数可以是一个寄存器,也可以是一个存储器位置。
    • 二元操作,有两个操作数,第一个为原操作数,可以是立即数、寄存器或存储器位置;第二个为目的操作数,可以是寄存器或者是存储器位置。
    • 二元操作,有两个操作数,第一个为原操作数,可以是立即数、寄存器或存储器位置;第二个为目的操作数,可以是寄存器或者是存储器位置。

    3.5.3 移位操作

    • 移位操作,先给出位移量,第二项给出要移位的数值。
    • 因为32为计算机,所以以为最多移位31为(排除循环移位),所以只允许0到31位的位移。
    • 位移量可以是个立即数,或者是只允许%cl。
    • SAL和AHL没有区别。
    • SAR为算数右移,最高位要和符号标志位配合进行算数右移。
    • SHR为逻辑右移。
    • 移位操作的目的操作数可以是一个寄存器或者是一个存储器的位置。

    3.5.5 特殊的算术操作

    双操作数乘法(imull)指令,从两个32位的操作数产生一个32位的乘积。

    单操作数乘法指令mull和imull,这两条指令都要求一个参数必须在寄存器%eax中,另一个由原操作数给出,高32为存放在%edx中,低32为存放在%eax中。

    3.6.1 条件码

    • CF:进位标志
    • ZF:零标志
    • SF:符号标志
    • OF:溢出标志位
    • leal指令不改变任何条件,用它进行地址计算。
    • 对于移位操作,进位标志将设置为最后一个移除的位,而溢出标志设置为0.
    • CMP指令根据他们的两个操作数之差来设置条件码,CMP与SUB指令的行为是一致的。
    • TEST指令与AND指令的行为是一致的。

    3.6.2 访问条件码

    • SET指令的目的操作数是8个单字节寄存器元素之一,或者是一个字节的存储器位置,将这个字节设置成0或者1。
    • movzbl指令用来清零%eax的三个高字节。

    3.6.3 跳转指令及其编码

    • jmp指令是无条件跳转,它可以是直接跳转,即跳转目标是作为指令的一部分编码的;也可以是间接跳转,即跳转目标是从寄存器或存储器位置中读出的。
    • 程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址。

    3.7.1 栈帧结构

    • 为单个过程分配的那部分称为栈帧。
    • %esp:栈指针
    • %ebp:帧指针
    • 栈指针可以移动,因此大多数信息的访问是通过栈指针的

    3.7.2栈帧结构

    • call指令有一个目标,即指明被调用过程起始的指令地址,直接调用是一个标号,间接调用是“*”后面跟一个操作指示符。
    • call指令的效果是将返回地址入栈,并跳转到被调用过程的起始位置。
    • ret指令从栈中弹出地址,并跳转到这个位置。
    • %exa用来返回值
    • leave为返回值做好准备

    问题

    通过这周的学习,老师的四个任务中,前三个任务掌握的比较好,我相信自己明天考试没什么问题,练习一都会,可是最后一个任务—栈帧的概念及程序调用理解的很是模糊,能看懂汇编代码,但感觉书上的表述很不完整,很诡异。真的是不容易理解,很是困惑!我只能理解函数是如何完成递归调的,但问题很多,如下:

    • 就拿一个C程序来说,它储存在哪里,和8086是存储在代码段里吗?
    • 一个程序对应一个栈帧结构?还是调用函数是用到栈帧结构?
    • IA32是通过%eip指针来控制整个汇编代码的一步步读取的吗?
    • %ebx专门存储函数参数的寄存器吗?
    • 帧指针的功能是什么?看书真的是没有看懂
    • 这个栈帧结构是独立于程序单独开辟出来的空间里吗?
    • 总之很多内容停留在概念上,没有把概念一计算机最底层的东西衔接起来。
    • 感想

    这本书叫“深入理解计算机系统”,然而我读着读着味道有点怪,感觉很粗糙,并没有感觉多么深入,可能汇编学的不够好导致理解困难。特别是看栈帧及递归调用这部分,虽然一股脑讲了很多,但没讲从计算机具体如何去使用栈帧,调用是如和通过栈帧实现函数调用及函数返回,只能通过3—26的汇编代码去啃。

  • 相关阅读:
    Flutter 常用组件
    Chrome扩展应用
    Git操作指南
    ispriter自动构建css-sprite
    Sublime text2插件
    几个实用的sublime text 2的快捷键
    javascript数据类型转换
    requireJs压缩合并路径问题
    机器学习集成学习原理
    sklearn实现决策树算法
  • 原文地址:https://www.cnblogs.com/20145235litao/p/5968236.html
Copyright © 2011-2022 走看看