20145333 《信息安全系统设计基础》第五周学习总结
20145333 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
20145333 《信息安全系统设计基础》第五周学习总结(一)
3.5 算术和逻辑操作
- leal将有效地址写入到目的操作数,目的操作数必须是一个寄存器。
- 一元操作:只有一个操作数,既是源又是目的,操作数可以是一个寄存器或者存储器位置。
- 二元操作:第二个操作数既是源又是目的,两个操作数不能同时是存储器。
- 移位:先给出位移量,然后是位移的数值,可进行算数和逻辑右移。移位量可以是立即数或单字节寄存器元素%cl中的数。
- 有符号除法指令idivl,商在寄存器%eax,余数在%edx。
- 无符号除法使用divl指令,通常将寄存器%edx设置为0。
3.6 控制
- 条件码:描述最近的算数或者逻辑操作的属性,可以检测这些寄存器来执行条件分支指令。
- CF:进位标志,最近操作使高位产生进位,用来检测无符号操作数的溢出
- ZF:零标志,最近操作得出的结果为0
- SF:符号标志,最近操作得到的结果为负数
- OF:溢出标志,最近操作导致一个补码溢出-正溢出或负溢出。
- leal不改变任何条件码
- CMP和SUB指令行为一样,只是CMP只设置条件码而不更新目标寄存器。
- 访问条件码的方式:根据条件码的某个组合,将一个字节设置成0或1;可以条件跳转到程序某个其他的部分;有条件的传送数据。
- SET指令根据计算t=a-b的设置条件码
- jmp指令是无条件跳转,可以是直接跳转,即跳转目标是作为指令的一部分编码;也可以是间接跳转,即跳转目标从寄存器或存储器位置中读出的,写法是‘*’后面跟一个操作数指示符。
- 条件跳转只能是直接跳转的。
- 当执行PC相关的寻址时,程序计数器的值是跳转指令后面那条指令的地址,而不是跳转指令本身的地址。
3.7 过程
- 数据传递、局部变量的分配和释放通过操纵程序栈来实现。
- 为单个过程分配的栈叫做栈帧,寄存器%ebp为帧指针,而寄存器指针%esp为栈指针,程序执行时栈指针移动,大多数信息的访问都是相对于帧指针。
- call指令有一个目标,即指明被调用过程起始的指令地址,效果是将返回地址入栈,并跳转到被调用过程的起始处。
- ret指令从栈中弹出地址,并跳转到这个位置。
练习
-
代码
-
编译成汇编代码
-
删除以"."开头的语句
-
使用gdb的bt/frame/up/down 指令动态查看调用栈帧的情况
教材学习中的问题和解决过程
在开始的时候,我的汇编文件和反汇编文件的第一行pushl/push后面的寄存器名和书上的不一样,书上是%ebp,而我是%rbp,还有后面的%esp,我的是%rsp。等看书看到3.13节的时候才知道原因。(IA32寄存器与x86-64寄存器的区别)
代码调试中的问题和解决过程
在练习中的代码开头有"#include <stdio.h>"时编译就会出错,而没有时就可以编译,不知道为什么。
课后作业中的问题和解决过程
3.54
本周代码托管截图
其他(感悟、思考等,可选)
以后不仅得把每周的任务有质量的完成,还得抓紧把前几周落下的内容好好补一补了。
posted on 2016-10-16 23:31 20145333茹翔 阅读(246) 评论(2) 编辑 收藏 举报