2020-2021-1学期 20202419《网络空间安全专业导论》第三周学习总结
第六章.低级程序设计语言与伪代码
6.1计算机操作
包括可编程的,存储,检索,处理。
6.2.机器语言
由计算机直接使用的二进制编码指令构成的语言
6.2.1Pep/9:一台虚拟机
虚拟机:为了模拟真实机器的重要特征而设计的假想机器
(Pep/9包含40条机器语言)
1.Pep/9的基本特性
PEP/9的内存单元由65536字节的存储空间构成。这些字节从0到65536(十进制)进行编号。Pep/9的字的长度是2字节或者说16位
寄存器是中央处理器中算术/逻辑单元的一小块存储区域,它用来存储特殊的数据和中间值。Pep/9有七个寄存器,我们重点研究其中的三个:
- 程序寄存器(PC):其中包含下一条即将被执行的指令的地址
- 指令寄存器(IR):其中包含正在被执行的指令的一个副本
- 累加器(A):用来存储数据和运算的结果
一个字节能够表示的最大十进制数是255,用二进制表是111用十六进制表示是FF,用十进制表示是255。一个字(16位)能够表示的最大十进制数是65535,用二进制表示是1六进表是FFFF。如果既要表示正数,又要表示负数,那么在量级上就会少一位(因为有一位用于表示符号),因此可以表示的十六进制值数的范围约为-7FFF到+7FFF,相当于十进制数的-32767到+32767当我们使用Pep/9虚拟机时,这一信息是十分重要的。可用的位数决定了我们可以使用的内存大小。
2.指令格式
一条指令由两部分组成,即8位的指令说明符和(可选的)16位操作数说明符。
- 指令说明符(指令的第一个字节)说明了要执行什么操作(比如把一个数(操作数)加到一个已经存储在寄存器中的值上)和如何解释操作数的位置。
- 操作指示符(指令的第二和第三个字节)存放的是操作数本身或者操作数的地址。注:有些指令没有操作指示符。
3.一些示例指令
操作码 | 指令的意义 |
---|---|
0000 | 停止执行 |
1100 | 将字载入寄存器A中 |
1101 | 将字节载入寄存器A中 |
1110 | 存储寄存器A中的字 |
1111 | 存储寄存器A中的字节 |
0110 | 将操作数加到寄存器A中 |
0111 | 从寄存器A减操作数 |
只有1100、1101、0110、0111支持两种寻址方式。
6.2.2Pep/9的输入/输出
该虚拟机遵循的设计原则是内存映射输入/输出,这种方式将输入和输出设备与主存中特定的、固定的地址联系起来。在虚拟机中,输入设备在地址FC15,输出设备在地址FC16。
为了从输入设备中读一个字符,你将输入设备中的值载入累加器(A寄存器)中;
为了向输出设备写入字符,你将字符值载入累加器中,接着将累加器中的值存储到输出设备的地址中。
6.3程序实例
程序:在屏幕上显示“Hi“。这个程序有5条机器语言指令:2条用于载入,2条用于存储,1条用于停止程序运行。
使用二进制和十六进制些的程序语句
对于每一个二进制指令,第一行展示了8位指令说明符,第二行展示了16位操作数说明符。
6.3.1Pep/9 模拟器
在Pep/模拟器中,通过选中”构建“>“装入“菜单选项来装入程序。再将程序装入内存中后,可以通过”构建“>”执行“菜单选项运行程序
6.4.汇编语言
- 汇编语言:一种低级语言,用助记码表示特定计算机的机器语言指令
- 汇编器:把汇编语言程序翻译成机器代码的程序
6.4.1Pep/9汇编语言
在Pep/9汇编语言中,操作数用0x和十六进制表示,接下来是逗号,最后是寻址模式(由字母i(立即寻址)或d(直接寻址)说明)常规的指令:
!
除了常规的指令,汇编语言编程还支持汇编器指令,这些指令都是汇编器本身使用的指令,有时它们也被称作伪操作。
汇编器指令(伪操作):翻译程序使用的指令
6.4.2数字数据,分支,标签
分支:指出执行下一条指令的指令
标签:对内存位置起的名字,可以将这个名字当作操作数
DECI指令代表十进制输入(decimal input),这条指令从输入设备中读入十进制数(基数为10),并且将它存储在操作数指定的位置上。数字可以由很多位组成——DECI指令涉及将输入字符转为数字的操作,该指令不支持立即寻址。DECO和STRO指令使数据写输出设备中,DECO指令输出特定的十进制数字,它支持两种寻址模式,STRO指令被用来打印完整的一串字符串。
6.4.3汇编语言中的循环
6.5表达算法
- 算法:解决方案的的计划或概要,或解决问题的逻辑步骤顺序
- 伪代码:一种表达算法的语言
6.5.1伪代码的功能
- 变量
- 赋值
- 输入/输出
- 选择
- 重复
布尔表达式:评价为真或假的表达式 在选择和重复中有重要功能
伪代码语句:
6.5.2执行伪代码算法(用十进制转换为八进制为例)
在之前的学习中,有一个算法可以把十进制数字系统转化为其他进制数字的算法。用这个算法把十进制数93转换成8进制数
除法 | 商 | 余数 | 答案 |
---|---|---|---|
93/8 | 11 | 5 | 5 |
11/8 | 1 | 3 | 35 |
1/8 | 0 | 1 | 135 |
写成程序为:
6.5.3写伪代码运算
在写此算法的过程中,我们采用了2个主要的策略。我们问了问题并推迟了细节。问问题是我们大多数人都熟悉的策略。推迟细节则是首先给任务一个名称,然后再补充细节来完成这个任务。也就是说,我们首先用more pairs和print them in order来编写算法代码,然后补充细节以完成这个任务。在没有测试之前,算法都不算完成。
桌面检查:在纸上走查整个设计(一种简单有效的的方法)
6.5.4翻译伪代码算法
如何翻译伪代码算法取决于我们将算法翻译成哪种语言。在这里,由于汇编语言的范围是有限的,所以一个伪代码语句需要几个Pep/9语句。
6.6.测试
- 测试计划:一个文档,说明了要全面测试程序需要运行的次数以及运行程序使用的数据。
- 代码覆盖(明箱)测试法:通过执行代码中的所有语句测试程序或子程序的测试方法
- 数据覆盖(暗箱)测试法:把代码作为一个暗箱,基于所有可能的输入数据测试程序或子程序的测试方法
- 测试计划实现:用测试计划中规定的测试用例验证程序是否输出了预期的结果
关键术语
算法(algorithm) 数据覆盖(暗箱)测试法(data-coverage-(black-box)testing) 汇编器(assembler) 标签(label) 汇编器指令(assembler directive) 装人程序(loader)汇编语言(assembly language) 机器语言(machine language) 布尔表达式(boolean expression) 伪代码(pseudocode) 分支(branch) 测试计划(test plan) 代码覆盖(明箱)测试法(code-coverage) 测试计划实现(test-plan-implementation)(clear-box)testing) 注释(comment) 虚拟机(virtual computer(machine)) 桌面检查(desk checking)
第七章.问题求解与算法设计
7.1.如何解决问题
- 理解问题
- 找到数据和未知量之间的联系。如果找不到直接的联系,则可能需要考虑辅助问题。最终应该得到解决方案。(解决问题的核心)
- 执行方案
- 分析得到的解决方案
7.1.1提出问题
针对当前问题,我们会不断继续追问,直至我们明白自己需要做什么;如果是自己设置的问题,我们会对问题进行更深入的研究。
7.1.2寻找熟悉的情况
不同的问题,或许有相似的地方,我们要透过现象看本质,将晦涩难懂的文字,转变为你熟知的现象。
7.1.3分治法
把一个大问题划分成几个能解决的小单元(化繁为简)
7.1.4算法
解决问题的方案(算法:在有限的时间内用有限的数据解决问题或子问题的明确指令集合)
7.1.5计算机问题求解过程
7.1.6方法总结
- 分析问题
- 列出主要任务
- 编写其余模块
- 根据需要进行重组和改写
7.1.7测试算法
越早发现和修正问题,解决问题就越容易,代价越小
7.2.有简单变量的算法
7.2.1带有选择的算法
if语句(IF……ELSE……)
7.2.2带有循环的算法
- 计数控制循环 (Part1:初始化;Part2:测试;Part3:增量(以1递增))有具体次数 while循环又称前测试循环,若为真进入循环,反之则不进入循环。
- 事件控制循环 (Part1:事件必须初始化,Part2:事件必须被测试,Part3:事件必须更新) 无具体次数
- 嵌套结构:控制结构嵌入另一个控制结构的结构,又称嵌套逻辑。
- 平方根
抽象步骤:细节仍未明确的算法步骤
具体步骤:细节完全明确的算法步骤
7.3.复杂变量
7.3.1数组
同构项目的有名集合,可以通过单个项目在集合中的位置访问它们。项目在集合中的位置叫做索引。
与数组有关的算法分为三类:搜索、排序和处理,搜索就像它的字面意思一样,搜索数组中的项,一次寻找一个特定的值。排序是按顺序将元素放入数组中。如果项是数字,将以数字顺序排列;如果项是字符或字符串,将以字母顺序排序。一个已排序的数组中的项已经排好顺序。处理是一种捕捉短语,包含了对数组中的项所做的所有其他计算。
7.3.2记录
异构项目于的有名集合,可以通过名字单独访问其中的项目。所谓异构,指集合中的元素可以不必相同
7.4.搜索算法
7.4.1顺序搜索
依次查找每个元素并将其与我们需要搜索的元素进行比较。
7.4.2有序数组中的顺序搜索
程序员在处理数组时经常使用数学表示符index
样例:
7.4.3二分检索
在有序列表中查找项目的操作,通过比较操作排除了大部分检索范围。
样例:
注:二分检索不一定更快,因为为计算中间项的索引,每个都比操作都需要更多的计算。
7.5.排序
7.5.1选择排序
7.5.2冒泡排序(选择排序的一种)
7.5.3插入排序
7.6递归算法
当在一个算法中使用它自己时,这样的算法被称为递归算法,也就是说,如果在某种程度上调用自己,那这个调用称为递归调用。递归就是算法调用它本身的能力,是另一种重复(循环)的控制结构。这种算法使用一个选择语句来确定是否重复算法来调用一遍或停止这一过程,而不是使用一个循环语句来执行一个算法。
递归:算法调用它本身的能力。
每个递归算法至少有两种情况:基本情况和一般情况。基本情况是答案已知的情况;一般情况则是调用自身来解决问题的更小版本的解决方案。因为一般情况下解决的是原始问题越来越小的版本,所以程序最终达到基本情况。
与每个递归问题相关的是如何衡量问题的大小。
所有递归解决方案的第一步都是确定尺寸系数。如果问题涉及的是数值,尺寸系数可能就是数值本身。如果问题涉及结构,那么尺寸系数可能就是结构尺寸。
7.6.1子程序语句
我们可以给一段代码一个名称,然后程序另一部分的一个语句使用这个名称。遇到这个名称时,这个进程的其他部分将会终止,等待这个命名代码被执行。命名代码出现的地方被称为调用单元。
子程序的两种形式:只执行特定任务的命名代码;不仅执行任务,还返回给调用单元一个值。
第一种形式的子程序在调用单元中用作语句,第二种则作为表达式,返回的值被用来测估表达式。
7.6.2递归阶乘
N!=N * (N-1)!
Factorial(O)=1
Factorial(N)=N * Factorial(N-1)
每次调用Factorial时N都会减少,每次给出的数据称为参数。如果参数是负数,子程序将不断调用自身,直到运行时间支持系统耗尽了内存为止。这叫做无限递归。
7.6.3递归二分检索
递归算法必须从非递归算法中调用,正如刚才的阶乘算法那样。
7.6.4快速排序
如果数据是随机排列的,那么快速排序是一个很好的排序方法。
7.7几个重要思想
7.7
.1信息隐蔽
信息隐蔽:隐蔽模块的细节以控制对这些细节的访问的做法。
7.7.2抽象
信息隐蔽是隐藏细节的做法,抽象则是隐藏细节后的结果,
抽象:复杂系统的一种模型,只包括对观察者来说必需的细节。
我们会看到计算领域中的各种抽象类型:
数据抽象:把数据的逻辑视图和它的实现分离开。
过程抽象:把动作的逻辑视图和它的实现分离开。
控制抽象:把控制结构的逻辑视图和它的实现分离开。
控制结构:用于改变正常的顺序控制流的语句
7.7.3事物命名
7.7.4测试
关键术语:
抽象步骤(abstract step) 控制结构(control structure) 抽象(abstraction)
数据抽象(data abstraction) 算法(algorithm) 信息隐蔽(information hiding)
二分检索(binary search) 嵌套结构(嵌套逻辑)(nested structure(nested logic))
具体步骤(concrete step) 过程抽象(procedural abstraction) 控制抽象(control abstraction)
递归(recursion)
导图