首页 > 代码库 > 20145235 《信息安全系统设计基础》第05周学习总结——2
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的汇编代码去啃。
20145235 《信息安全系统设计基础》第05周学习总结——2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。