2017-2018-1 20155337《信息安全系统设计基础》第5周学习总结

教材学习内容总结

不论我们是在用C语言还是用JAVA或是其他的语言编程时,我们会被屏蔽了程序的机器级的实现。机器语言不需要被编译,可以直接被CPU执行,其执行速度十分 快。但是机器语言的读写性与移植性较高级语言低。高级语言被编译后便成为了汇编语言,汇编语言十分接近机器语言。之后汇编代码会转化为机器语言。虽然现代 的编译器能帮助我们将高级语言转化为汇编语言,解决了不少问题,但是对于一个严谨的程序员来说,需要做到能够阅读和理解汇编语言。我们主要围绕Intel来讲 解。

一 Intel处理器的历史演变

Intel处理器最的早是8086, 它是十六位的微处理器,作为第一代单芯片,8086知名度是相当的高。之后又有80286、i386、i486、Pentium、PentiumPro、 Pentium/MMX、PentiumⅡ、PentiumIII等等的一系列处理器出现了。每个时间上相继的处理器都是向后兼容的。Intel称其指令集为IA32,也就是Intel32位体系结 构,也就是我们平常所说的x86。

二 程序编码

我们写一个C程序,用Unix命令行编译p1.c和p2.c两个文件。即为

unix> gcc -02 -o p p1.c p2.c

其中-02 告诉编译器使用第二级优化。而二级优化则是在性能优化与使用方便之间一个最好的权衡。所以代码经常使用二级优化。

(1)机器级代码

一些通常对C程序进行屏蔽的处理器:

程序计数器(%eip)、整数寄存器、条件码寄存器、浮点寄存器

(2)代码示例

int accum = 0;

int sum(int x, int y)
{
int t = x+y;
accum+=t;
return t;
}
 在命令行上使用 “-S”选项, 1
unix〉gcc -02 -S code.c

 就能看到编译器产生的汇编代码:

sum:
pushl %ebp
movl %esp , %ebp
movl 12(%ebp) , %eax
addl 8(%ebp) , %eax
addl %eax , accum
movl %ebp , %esp
popl %ebp
ret

 如果对code.c 使用“-c”选项则会产生一个二进制的文件code.o

unix〉gcc -02 -c code.c

 code.o里面的是汇编指令的目标代码。

当然我们可以使用反汇编器来将目标代码转化为汇编代码:

unix〉objdump -d code.o

三 数据格式

四 访问信息

这是IA32中央处理器所包含的一组八个存储单元的32位存储器。前六个是通用寄存器,对它们的使用没有限制。前三个寄存器(%eax,%ecx,%edx)的保存和恢复惯例不同于接下来的三个寄存器(%ebx,%esi,%edi)。最后两个寄存器保存着指向程序栈重要位置的指针,称为栈指针和帧指针。数据存放在寄存器中进行加减乘除等一些操作。原来的寄存器是16位的所以如图所示蓝色部分是0-15,之后寄存器进行了扩充,变成了32位的即0-31。

(1) 操作数指示符

操作数被分成三种类型:立即数、寄存器、存储器引用。我们来看看一些不同的寻址模式

(2) 数据传输指令

我们来看看一些常见的汇编程序的数据传送指令

movb、movsbl和movzbl之间的差别如下:

假设 %dh =8D,%eax=98765432

 movb %dh ,%a1           %eax=9876548D
movsbl %dh , %eax %eax=FFFFFF8D
movzbl %dh,%eax %eax=0000008D

在以上的例子中都是将寄存器%eax 的低位字节设置为%edx 的第二个字节。movb指令不改变其他三个字节。根据原字节的最高为,movsbl指令将其他三个字节设为全1或全0。movzbl指令无论如何都是将其他三个字节设为全0。

pushl 与popl是用来将数据压入栈中和从栈中弹出数据的。它们两个的指令都只有一个操作数,即它们所要压入或者弹出的数据。将一个双字值压入栈中,首先要将栈指针减4,然后将值写入到新的栈顶地址。弹出一个双字的操作是从栈顶位置读出数据,然后将栈指针加4。

五 算术与逻辑操作

我们来看看一些双字整数的操作

如图所示共有四种不同的操作:leal 、一元操作、二元操作、位移操作

(1) 加载有效地址

加载有效地址指令leal实际上是movl指令的变形。它的指令形式是从存储器读数据到寄存器,但实际上它根本就没有引用存储器。

(2)一元操作和二元操作

一元操作即只有一个操作数,二元操作即是有两个操作数。

(3)位移操作

位移操作,先给出位移量,然后是待移位的值。可以进行算术和逻辑右移。

六 控制

对于C和汇编代码中的语句,默认的是按照语句或指令在程序中出现的顺序来执行的。

(1)条件码

CPU包含了一组单个位的条件码寄存器,它们描述了最近的算术或逻辑操作的属性。常见的条件码为:进位标志(CF)、零标志(ZF)、符号标志(SF)、溢出标志(OF)

(2)访问条件码

两种最常用的访问的条件码的方法不是直接读取它们,而是根据条件码的某个组合,设置一个整数寄存器或是执行一条分支指令。每个指令根据条件码的某个组合,将一个字节设置为0或者1。同一个机器指令可以有不同的名字。

(3)跳转指令

跳转指令会导致执行切换到程序中的一个全新的位置。这些跳转的目的地通常用一个标号指明。jmp指令是无条件跳转的,可以直接跳转也可以间接跳转。

(4)循环

do-while、while、 for

(5)switch语句

switch语句提供了根据一个整数索引值进行多重分支的能力。在处理具有多种可能结果的测试时,特别有用。它通过使用跳转表使代码更加高效。

七 过程

一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。

(1)栈帧结构

栈帧结构指的是为单个过程分配的那部分栈。栈帧的最顶端是以两个指针定界的,寄存器%ebp作为帧指针,寄存器%esp作为栈指针。栈指针是可以移动的,所以大多数信息的访问都是相对于帧指针的 。

(2)转移控制

call :过程调用

leave:为返回准备栈

ret:从过程调用中返回

(3)递归过程

教材学习中的问题和解决过程

cmp与sub有什么区别?

查看课本练习上学期学习的汇编cmp与sub类似,都是从目的操作数减去源操作数,但sub会将运算结果送至目的操作数,而cmp不会送至目的操作数,cmp用于检测标识符。

mybash

mybash:

通常shell中执行命令的流程都是bash进程创建了一个子进程,然后子进程进程替换,替换为可执行的命令文件。

bash输出信息的格式是:

[用户名@主机名所在文件]$(root用户:[用户名@主机名所在文件]#)。

当所在文件就是当前用户的家目录时显示“~”。

如图所示:

![](http://img.blog.csdn.net/20171119204238469?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTU9PTjU1NTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长

目标 5000行 30篇 400小时

第五周 23/455 1/10 8/93

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难,软件工程 估计方法

计划学习时间:10小时

实际学习时间:15小时

改进情况:学习效率不高,仍有待改进

(有空多看看现代软件工程 课件

软件工程师能力自我评价表)

参考资料

《深入理解计算机系统V3》学习指导

...

# 2017-2018-1 20155337《信息安全系统设计基础》第5周学习总结+mybash的更多相关文章

  1. 20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试

    目录 [第九周学习总结] 教材内容总结 [第八周课上测试] (一)求命令行传入整数参数的和 (二)练习Y86-64模拟器汇编 (三)基于socket实现daytime(13)服务器和客户端 参考资料 ...

  2. 2017-2018-3 20155337《信息安全系统设计基础》 pwd指令学习

    2017-2018-3 20155337<信息安全系统设计基础> pwd指令学习 任务要求 学习pwd指令 研究pwd实现需要的系统调用(man -k:grep),写出伪代码 实现mypw ...

  3. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

    20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...

  4. 2017-2018-1 20155326 《信息安全系统设计基础》第四周学习总结及myod改进版的补交

    2017-2018-1 20155326 <信息安全系统设计基础>第四周学习总结及myod改进版的补交 学习内容 补充完成课上没有完成的内容 学习教材附录A,第十章内容 参考别出心裁的Li ...

  5. 2017-2018-1 20155305 《信息安全系统设计基础》第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客)

    2017-2018-1 20155305 <信息安全系统设计基础>第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客) 课堂提交题目要求 编写MyOD.java 用java ...

  6. 2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd

    2017-2018-1 20155318 <信息安全系统设计基础>第九周课下实践--实现mypwd 相关知识 man -k 查找含有关键字的内容 与管道命令结合使用:man -k k1 | ...

  7. 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现

    20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...

  8. 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客

    2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...

  9. 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)

    2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...

  10. 20135234mqy-——信息安全系统设计基础第五周学习总结

    程序的机器级表示 3.1 intel处理器系列俗称x86,经历了一开始个长期的,不断进化的发展过程. 开始时它是第一代单芯片,16位微处理器之一,由于当时集成电路技术水性有限,其中做了很多妥协,此后, ...

随机推荐

  1. 关闭window端口445

    首先,来查看下系统当前都开放了什么端口,怎样查看呢?调出cmd命令行程序,输入命令”netstat -na“,可以看到. 接着,可以发现当前系统开放了135.445以及5357端口,而且从状态看都处于 ...

  2. 《梦断代码》读书笔记 part3

    第六章:搞掂设计方案 备份很重要. 必须从小项目开始,而且永远不要期望它变大,如果你这么想,就会做过度设计,把它想象得过于重要,更坏的情况是,你可能会被自己想象中的艰难工作所吓到.所以要从小 处起步, ...

  3. java list.remove移除失败

    1. resultList.remove(i) 移除失败说明 当i为Integer类型时,通过观察源码发现当找不到该类型时就会自动去找Object类型,即remove(object),因为集合中不存在 ...

  4. 【node】安装

    参考链接: http://www.runoob.com/nodejs/nodejs-install-setup.html http://blog.csdn.net/u010255310/article ...

  5. [转]MVP+WCF+三层结构搭建项目框架

    最近,我一直在重构之前做的一个项目,在这个过程中感慨万千.原先的项目是一个运用了WCF的C/S系统,在客户端运用了MVC模式,但MVC的View.Model耦合以及WCF端分布式欠佳等问题让我有了重构 ...

  6. saltstack安装配置(yum)

    主机规划: (主)master:192.168.25.130 (从)minion:192.168.25.131     192.168.25.132 1.yum安装: 服务端:安装master yum ...

  7. 使用iptables和tc对端口限速

    首先,我们来看一下tc,TC(Traffic Control)命令,是linux自带的告警流控命令.Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制, ...

  8. 在hyper-v中安装centos后配置网络

    /etc/sysconfig/network-scripts vi ifcfg-eth0 改为以下配置 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no ...

  9. Android App的签名打包(晋级篇)

    http://blog.csdn.net/linghu_java/article/details/6701666 Andriod应用程序如果要在手机或模拟器上安装,必须要有签名! 1.签名的意义 为了 ...

  10. ios下元素溢出设置 overflow:auto; 不能滑动解决办法

    ios下元素溢出设置 overflow:auto; 不能滑动解决办法: overflow:auto; overflow-y:scroll; -webkit-overflow-scrolling:tou ...