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的汇编代码去啃。

原文地址:https://www.cnblogs.com/20145235litao/p/5968236.html