20145307《信息安全系统设计基础》第五周学习总结PT2
20145307《信息安全系统设计基础》第五周学习总结PT2:
教材学习内容总结
之前有第一部分学习总结:
http://www.cnblogs.com/Jclemo/p/5962219.html
以下为第二部分
执行汇编命令:gcc –s xxx.c –o xxx.s反汇编命令:objdump –d xxx 64位处理器得到32代码的命令:gcc –m32 –s xxx.c
Ltme:
1、三种操作数:
立即数:常数值。表示为$c标准表示的整数。
寄存器:表示某个寄存器的内容。
存储器:根据计算出来的地址访问某个存储器位置
2、数据传送指令
栈的特点
a、 遵循“后进先出”的原则b、 push压栈,pop出栈c、 栈顶:总是从这端插入和删除元素d、 栈顶元素的地址是最低的e、 栈指针%esp保存着栈顶元素的地址
3、数据传送示例
局部变量通常保存在寄存器中;
寄存器访问比存储器访问要快的多。
算术和逻辑操作四组操作
加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器。
一元操作:只有一个操作数,可以是寄存器也可是存储器位置。
二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 ;目的操作数是第二个,可以是寄存器、存储器;两个不能同时为存储器。
移位##:第一个是移位量,用单个字节编码(只允许0-31位的移位),可以是立即数或者放在单字节寄存器%cl中 ;算术右移SAR,填上符号位;逻辑右移SHR,填上0。目的操作数可以是一个寄存器或存储器。
2、特殊的算术操作
1、条件码
CF:进位标志
ZF:零标志SF:符号标志OF:溢出标志
2、访问条件码条件码常用的使用方法
根据条件码的某个组合,将一个字节设置为0或1
SET指令根据t=a-b的结果设置条件码; 可以条件跳转到程序的某个其他部分;可以有条件的传送数据。
3、跳转指令及其编码
jump指令
直接跳转:后面跟标号作为跳转目标间接跳转:*后面跟一个操作数指示符
其他跳转指令
除了jump指令外,其他跳转指令都是有条件的。有条件跳转是指根据条件码的某个组合,或者跳转或者继续执行下一条指令。
4、翻译条件分支
将条件表达式和语句从c语言翻译成机器语言,最常用的方式就是结合有条件和无条件跳转。
5、循环循环结构的三种形式
do-while:先执行循环体语句,再执行判断,循环体至少执行一次。while: 把循环改成do-while的样子,然后用goto翻译 for: 把循环改成do-while的样子,然后用goto翻译
汇编中用条件测试和跳转组合实现循环的效果。大多数汇编器根据do-while形式来产生循环代码,其他的循环会首先转换成do-while形式,然后再编译成机器代码。
6、条件传送指令
实现条件转移的方式传统方式: 利用控制的条件转移。当条件满足时就,程序沿着一条执行路径进行,而当条件不满足时,就走另一路径。
7、switch语句
跳转表是一种非常有效的实现多重分支的方法,是一个数组,表项i是一个代码段的地址,这个代码段实现当开关索引值等于i时程序应该采取的动作。
过程
1、栈帧结构
机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。 最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。
2、转移控制
call指令
call指令有一个目标,即指明被调用过程起始的指令地址。 call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。
ret指令
ret指从栈中弹出地址,并跳转到这个位置。ret指令返回到call指令后的那条指令。
leave指令leave指令可以使栈做好返回的准备 等价于:
movl %ebp,%esp popl %ebp
3、寄存器使用惯例
程序寄存器组是唯一能被所有过程共享的资源。
惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖
使用惯例:%eax,%edx,%ecx 调用者保存寄存器 %ebx,%esi,%edi 被调用者保存寄存器 %ebp,%esp 保持寄存器
保存某值的两种方式
由调用者保存。在调用之前就压进栈。 由被调用者保存,在刚被调用的时候就压进栈,并在返回之前恢复。
gdb调试
实验练习中的问题和解决过程
使用gcc –S –o main.s main.c -m32
命令编译成汇编代码,如下代码中的数字和函数名请自行修改以防与他人雷同
leafpad删除 . 开头文件命令
leafpad//注释
详解main函数保存%ebp,并设置新的帧指针。
pushl %ebpmovl %esp,%ebp
分配4字节的栈空间
subl $4,%esp
设置arg1=8
movl $8,(%esp)
call调用f f被调用,初始化帧指针,分配栈空间。 将(%esp)中的8给 %eax,即存入栈中
movl %eax,(%esp)
call调用g g被调用,初始化栈指针,分配栈空间 将 %eax 与立即数 123123
相加add $123123,%eax
在g结束前弹栈
popl %ebp
ret返回f中call的调用位置 f也结束,return返回main中call调用的位置 main继续 %eax 加3的操作
addl $3,%eax
leave为返回准备栈,相当于%ebp出栈,最后ret结束。
本周代码托管截图
链接
20145307《信息安全系统设计基础》第五周学习总结PT2的更多相关文章
- 20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试
目录 [第九周学习总结] 教材内容总结 [第八周课上测试] (一)求命令行传入整数参数的和 (二)练习Y86-64模拟器汇编 (三)基于socket实现daytime(13)服务器和客户端 参考资料 ...
- 20135234mqy-——信息安全系统设计基础第五周学习总结
程序的机器级表示 3.1 intel处理器系列俗称x86,经历了一开始个长期的,不断进化的发展过程. 开始时它是第一代单芯片,16位微处理器之一,由于当时集成电路技术水性有限,其中做了很多妥协,此后, ...
- 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客
2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...
- 20145215&20145307信息安全系统设计基础实验报告
20145215&20145307信息安全系统设计基础实验报告 PART1 一.实验原理 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统 ...
- 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现
20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...
- 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)
2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...
- # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod
20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...
- 2017-2018-1 20155326 《信息安全系统设计基础》第四周学习总结及myod改进版的补交
2017-2018-1 20155326 <信息安全系统设计基础>第四周学习总结及myod改进版的补交 学习内容 补充完成课上没有完成的内容 学习教材附录A,第十章内容 参考别出心裁的Li ...
- 2017-2018-1 20155305 《信息安全系统设计基础》第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客)
2017-2018-1 20155305 <信息安全系统设计基础>第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客) 课堂提交题目要求 编写MyOD.java 用java ...
随机推荐
- vue 添加过滤器-以格式化日期为例
vue的filter和angular的pipe管道类似,是过滤器 官网:https://cn.vuejs.org/v2/guide/filters.html 添加格式化日期的全局过滤器 在main.j ...
- 170327、Java微信支付中的扫码支付
微信支付现在已经变得越来越流行了,随之也出现了很多以可以快速接入微信支付为噱头的产品,不过方便之余也使得我们做东西慢慢依赖第三方,丧失了独立思考的能力,这次打算分享下我之前开发过的微信支付. 一 H5 ...
- CodeForces 732C Sanatorium
C. Sanatorium time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- git学习(7)标签管理
git学习(7)标签管理 1. 建立标签 在发布版本时候,我们通常会在版本库中打一个标签,这样就唯一确定了打标签的版本,有点像个里程碑,这里会有一个指向某个commit的指针 打标签很简单,首先切换到 ...
- 模拟Push和Pop动作
//利用CATransition来作模拟 //模拟Push - (void)pushView:(UIView *)pushView inView:(UIView *)inView { CATransi ...
- bash characters
linux shell通配符(wildcard) 通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里 ...
- append和innerHTML的区别以及使用方法
1.append jquery中的append的使用方式:$("#id").append("<a href='#'>test</a>") ...
- Pandas -- SettingwithCopyWarning 原理和解决方案(转)
本文对产生 SettingwithCopyWarning 的原因以及解决方案,做了详细解说. 详见: https://www.jianshu.com/p/72274ccb647a
- js 根据json数组中n个字段排序
function compare(name, minor) { return function (o, p) { var a, b; if (o && p && typ ...
- lua在线手册汇总
1. Lua官方参考手册 Lua 4.0 : http://www.lua.org/manual/4.0/Lua 5.0 : http://www.lua.org/manual/5.0/Lua 5.1 ...