作业信息
这个作业属于哪个课程 | [2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP) |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05 |
这个作业的目标 | Pep/9虚拟机 机器语言与汇编语言 算法与伪代码 测试:黑盒,白盒 |
作业正文 | https://www.cnblogs.com/tanzitian11/p/18504444 |
教材学习内容总结
计算机操作
- 存储
概念:存储指的是在计算机中保存数据和信息的过程。
作用:确保信息的持久性。 - 检索
概念:检索是指从存储的海量数据中查找特定信息的过程。通过检索,可以快速找到特定文件或数据,提高数据访问的效率。
作用:使用户能够高效地找到和访问已存储的信息。应用场景包括文件查找、数据库查询等。 - 处理
概念:处理是对数据进行计算、分析、转换的过程。计算机通过CPU(中央处理器)执行各种指令,对数据进行处理。
作用:实现数据的计算、逻辑判断和操作,生成新的结果或输出内容。数据处理广泛应用于日常操作(如计算、统计分析、图像编辑等)。
机器语言
概念:由计算机直接使用的二进制编码指令构成的语言。
Pep9
概念:是一种模拟计算机,用于学习汇编语言和计算机体系结构的基本原理。以下是Pep9的主要特性:
- 简单体系结构
字长和指令:Pep9使用16位的字长,并且具有有限的指令集,适合初学者学习计算机操作的基础知识。
内存地址空间:Pep9模拟的内存空间为0x0000到0xFFFF,共64KB - 寄存器
累加器(A):用于存储运算结果或临时数据,许多指令都涉及对A寄存器的操作。
程序计数器(PC):存储当前指令的地址,执行后自动指向下一条指令的位置。
指令寄存器(IR):用于存储当前正在执行的指令。 - 指令集
基本指令:Pep9提供多种基本指令,如数据传输、算术运算(加减乘除)、逻辑运算(与、或、非)、条件跳转等。
寻址模式:支持多种寻址模式,包括直接寻址、间接寻址、立即寻址和基址寻址等,使得学习者能够理解不同的内存访问方式。
I/O指令:提供输入输出指令,使用户可以模拟控制台输入和输出,便于学习基本的I/O操作。 - Pep9模拟器
Pep9模拟器:提供图形化界面,方便用户编写、调试和运行Pep9汇编程序,观察寄存器、内存和条件码的变化。
调试功能:包含单步执行、断点设置、内存和寄存器监视等功能,有助于用户分析程序的执行过程和理解计算机的工作原理。
通过Pep9,学习者可以掌握汇编语言、寄存器操作、指令执行流程等基本概念,是计算机体系结构入门的理想工具。
5.关于Pep9的一些指令:
1.数据传送指令
LDA addr:将内存地址addr中的值加载到累加器A。
STA addr:将累加器A中的值存储到内存地址addr中。
2.算术和逻辑指令
ADDA addr:将内存地址addr中的值加到累加器A。
SUBA addr:从累加器A中减去内存地址addr中的值。
ANDA addr:将累加器A与地址addr中的值执行按位与操作。
ORA addr:将累加器A与地址addr中的值执行按位或操作。
3.输入/输出指令
CHARI:从输入设备读取一个字符,并将其存储到累加器A。
CHARO:将累加器A中的字符输出到输出设备。
指令格式示例:
每条指令的格式通常由操作码和操作数组成,操作码标识指令类型,操作数为内存地址或数据。例如:
LDA 0x0040:表示将地址0x0040中的值加载到累加器A。
BRLE 0x0020:表示当CC为负或零时,跳转到地址0x0020。
汇编语言
汇编语言:一种低级语言,用助记码表示特定计算机的机器语言指令。
汇编器:把汇编语言程序翻译成机器代码的程序。
- 数字数据
概念:数字数据是计算机中存储和处理的基本信息类型,通常表示为二进制形式(0和1)。它可以代表各种类型的数值(整数、浮点数)、字符编码、颜色值、音频信号等。
作用:计算机通过对二进制数据的操作来执行数学运算、逻辑运算和其他计算任务。 - 分支
概念:分支是控制程序执行流程的一种机制,使程序可以根据条件选择不同的执行路径。
作用:分支控制允许程序在不同条件下执行不同的代码块,提高程序的灵活性和适应性。 - 标签
概念:标签是程序代码中的一个标记,用于标识某个特定位置,以便程序可以跳转到该位置执行。标签通常用于循环、分支和子程序调用等。
作用:标签可以作为程序控制流的锚点,使得代码可以在不同位置跳转到标签处执行。例如,在汇编程序中,可以通过标签实现循环和条件跳转。
Pep9的表达算法
在Pep9汇编语言中,表达算法的核心在于使用基本指令进行数据的加载、存储和算术运算。通过指令的组合,Pep9可以表达各种算法逻辑,包括算术运算、逻辑判断、循环结构等。以下是Pep9中表达算法的几个关键点:
-
算术运算
实现两个数相加的算法:
LDA 0x0010 ; 加载内存地址0x0010的值到A寄存器
ADDA 0x0012 ; 将地址0x0012的值加到累加器A
STA 0x0014 ; 将结果存储到地址0x0014
在这个例子中,我们将地址0x0010和0x0012的值相加,并将结果存储在0x0014中。 -
条件判断与分支
条件判断与分支控制是算法表达的重要部分。Pep9使用条件跳转指令根据条件码状态实现分支选择,例如:
LDA 0x0010 ; 加载地址0x0010的值到A寄存器
SUBA 0x0020 ; 从A寄存器减去地址0x0020的值
BRLT LESS ; 若结果为负,跳转到LESS标签
BRGT GREATER ; 若结果为正,跳转到GREATER标签
在这个例子中,程序会根据A的值与0x0020的值的比较结果,跳转到不同标签执行不同操作。
- 循环结构
循环结构常用于执行重复操作。Pep9可以通过标签和条件跳转指令实现循环。以下是一个简单的递减循环示例:
LDA 0x0010 ; 将起始值加载到A
LOOP: ; 循环开始
SUBA 0x0001 ; 每次循环减去1
BRZ END ; 若A为0,跳转到END结束循环
BR LOOP ; 否则跳转到LOOP继续循环
END: ; 循环结束
该示例中,当累加器A中的值变为零时,循环结束。
c语言键盘输出和屏幕输入
- 屏幕输出
-
C语言中用于将数据输出到屏幕上的常用函数是printf。它可以将格式化的文本和变量的值输出到屏幕上。
语法:printf("格式化字符串", 变量1, 变量2, ...); -
格式化字符串:%d(整数)、%f(浮点数)、%c(字符)、%s(字符串)等,格式化符号用于指定输出变量的类型。
示例:int a = 10;
float b = 3.14;
printf("a的值为: %d, b的值为: %f\n", a, b);
输出结果:
a的值为: 10, b的值为: 3.140000
- 键盘输入
- 键盘输入常用的函数是scanf,它从标准输入(通常是键盘)中获取数据并存储到指定的变量中。
语法:scanf("格式化字符串", &变量1, &变量2, ...); - &符号:scanf的参数要求是变量的地址,所以在变量前要加&。
示例:int a;
float b;
printf("请输入一个整数和一个浮点数: ");
scanf("%d %f", &a, &b);
printf("你输入的整数是: %d, 浮点数是: %f\n", a, b);
输入与输出过程:
输入:10 3.14
输出:你输入的整数是: 10, 浮点数是: 3.140000
- 单个字符的输入与输出
- 如果只需要输入或输出一个字符,可以使用getchar和putchar函数。
- 字符输入(getchar):从标准输入获取一个字符。
char ch;
printf("请输入一个字符: ");
ch = getchar();
printf("你输入的字符是: %c\n", ch); - 字符输出(putchar):输出一个字符到标准输出。
char ch = 'A';
putchar(ch);
printf("\n");
黑盒和白盒
特性 | 黑盒测试 | 白盒测试 |
---|---|---|
测试依据 | 功能需求、用户视角 | 程序代码、开发人员视角 |
关注点 | 输入输出关系 | 内部逻辑、路径覆盖 |
测试用例编写 | 基于需求,不关注实现细节 | 基于代码逻辑,覆盖各个代码分支 |
优点 | 找出需求偏差、用户体验角度的问题 | 发现代码逻辑错误、覆盖率高 |
缺点 | 可能遗漏一些内部逻辑问题 | 依赖代码,可能未考虑用户需求偏差 |
基于AI的学习
代码调试中的问题和解决过程
- 问题1:在青蛙蹦极有一题编写求和程序,就是输入一系列数字,遇到0就结束程序。一开始我写了一个循环,在codeblock上调试也没有问题,提交后显示我是错误的。
- 问题1解决方案:我重新写了一个whlie循环,循环体换成
scanf("%d", &num);
if (num == 0) {
break;
}
sum += num;
结果提交后对了。之前程序的break我把它放在了程序的后面,而且我用的是do-while型循环,但是调试的时候也没有问题。很神奇。