20192429马一

导航

 

2019-2020-1学期20192429《网络空间安全专业导论》

第六章 低级程序设计语言与伪代码
6.1 计算机操作

  • 计算机是能够存储、检索和处理数据的可编程电子设备。
  • 要改变计算机对数据的处理,只需要改变指令即可。
  • 存储、检索和处理是计算机能够对数据执行的动作。
    6.2 机器语言
  • 计算机真正执行的程序设计指令是用机器语言编写的指令,这些指令固定在计算机的硬盘中。
  • 机器语言(machine language):由计算机直接使用的二进制编码指令构成的语言。
    这些指令是处理器一**真正能够执行的指令
    问题:指令分配按照什么规则来分配二进制代码,具体是如何分配的?
  • 在机器语言中,处理过程中每一个微小的步骤都必须被明确地编码。
  • 目前几乎没有程序是用机器语言编写的,主要是因为编写这种程序太费时间
    Pep/8:一台虚拟机
  • 虚拟机(virtual computer(machine)):为了模拟真实机器地重要特征而设计的假想机器。
  • Pep/8反映的重要特性:
    1.Pep/8的内存单元由65536个字节的存储空间构成。这些字节从0到65535( 十进制)进行编号。
    2.Pep/8的字长是两字节,或者16比特。这样向算术/逻辑单元(ALU)流入的数据或从 算术/逻辑单元流出的数据在长度上就是16比特
    3.Pep/8有7个存储器
    累加器:用来保存操作的数据和结果的一种特殊的存储寄存器。
    1
    问题:请老师详细讲解一下这几幅图表,并解释空格与进制代码的关系
  • 指令格式
  1. 一条指令由两部分组成,即8位的指令说明符和(可选的)16位的 操作数说明符。
  2. 指令说明符(指令的第一个字节)说明了要执行什么操作和如何解释操作数的位置。
  3. 操作说明符(指令的 第二和第三个字节 )存放的是操作数本身或者操作数的地址有些指令 没有操作数说明符
    2
  • 立即寻址:如果寻址模式是000,那么指令的操作数说明符中存储的就是操作数。
  • 直接寻址:如果寻址模式是001,那么操作数说明符中存储的是操作数所在的内存地址名称。
  • 立即寻址和直接寻址模式之间差别十分重要,因为它决定了操作中涉及的数据存储或将要被存储的位置。
    3
    4
  • 立即寻址和直接寻址模式之间差别十分重要,因为它决定了操作中涉及的数据存储或将要被存储的位置。
  • 模式说明符说明了该字要载入的位置,其确定了指令的操作数部分(在指令的第二和第三字节)所存储的就是将要载入的值,或是将要载入的值的地址。
    6.3 一个程序实例
    6
  • 我们必须用二进制构造操作说明符,因为它由4位操作码、1位寄存器说明符和3位寻址模式说明符构成。
  • 我们使用双引号来指一组字符,如“hello”,使用单引号指单个字符。
    6.3.1 手工模拟
    通过执行读取-执行周期的步骤模拟这个程序的执行。
    6.3.2 Pep/8 模拟程序
    要运行一个程序,需要逐字节地输入十六进制的代码,每个字节之间用空格隔开,以zz结束程序。
    7
    装入程序(loader):软件用于读取机器语言并把它载入内存的部分。
    6.4 汇编语言
  • 汇编语言(assembly language):一种低级语言,用助记码表示特定计算机的机器语言指令。
  • 汇编器(assembler):把汇编语言程序翻译成机器代码的程序。
    6.4.1 Pep/8汇编语言
  • 在Pep/8汇编语言中,每个寄存器有一个操作码,操作数是十六进制的,由0x说明,寻址模式说明符由字母i或d说明。
    8
  • Pep/8汇编语言提供了助记忆码DECI和DECO,它允许我们做十进制输入和输出。
    问题:助记码具体是什么呢?
    6.4.2 汇编器指令
  • 汇编器指令(assembler):翻译程序使用的指令。
    9
    6.4.2 Hello程序的汇编语言版本
  • 注释(comment):为程序读者提供的解释性文字。
  • 汇编器的输入是一个用汇编语言编写的程序,输出是用机器代码编写的程序。
    6.4.5 具有分支的程序
  • 一个将程序计数器设为下一条被执行的指令地址的BR指令可以改变程序计数器。
    10
    6.4.6 具有循环的程序
  • 伪代码:这是一种可以减少对分支和循环的情形进行文字解释的方式。
    6.5 表达算法
  • 算法(algorithm):解决方案的计划或概要,或解决问题的逻辑步骤顺序。
  • 伪代码(pseudocode):一种表达算法的语言。
    6.5.1 伪代码的功能
    ·虽然伪代码并没有特定的语法规则,但必须要表示变量、赋值、输入/输出、选择和重复的概念。
    -变量:出现在伪代码算法中的名字,引用的是内存中存储值的位置
    -赋值:如果有了变量,就要有把值放入变量的方法
    -输入/输出:大多数计算机程序只处理某种类型的数据,所以必须能够从外部世界向计算机中输入数据值,还要能把结果输出到屏幕上
    -选择:用选择结构可以选择执行或跳过某项操作
    -重复:用重复结构可以重复执行命令
    ·布尔表达式(boolean expression):评价为真或假的表达式。
    11
    6.5.2 执行伪代码算法
    12
    6.5.3 写伪代码算法
    ·桌面检查(desk checking):在纸上走查整个设计。
    6.5.4 翻译伪代码算法
    ·由于汇编语言的范围是有限的,所以一个伪代码语句需要几个 Pep/8语句。
    6.6测试
    -测试计划(test plan):说明如何测试程序的文档。
    -代码覆盖(明箱)测试法(code-coverage(clear-box)testing):通过执行代码中的所有语句测试程序或子程序的测试方法。
    -数据覆盖(暗箱)测试法(data-coverage(black-box)testing):把代码作为一个暗箱,基于所有可能的输入数据测试程序或子程序的测试方法。
    -测试计划实现(test-plan implementation):用测试计划中规定的测试用例验证程序是否输出了预期的结果。 要运行测试计划中列出的所有测试用例。

第七章 问题求解与算法设计
7.1 如何解决问题
1945年,G·Polya写了一本书,名为《如何解决它:数学方法的新观点》
7.1.1 提出问题
17
7.1.2 寻找熟悉的情况
与举一反三同理
7.1.3分治法
分类讨论,分组求解(整那么高大上干什么)
7.1.4算法

  • 算法(algorithm):在有限的时间内用有限的数据解决问题或子问题的明确指令集合。
    问题:为什么需要在有限的时间内用有限的数据?
    7.1.5 计算机问题求解过程
  • 计算机问题求解过程有四个阶段,即分析和说明阶段、算法开发阶段、实现阶段和维护阶段。
    18
  • 上述的四个阶段是存在交互现象的。如下图所示,粗线标明了各阶段间的一般信息流, 细线 表示在发生问题时可以退回前面的阶段的路径。
    19
    7.1.6 方法总结
  • 主要可分为以下四个步骤:
  1. 分析问题
  2. 列出主要问题
  3. 编写其余模块
  4. 根据需要进行重组和改写
    7.1.7 测试算法
  • 数学问题求解的目标是生成问题的特定答案,因此,检查结果等价于测试推出答案的过程。
    7.2 有简单参数的算法
  • 简单(原子)变量是那些不能被分开的变量,是存储在一个地方的一个值。
    7.2.1 带有选择的算法
  • 顶级(主要)模块只是表达任务
  • 任何一个分支都包含一连串的语句
    7.2.2带有循环的算法
    计数控制循环
    1.计数控制循环可以指定过程重复的次数,这个循环的 机制是简单记录过程重复的次数并且在重复再次开始前检测循环是否已经结束。
    2.这类循环有三个不同的部分,使用一个特殊的变量叫 循环控制变量。第一部分是初始化:循环控制变量初始化为某个初始值。第二部分是测试:循环控制变量是否已经达到特定值?第三部分是增量:循环控制变量以1递增。
    3.while循环被称为前测试循环。
    4.永远不会终止的循环称为一个无限循环
    事件控制循环
    -循环中重复的次数是由循环体自身内发生的事件控制的循环。
    -当使用 while语句来实现事件控制循环时,这一过程仍分为三部分:事件必须初始化,事件必须被测试,事件必须更新。
    -嵌套结构(nested structure):控制结构嵌入另一个控制结构的结构,又称为嵌套逻辑(nested logic)。
    问题:嵌套结构不会产生数据溢出问题么?
    平方根
    20
    7.3复杂变量
  • 引用中的字母叫做字符串
  • 如果我们储存了一个字符串,所需的位置数量将取决于字符串中字符的数量。
    7.3.1数组
    -数组:同构项目的有名集合。
    -项目在集合中的位置叫索引。
    -与数组有关的算法分为三类:搜索、排序和处理。
    7.3.2 记录
  • 异构项目的有名集合。
  • 集合可以包含整数、实数、字符串或其他类型的数据。
    7.4 搜索算法
    7.4.1 顺序搜索
    一个一个来,达到条件就执行下一条,否则循环
    7.4.2 有序数组中的顺序搜索
    -无序数组
    21
    -有序数组
    22
    7.4.3 二分检索(binary search
    -在有序列表中查找项目的操作,通过比较操作排除大部分检索范围
    -类似数学中的二分法求极限
    23
    24
    25
    7.5 排序
    7.5.1 选择排序
  • 选择排序算法虽然简单,但却有缺陷,它需要两个完整列表(数组)的空间。即使不考虑内存空间,赋值操作显然也很费空间。
    26
    7.5.2冒泡排序
    -冒泡排序也是一种选择排序法,只是在查找最小值时采用了不同的方法。它从数组的最后一个元素开始,比较相邻的元素对,如果下面的元素小于上面的元素,就交换这两个元素的位置。
    -冒泡排序是非常慢的排序方式。
    27
    7.5.3 插入排序
    -插入排序:将元素加入有序部分类似于冒泡排序中冒泡的过程。如果找到了一个位置,要插入的元素比数组中这个位置的元素小,那么就将新元素插入这个位置。
    28
    7.6 递归算法
    -当在一个算法中使用它自己时时的算法。
    问题:什么叫使用自己
  • 递归(recursion):算法调用它本身的能力。
  • 每个递归算法至少有两种情况:基本情况和一般情况。
    7.6.1子程序语句
    -调用单元:命名代码出现的地方。
    -子程序有两种形式,一种是只执行特定任务的命名代码,一种是不仅执行任务,还返回给调用单元一个值(值返回子程序)。
    29
    30
    7.6.2 递归阶乘
    -这个数与0和它自身之间的所有数的乘积
    -尺寸系数就是要计算阶乘的数
    7.6.3 递归二分检索
    -递归算法必须从非递归算法中调用。
    7.6.4 快速排序
  • 快速排序算法的基本思想:对两个小列表排序比对一个大列表排序更快更容易。
    -其名字来自源于这种算法通常可以相对快地对数据元素列表进行排序,其基本策略是“分治法”。
    -如果数据是随机排列的,则快速排序是一个很好的排序方法。
    31
    7.7 几个重要思想
    7.7.1信息屏蔽(information hiding)
    -隐蔽模块的细节以控制对这些细节的访问的做法。
    7.7.2 抽象
    -抽象(abstraction):复杂系统的一种模型,只包括对观察者来说必需的细节。
    -数据抽象(data abstraction):把数据的逻辑视图和它的实现分离开。
    -过程抽象(procedural abstraction):把动作的逻辑视图和它的实现分离开。
    -控制抽象(control abstraction):把控制结构的逻辑视图和它的实现分离开。
    -控制结构(control structure):用于改变正常的顺序控制流的语句。
    7.7.3 事物命名
    -给数据和过程一个名字,这些名字叫作标识符。
    -当我们要用一种程序设计语言把算法转换成计算机能够执行的程序时,可能必须修改标识符。
    -转换过程分两个阶段,首先在算法中命名数据和动作,然后把这些名字转换成符合计算机语言规则的标识符。
    7.7.4 测试
    -白盒测试:基于代码本身
    -黑盒测试:基于测试所有可能的输入值

posted on 2019-10-22 23:02  20192429马一  阅读(175)  评论(0编辑  收藏  举报