LC-3机器码编程实验 求成绩等级

news2024/12/25 23:44:56

一、实验目的

  1. 分析和理解指定的需解决问题。
  2. 利用LC-3的汇编代码设计实现相关程序。
  3. 通过LC-3仿真器调试和运行相关程序并得到正确的结果。

二、实验内容

对学生的成绩使用数组进行排序。

背景:一位老师需要你帮忙决定学生的成绩,她想要根据学生分数在班上的排名和考试分数一起决定学生最后的成绩等级。

成绩等级的具体要求如下:

  • 如果学生的分数排名在全班的前25%,且考试分数达到85分及以上,则学生可以获得A
  • 如果学生不能拿A,但是分数排名在全班的前50%,且考试分数达到75及以上,则学生可以获得B
  • 剩下的学生都是C

具体的情况:

  • 一共有16名学生,每名学生只有一个成绩
  • 用汇编语言给这个班级写一个成绩排序的程序。
  • 你的程序必须给学生的分数排序,然后计算出获得A和B的学生人数。程序从x3000开始

程序的输入:

  • 班上16个学生的没有排序的成绩;
  • 每个分数是用16位无符号数表示的0~100的整数
  • 分数存储在16个连续的内存位置-每一个位置一个分数;从x3200开始;
  • 最后一个分数的存储位置为x320F
  • 你可以假设所有的分数相互之间不相同(每个分数是唯一的)

程序的输出(你的程序必须有两个输出):

  • 16位学生的分数排序。分数必须按降序排序在连续的内存位置-每个内存地址一个分数,从x4000开始存储;即x4000存储的分数最高
  • 获得A和B的学生的人数。获得A的学生人数必须存储在x4100,获得B的人数必须存储在x4101

三、实验步骤与结果

1.实验的总体思路与实现

首先要在内存x3200处输入16个分数的原始数据,并通过一轮循环,将其拷贝到x4000处。

在新地址使用冒泡排序降序排序,得出排名。最后对x4000处的数组进行筛选,即可统计出学生中得A级和B级的人数。总体流程图如下:
在这里插入图片描述
以上是一个抽象的、概括性流程,具体的实现方法将在以下展开。每一步具体的流程图都会在下文中提供。

a)完成16个数据的拷贝

算法流程图如下:
在这里插入图片描述
容易看出循环采用do-loop结构。

其中需要注意的地方有很多。例如给R3赋值,由于立即数在[-16, 15]的范围限制,需要两次才能完成。又如要实现*R2 <- *R1,可使用LDR和STR两条指令完成。除此之外,我使用寄存器R0长期保存新地址x4000。汇编代码如图:

在这里插入图片描述

b)对16个数据进行冒泡排序

为了让过程更易于理解,首先我使用C++语言实现了该算法,如下图:
在这里插入图片描述
对应的算法流程图如下:
在这里插入图片描述
由于在C++语言中,我采用了for循环。那么将其转移为汇编语言的过程中,我采用了Jump-to-middle的结构。汇编代码具体如下图:
在这里插入图片描述

c)对16个数据进行筛选评级

同样为了理解方便,先用C++编程。由于无需统计得C的同学的人数,于是循环8轮即可中止。代码如下:
在这里插入图片描述
然后是流程图。
在这里插入图片描述
在汇编化的过程中,对if语句无法使用复杂的表达式,因此会更多地用到条件跳转,类似于C++的goto语句。循环的实现依旧采用jump-to-middle结构。

在这里插入图片描述
由于多次涉及到和85、75这样的数据进行比较,如果使用减法,就会频繁地对寄存器进行取反加一的操作,这无疑是对时空资源的浪费。为了解决这个问题,寄存器中仅储存-85和-75,这样比较的时候,可以直接相加(相当于做减法),此法更优。

2.汇编代码的装载

依然在LC3Edit中完成编辑并生成obj文件,将其装载如LC3模拟器中,如图将学生成绩的原始数据保存在x3200的位置,即可进行实验。
在这里插入图片描述

3.代码功能的测试和正确性的检验。

以下主要采用两个比较有代表性的样例。这两组样例中,无重复值且有边界值

样例1:75 85 90 60 73 87 100 38 66 80 76 82 93 95 74 86

在这里插入图片描述
运行结果如下图:
在这里插入图片描述
可见数据已经拷贝至x4000处。排序功能正常。
在这里插入图片描述
4100处的值是4,x4101的值是4。说明有4位同学得了A,4位得了B。这与笔算的结果是符合的。

样例2:75 85 60 61 73 84 100 38 66 53 76 82 72 95 74 80

在这里插入图片描述
运行结果如下图:
在这里插入图片描述
可见在x4000处可以看到已经排好序的数据。
在这里插入图片描述
与此同时,在x4100和x4101处可见,有3人成绩为A,5人成绩为B。这个结果是符合客观实际的。

完整代码

;author: CAO-Wuhui
;date: 2021.5.17
;function: Sort students' grades
;
;
;
		.ORIG	x3000	;起始地址
;
;完成对原始数据的拷贝
;
		LD	R1	DATA	;R1指向源地址
		LD	R2	RESULT	;R2指向目的地址
		AND	R0	R0	#0	;R0长期指向目的地址
		ADD	R0	R0	R2		
		AND R3 R3 #0	
		ADD R3 R3 #1
		ADD R3 R3 #15	;R3 = 16,循环次数
;
;循环,do-loop结构,将输入数据拷贝到目的地址
;

INIT_LOOP	LDR	R4	R1	#0	;R4 = *R1
			STR R4	R2	#0	;*R2 = R4
;
			ADD	R1	R1	#1
			ADD R2	R2	#1
			ADD	R3	R3	#-1
			BRp	INIT_LOOP

;
;冒泡排序,双重循环均采用 jump-to-middle 结构
;

		AND	R1	R1	#0

		ADD	R1	R1	#1	;i = 1
		BRnzp MIDDLE1
LOOP1	AND	R2	R2	#0	;j = 0
		BRnzp	MIDDLE2	;

LOOP2	ADD	R3	R0	R2
		ADD	R4	R3	#1
		LDR	R5	R3	#0	;R5 <- *R3
		LDR	R6	R4	#0	;R6	<- *R4
		
		NOT	R7	R6
		ADD	R7	R7	#1
		ADD	R7	R7	R5
		BRzp	END2
;
;exchange arr[j] and arr[j + 1]
;
		STR	R5	R4	#0
		STR	R6	R3	#0

END2	ADD	R2	R2	#1
MIDDLE2	ADD	R3	R1	R2
		ADD	R3	R3	#-16
		BRn	LOOP2

		ADD	R1	R1	#1
MIDDLE1	ADD	R3	R1	#-16
		BRn	LOOP1

;
;排序结束
;以下开始筛选等级
;循环依旧采用 jump-to-middle 结构
;

		AND	R1	R1	#0	;i = 0
;
;初始化R6 = -85,R7 = -75
;
		LD	R6	A_GRADE	;
		LD	R7	B_GRADE	;
		NOT	R6	R6
		ADD	R6	R6	#1
		NOT	R7	R7
		ADD	R7	R7	#1
;
		AND	R2	R2	#0	;cntA = 0,A的人数
		AND	R3	R3	#0	;cntB = 0,B的人数
;
		BRnzp	MIDDLE3
LOOP3	ADD	R4	R1	#-4
		BRzp	IS_B
;
		ADD	R4	R0	R1	;R4 = arr[i]
		LDR	R4	R4	#0	;
		ADD	R5	R4	R6	;if
		BRn	IS_B
		ADD	R2	R2	#1	;cntA++
		BRnzp	NEXT
;
IS_B	ADD	R4	R0	R1	;R4 = arr[i]
		LDR	R4	R4	#0	;
		ADD	R5	R4	R7	;if
		BRn	NEXT
		ADD	R3	R3	#1	;cntB++
;		
NEXT	ADD	R1	R1	#1
MIDDLE3	ADD	R4	R1	#-8
		BRn	LOOP3
;
;最后将结果保存到指定位置
;
		LD	R1	A_CNT
		STR	R2	R1	#0
		LD	R1	B_CNT
		STR	R3	R1	#0
;
		HALT
;
DATA	.FILL	x3200
RESULT	.FILL	x4000
A_CNT	.FILL	x4100
B_CNT	.FILL	x4101
A_GRADE	.FILL	x0055		
B_GRADE	.FILL	x004B

.END 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/565821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分立元件】MOSFET如何用于同步整流

在电力电子中我们会使用二极管做开关,当二极管导时,相当于开关闭合,当二极管截止时,相当于开关断开。但是二极管在导通时的管压降在低压电源电路中是一个损耗来源,所以一般我们首选使用的是肖特基二极管,因为肖特基二极管的管压降比较低。 如下所示为非同步BUCK电源拓朴…

小黑坐等政审,论文成果毕业事项基本提交,着手眼睛手术明天准备体检然后出发独自夜爬华山的leetcode之旅:81. 搜索旋转排序数组 II

去除相等的二分法 class Solution:def search(self, nums: List[int], target: int) -> bool:# 数组长度n len(nums)# 双指针left 0right n-1# 二分法迭代while left < right:mid (left right) // 2if nums[mid] target:return Trueif nums[left] nums[mid]:left…

原来CSS的登录界面可以变得这么好看

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;几何小超 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目…

Python之将日志写入到文件(二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【MySQL 数据库】4、MySQL 事务学习

目录 一、事务简介二、事务相关 SQL 语句(1) 事务提交方式(2) 开启、提交、回滚事务 三、事务的四大特性四、并发事务问题五、事务的隔离级别 一、事务简介 二、事务相关 SQL 语句 (1) 事务提交方式 # 查看当前数据库事务的提交方式 # 1: 自动提交 # 0: 手动提交 select autoc…

解决:在单项目组件里面引入 base.scss/ base.less 等的外部文件不成功的问题

1、问题展示&#xff1a; 其一、问题描述&#xff1a; 在单文件组件里面使用封装在 base.scss 或 base.less 里面的样式用法一直不成功&#xff1b; 其二、代码&#xff1a; // 虽然已经标明了用的是 scss 的语法&#xff0c;但是页面调用 .scss 里的 style 样式还是不成功&a…

【Android学习】Android studio环境搭建-解决下载gradle慢加载mainfest.xml慢的问题

转载&#xff1a;https://blog.csdn.net/qq_31881469/article/details/78646406/ 目录 1、解决网络连接问题 &#xff08;1&#xff09;问题描述 &#xff08;2&#xff09;方法步骤 2、解决内存吃紧问题 &#xff08;1&#xff09;问题描述 &#xff08;2&#xff…

chatgpt赋能python:Python的SEO优化

Python的SEO优化 介绍 Python是一种高级编程语言&#xff0c;旨在提高开发人员的生产力和代码可读性。在过去的10年中&#xff0c;Python已迅速成为最受欢迎的编程语言之一&#xff0c;具有广泛的应用领域&#xff0c;包括数据科学、机器学习、人工智能、网络编程和Web开发。…

chatgpt赋能python:Python集合的差集

Python集合的差集 Python是一门强大的动态语言&#xff0c;不仅应用于广泛的领域&#xff0c;而且它还拥有非常丰富的数据结构。Python中的集合(set)是一种无序、不重复元素的结构&#xff0c;常用于去重&#xff0c;检查成员等操作。 在Python中&#xff0c;可以使用"-…

Java面试知识点(全)-分布式算法- ZAB算法

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 研究zookeeper时&#xff0c;必须要了解zk的选举和集群间个副本间的数据一致性。 什么是 ZAB 协议&#xff1f; ZAB 协议介绍 ZAB 协议全称&#xf…

docker安装mysql8.0.33

1 从docker仓库中拉去mysql 8.0 docker pull mysql:8.0如果使用 docker pull mysql 默认拉取的是最新版本的mysql 上面我拉去的是8.0的版本&#xff0c;最后拉取过来的是8.0.33 如果有想要指定的版本&#xff0c;可以直接写指定版本&#xff0c;如&#xff1a; docker pull my…

Python速查表;腾讯大佬的AIGC设计应用汇总;这个世界需要10亿开发者;67个最常用AI工具清单 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『一份必收藏的 Python 3 速查表』可运行代码中文注释 随着AIGC浪潮的兴起&#xff0c;越来越多小伙伴尝试着使用 GPT 类工具开发小程…

如何通过提高技能来克服 IT 技能差距

有时招聘很容易&#xff0c;你发布了职位描述&#xff0c;然后突然被热切的、合格的候选人淹没了。 特别是对于技术职位&#xff0c;招聘前景从未如此黯淡。谈论信息技术 (IT) 人才缺口是不可避免的&#xff0c;并且有充分的理由&#xff1a;根据研究&#xff0c;73% 的企业领…

chatgpt赋能python:Python%2:优化你的代码

Python %2&#xff1a;优化你的代码 Python是一门强大的编程语言&#xff0c;被广泛应用于数据分析、机器学习、Web开发等领域。在Python的语法中&#xff0c;有一个运算符%用于格式化字符串&#xff0c;在本篇文章中&#xff0c;我们将聚焦于%2的应用&#xff0c;以帮助读者优…

三层交换机

管理vlan 远程连接一个二层交换机&#xff0c;由于二层交换机不能配IP地址&#xff0c;所以我们使用SVI交换虚拟接口配置一个IP地址来远程连接二层交换机。svi接口可以配置ip地址&#xff0c;出厂存在mac地址&#xff0c;用于远程登陆管理该设备&#xff0c;该接口默认在vlan1…

如何在华为OD机试中获得满分?Java实现【最多提取子串数目】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 华为OD机试攻略&#xff1a;Java实现并讲解2022&2023真题 文章目录 1. 题目描述2. 输入描述…

配电室智能监控系统设计及实现分析

摘 要&#xff1a;配电室作为电网正常运行中的基础性设施&#xff0c;在信息化建设中处于信息交换管理的核心位置&#xff0c;这就要求配电室内所有设备须时时刻刻正常运转&#xff0c;一旦某台设备出现故障&#xff0c;对数据传输、存储及系统运行构成威胁&#xff0c;就会影…

代码随想录算法训练营第五十一天 | 买卖股票3

309.最佳买卖股票时机含冷冻期 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;动态规划来决定最佳时机&#xff0c;这次有冷冻期&#xff01;| LeetCode&#xff1a;309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili 状态&#xff1a;dp定义看的…

Microsoft Office 2019安装

哈喽&#xff0c;大家好。今天一起学习的是office2019的安装&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows 10 支持Win11安装&#xff0c;不支持Win7、XP系统 系统类型&#xff1a;64位 演示版本&#xff1a;cn_office_…

【C++】——动态内存管理

目录 &#x1f31e;导读 &#x1f314;C/C内存分布 &#x1f314;C内存管理方式 &#x1f317;new/delete操作内置类型 &#x1f317;new和delete的使用方法 &#x1f314;operator new与operator delete函数 &#x1f314;new和delete的实现原理 &#x1f317;内置…