2019-2020学期20192404《网络空间安全专业导论》第三周学习总结
Part4 程序设计层
第六章 低级程序设计语言与伪代码
6.1计算机操作
计算机是能够储存、检索和处理数据的可编程电子设备。
计算机操作中的操作指可编程的,储存,检索和处理。
6.2机器语言
Pep8
虚拟机:为了模拟真实机器的重要特征而设计的假想机器。
Pep/8有39个机器语言指令。
Pep/8反映的重要特性。
Pep/8的内存单元由65536字节的存储空间构成。这些字节从0到65536(十进制)进行编号。
Pep8七个寄存器中的三个寄存器
-
程序计数器(PC),其中包含下一条即将被执行的指令的地址。
-
指令寄存器(IR),其中包含正在被执行指令的一个副本。
-
累加器(是一个寄存器)。
指令格式
一条指令由两部分组成,即8位的指令说明符和(可选的)16位的操作数说明符。说明指令符(指令的第一个字节)说明了要执行什么操作(如把一个数加到一个已经存储在寄存器中的值上)和如何解释操作数的位置。操作数说明符(指令的第二和第三字节)存放的是操作数本身或者操作数的地址。有些指令没有操作数说明符。
指令说明符的格式根据表示一个具体操作所用的比特数的不同而不同。在Pep/8中,操作代码(称为操作码)的长度从4比特到8比特不等。我们在这里所用的操作码长度是4比特或5比特,4比特操作码的第5位用来指定使用哪个寄存器。
3比特的寻址模式说明符表示了怎样解析指令中的操作数部分。如果寻址模式是000,那么指令的操作数说明符中存储的就是操作数。这种寻址模式称为立即寻址(i)。如果寻址模式是001,那么操作数说明符中存储的是操作数所在的内存地址名称。这种寻址模式称为直接寻址(d)。
手工模拟
1)从程序计数器指定的位置读取下一条指令
2)译解指令(并且更新程序计数器)
3)如果需要,获取数据(操作数)
4)执行指令
4.汇编语言
汇编语言:一种低级语言,用助记码表示特定计算机的机器语言部分。
汇编器:把汇编语言程序翻译成机器代码的程序。
5.Pep/8汇编语言
助记忆码
操作数、寻址模式说明符
指令的含义
STOP
停止执行
LDA
0x008B, i
把008B载入寄存器A
LDA
0x008B, d
把内存单元8B中的内容载入寄存器A
STA
0x008B, d
把寄存器A中的内容存入内存单元8B
ADDA
0x008B, i
把008B加到寄存器A中
ADDA
0x008B, d
把内存单元8B中的内容加到寄存器A中
SUBA
0x008B, i
从寄存器A中减去008B
SUBA
0x008B, d
从寄存器A中减去内存单元8B中的内容
BR
分支到操作数说明符中指定的位置
CHARI
0x008B, d
读取一个字符,把它存入内存单元8B中
CHARO
0x008B, i
输出字符B
CHARO
0x008B, d
输出存储在内存单元8B中的字符
DECI
0x008B, d
读取一个十进制数,把它存储在内存单元8B中
DECO
0x008B, i
输出十进制数139(即十六进制的8B)
DECO
0x008B, d
输出存储在内存单元8B中的十进制数
汇编器指令
汇编器指令(assembler directive):翻译程序使用的指令。
伪操作
参数
含义
.ASCII
"Str\x00"
表示一个ASCII字节的字符串
.BLOCK
字节数
创建一个字节块
.WORD
值
创建一个字,并存值进去
.END
表示汇编语言的终点
Hello程序的汇编语言版本
注释(comment):为程序读者提供的解释性文字。
汇编语言的重要性:
它通过将指令抽象为单词,从而删除了机器语言编程的很多细节。虽然在执行一个程序时增加了一个步骤(汇编语言翻译成机器代码),但是这个额外的步骤是非常值得的,这大大简化了程序员的工作。
具有分支的程序
助记忆码
操作数、寻址模式说明符
指令的含义
BRLT
i
如果寄存器A是负数,则将PC设置成操作数
BREQ
i
如果寄存器A为零,则将PC设置为操作数
在把num1载入累加器时,如果它的值是负数,则把PC设置为lessThan的内存地址。如果num1的值不为负数,那么PC保持不变。
如果三个数的和是正数,则输出和,如果和是负数,则输出错误消息。在要把计算出的结果存入地址sum之前,可以测试寄存器A,如果它是负数,则输出“E”。
可以用BRLT指令测试和是否为负数。如果寄存器A是负数,那么PC的内容将被BRLT后面的操作数代替,使下一条指令从操作数指定的内存单元开始。必须给这条指令一个名字,我们称之为negMsg。当显示出错误信息后,必须跳转到让程序结束的STOP行,也就是说,必须给这个代码行一个名字。我们称之为finish。
具有循环的程序
如果我们想读入4个值并求其和怎么办?五个值呢?任意数量的值呢?我们可以想输入多少值求和就输入多少值,并编写代码读取这些值并求和。我们通过创建记数循环代码来实现这个功能,这部分代码可以重复指定次数。在代码循环中一个值被读取并累加。如何知道已经读取了多少个值呢?可以在每次重复循环时建立一个散列标记,之后比较散列标记的和与我们希望循环的次数。实际上,这个散列标记就是在内存中一个为0的存储单元,我们称之为计数器(counter)。每次循环重复时,我们在该存储单元中加1,即计数器加1.当计数器等于我们想输入的数量,就完成读取和记数。
.表达算法
算法:解决方案的计划概要,或解决问题的逻辑步骤顺序。
伪代码:一种表达算法的语言。
伪代码的功能:
变量
出现在伪代码算法中的名字,应用的是内存中存储值的位置。这些名字要能反映出它存放的值在算法中的角色。
赋值
把值放入变量
例:
1)Set sum to 0
2)sum <—— 1
访问变量中的值
例:
1)Set sum to sum + num
2)sum <—— sum + num
输入/输出
我们可以使用Write语句进行输出,使用Read语句进行输入。
例:
Write“Enter the number of values to read and sum”
Read num
双引号之间的字符叫作字符串,它们告诉用户要输入什么或者要输出什么。究竟采用Display还是Print是无关紧要的,它们都等价于Write,Get和Input都与Read同义。
选择
用选择结构可以执行或跳过某项操作。另外,用选择结构还可以在亮相操作之间进行选择。选择结构使用括号中的条件决定执行哪项操作。
例:
//Read and sum three numbers
IF (sum < 0)
Print error message
ELSE
Print sum
//Stop or whatever comes next
重复
使用重复结构可以重复执行指令。比如在求和问题中,计数器被初始化、检验并增加。伪代码允许我们概述算法,所以这部分就变得易于理解。和选择结构一样,在WHILE旁边的圆括号中的表达式是一个判断,如果判断成立,缩进中的语句将被执行,如果不成立,就会跳过缩进中的语句,直接执行下一个非缩进语句。
例:
Set limit to number of values to sum
WHILE(counter < limit)
Read num
Set sum to sum + num
Set counter to counter + 1
//Rest of program
WHILE和IF旁边的括号里的表达式是布尔表达式,其结果可为真或假。在IF中如果表达式为真,则执行接下来的缩进代码块,若表达式为假,则跳过缩进代码块。在WHILE中,若果表达式为真,则执行缩进代码块。如果表达式为假则跳到下一个不缩进的执行语句。将WHILE、IF和ELSE大写是因为这些语句通常直接使用在很多编程语言中,在计算领域中它们有特殊的含义。
布尔表达式(boolean expression):评价为真或假的表达式。
执行伪代码算法
写伪代码算法
1)读入一些正数数对,然后按序输出这些数对。如果数对多于一对,就必须使用循环。下面是该算法的初稿:
WHILE(not done)
Write“Enter two values separated by a blank;press return”
Read number1
Read number2
Print them in order
如何知道何时停止呢?也就是说,如何终止程序中所说的not done呢?可以要求用户告诉程序要输入多少个数对。下面是算法的第二稿:
Write “How many pairs of values are to be entered?”
Read numberOfPairs
Set pairsRead to 0
WHILE (pairsRead < numberOfPairs)
Write “Enter two values separated by a blank;press return”
Read number1
Read number2
Print them in order
如何判断数对的顺序呢?可以用条件结构比较它们的值。如果number1小于number2,则先输出number1,再输出number2.否则,就先输出number2,再输出number1.在完成算法前,必须增加number1的值。下面是算法的终稿:
Write “How many pairs of values are to be entered?”
Read numberOfPairs
Set pairsRead to 0
WHILE (pairsRead < numberOfPairs)
Write “Enter two values separated by a blank;press return”
Read number1
Read number2
IF (number1 < number2)
Print number1,“ ”,number2
ELSE
Print number2,“ ”,number1
Set numberRead to numberRead + 1
桌面检查:
我们坐在桌子前,用纸和笔走查整个设计。在推理设计时,采用真实的数据来跟踪发生的情况非常有用。这种方法虽然简单,但却极其有效。
翻译伪代码算法
7.测试
测试计划(test plan):说明如何测试程序的文档。
代码覆盖(明箱)测试法(code-coverage(clear-box)testing):通过执行代码中的所有语句测试程序或子程序的测试方法。
数据覆盖(暗箱)测试法(data-coverage(black-box)testing):把代码作为一个暗箱,基于所有可能的输入数据测试程序或子程序的测试方法。
测试计划实现(test-plan implementation):用测试计划中规定的测试用例验证程序是否输出了预期的结果。
测试计划实现要运行测试计划中列出的所有测试用例,并记录运行结果。如果结果与预期不符,则必须重新审查设计,找出并纠正其中的错误。当每种测试用例都给出了预期的结果时,这个过程将结束。
第七章 问题求解与算法设计
7.1 如何解决问题
7.1.2 寻找熟悉的情况
7.1.3 分治法
7.1.4 算法
算法:在有限的时间内用有限的数据解决问题或子问题的明确指令集合。
方法总结
-
基本情况
基本情况是答案已知的情况。 -
一般情况
一般情况则是调用自身来解决问题的更小版本的解决方案。子程序语句
子程序有两种形式,一种是只执行特定任务的命名代码,一种是不仅执行任务,还返回给调用单元一个值(值返回子程序)。第一种形式的子程序在调用单元中用作语句,第二种则用作表达式,返回的值被用来评估表达式。
递归阶乘
数的阶乘的定义是这个数与0和它自身之间的所有数的乘积,即:
N!=N_(N - 1)!
0的阶乘是1.尺寸系数就是要计算阶乘的数。
基本情况是:
Factorial(0)=1
一般情况是:
Factorial(N)=N_Factorial(N - 1)递归二分检索
快速排序
7.几个重要思想
信息隐蔽
信息隐蔽(information hiding):隐蔽模块的细节以控制对这些细节的访问的做法。
抽象
抽象(abstraction):复杂系统的一种模型,只包括对观察者来说的必须章节。
数据抽象(data abstraction):把数据的逻辑视图和它的实现分离开。
过程抽象(procedural abstraction):把动作的逻辑视图和它的现实分离开。
控制抽象(control abstraction):把控制结构的逻辑视图和它的现实分离开。
控制结构(control structure):用于改变正常的顺序控制流的语句。
__EOF__

本文链接:https://www.cnblogs.com/jzbysl0910/p/11720785.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现