标签:另一个 学习总结 分享 格式 支持 逆向 先进后出 保护 内核
本章概述:
本周学习了c提供的抽象层下面的东西,了解机器级编程。通过编译器产生机器级程序的汇编代码表示,我们了解了编译器和它的优化能力,还有一些机器、数据类型和指令集。机器级程序和它们的汇编代码表示与C程序的差别很大。程序是以指令序列来表示的,每条指令都完成一个单独的操作。编译器必须使用多条指令来产生和操作各种数据结构。 用字节代码作为程序的低级表示,优点是相同的代码可以在许多不同的机器上执行。
x86经历的寻址方式:
程序编码和数据格式:
算数和逻辑操作:
控制:
过程:
对于数据格式的知识
在书p111页给了数据格式,在汇编代码的后缀。在之后学习mov指令的时候,其中有一个指令movl $Ox4050,%eax ,可是在之后使用中发现movl指令对于双精度浮点数可以进行传送。后来看书,知道了汇编代码也使用后缀‘l’`来表示4字节整数和8字节双精度浮点数。其实并不会产生歧义,因为浮点数使用的是一组完全不同的指令和寄存器。
对于寻址模式
首先在对于%eax和(%eax)有点疑问,不知道二者样子相同,二者具体有什么不同,后来通过看书上p113的表格,其中有寄存器Ea,操作数值是R[Ea],储存器(Ea)操作数值是M[R[Ea]]。虽然二者看起来样子很相似,但本质还是不一样的,一个是寄存器,另一个则表示缓存器,二者所代表的值也是不同的。
对于栈
栈在数据结构中就有所接触,遵循先进后出的原则。但是对于为什么栈底的地址大,栈顶的地址值小?如果这样那么栈就不会很大吗?通过网上百度,解决了这一问题。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下栈的大小是固定的空间(1M或2M)超过栈的剩余空间会提示overflow。就类似于数组中的内个i,stack[i],入栈后i-1,出栈后i+1,i始终指向栈顶。
对于Switch语句
起初书上给的例子是有开关100、102~104、106,通过汇编代码,首先将106与100做差值运算,这样就会简化汇编语言的操作。可是对于这个例子102 开关之后没有break;既没有跳出语句,会继续操作103的代码,汇编语言是怎么实现的?通过自己动手操作了书上的例子后,两种情况有不同的目的地址,将这两个代码块都汇总到将result加11的代码,这样就解决了问题。
P107
P108反汇编练习
教材P121练习题3.9验算反馈
习题3.1
其中有一个是260(%ecx,%edc)计算值,一直把260当作十进制运算,可是没有结果,后来发现运算时需要将其转换为16进制再次参与运算,这样260=Ox104这样答案也就得到了。
习题3.2
指令的补全,对于mov指令格式为mov s,d,将s传送给d。但是对于MOV %eax,(%eax) 为什么是MOVL而不是MOVW?后来知道%ax为寄存器16位,%eax是扩展寄存器32位,这样就需要传送双字,就需要MOVL指令。
习题3.29
对于switch语句的汇编代码,最初在做的时候存在序号问题,后来仔细查阅了解C语言中case对应的序号对应着跳转表中的序号,要注意的是候跳转表中的序号从0开始的!
这周在本章下了很多时间,也补了很多汇编语言的功课,总之还是要去认认真真去对待每一个章节的知识点,这样才能融汇贯通。
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 18/38 | |
| 第三周 | 500/1000 | 3/7 | 22/60 | |
| 第四周 | 300/1300 | 4/9 | 15/90 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。 耗时估计的公式 :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:15小时
实际学习时间:15小时
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)
2017-2018-1 20155336 《信息安全系统设计基础》第五周学习总结
标签:另一个 学习总结 分享 格式 支持 逆向 先进后出 保护 内核
原文地址:http://www.cnblogs.com/hxl681207/p/7707903.html