实验-实现向量点积-RISC-V(计算机组成原理)

news2025/5/18 21:27:05

目录

一、实验内容

二、实验步骤

三、源代码

四、实现效果

五、实验环境

六、实验小结与思考


一、实验内容

首先,我们用一个简单的“向量点积”运算作为热身。你将拿到一个不完整的汇编代码“task2-向量点积”,我们的目标是按照C语言描述的功能:

并在相应的地方补充完整汇编代码。

二、实验步骤

(1)首先我们在dot_product标签下面,根据提示,写入我们的代码。

(2)如果计数器为0,则结束循环:在这里我们需要用到比较相等则跳转的操作码beq。t3寄存器中保存着向量长度n的数值,在向量A、B的值还没读取完成时,(即n还没变成0时),都要在循环内部。 beq t3, x0, finish;表示如果t3寄存器里的数据为0,则跳转到finish标签。

(3)然后我们用lw操作码,将t1中的第一个数据(向量A的第一个数据)加载到t4寄存器中。将t2中的第一个数据(向量B的第一个数据)加载到t5寄存器中。

(4)用mul操作码将t4和t5中的数据保存到t6中。

(5)将t0的值与t6相加,传给t0。

(6)将t1和t2的值自加4,使得更新为A、B的下一元素。

(7)t3减一(n减一)

(8)跳回循环开始

三、源代码

# 样例代码说明:完成两个向量的点积
#
# 该样例代码完成的功能为:
# int dotProduct(int n, int vecA[], int vecB[]) {
#     int sum = 0;
#     for (int i = 0; i < n; i++) {
#         sum += vecA[i] * vecB[i];
#     }
#     return sum;
# }

.data
vecA: .word 1, 2, 3, 4, 5, 6 # 定义向量A
vecB: .word 8, 7, 6, 5, 4, 3 # 定义向量B
n: .word 6 # 向量的长度
C: .space 4                        # 地址C存放向量点积的结果

.text
main:
    add t0, x0, x0 # 初始化点积结果 sum = 0
    la t1, vecA # 加载向量A的地址
    la t2, vecB # 加载向量B的地址
    la t3, n # 加载n的地址
    la a3, C    # 将变量C的地址保存在 a3 寄存器当中
    lw t3, 0(t3) # 获取向量的长度 n

dot_product:
    beq t3, x0, finish             # 如果计数器为0,则结束循环
	lw t4, 0(t1)  			 # 加载vecA的当前元素
	lw t5, 0(t2)			 # 加载vecB的当前元素
	mul t6, t4, t5			 # 计算当前元素的乘积
	add t0, t0, t6 			 # 将乘积累加到结果中
	addi t1, t1, 4			 # 更新vecA的地址,指向下一个元素
	addi t2, t2, 4			 # 更新vecB的地址,指向下一个元素
	addi t3,t3,-1			 # 递减计数器
	j dot_product			 # 跳回循环开始

finish:
    		# 将c的值存至存储器中
    #下面是打印输出代码,如果你使用的寄存器不一样,需要根据实际情况改变
    addi a0, x0, 1 # 设置ecall参数,执行打印整数
    addi a1, t0, 0 # 设置要打印的整数值
    ecall # 打印整数 ecall
    addi a0, x0, 10 # 设置ecall参数,执行终止程序
    ecall # 终止程序 ecall

四、实现效果

五、实验环境

Venus仿真器(https://venus.cs61c.org/)

六、实验小结与思考

1.问题与解决

        问题:循环条件设置错误,导致程序无法正常终止

        解决:改用beq指令判断计数器是否为0,确保循环正确退出

2.主要收获

        通过本次实验,我深刻体会到规范编码的重要性。例如,在循环体和跳转标签处添加详细注释,便于后续调试和修改。此外,遵循寄存器使用规范(如t0-t6用于临时存储,a0-a3用于参数传递)使程序逻辑更清晰。

        掌握RISC-V循环与数组访问实现

        理解高级语言到汇编的转换逻辑

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

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

相关文章

描述性统计工具 - AxureMost 落葵网

描述性统计工具是用于汇总和分析数据&#xff0c;以更好地了解数据特征的工具1。以下是一些常见的描述性统计工具简介&#xff1a; 描述性统计工具 Excel 基本统计函数&#xff1a;提供了丰富的函数用于计算描述性统计量。例如&#xff0c;AVERAGE 函数用于计算平均值&#xf…

麒麟桌面系统文件保险箱快捷访问指南:让重要文件夹一键直达桌面!

往期文章链接&#xff1a;统信操作系统自定义快捷键配置音量调节功能指南 Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟桌面操作系统上配置文件保险箱内文件夹桌面快捷方式的文章&#xff0c;欢迎大家分享点赞&#xff0c;点个在看和关注吧&#xff01;在日常…

从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区

目录 前言 一、从硬件角度理解"Linux下一切皆文件" 从理解硬件是种“文件”到其他系统资源的抽象 二、缓冲区 1.缓冲区介绍 2.缓冲区的刷新策略 3.用户级缓冲区 这个用户级缓冲区在哪呢&#xff1f; 解释关于fork再加重定向“>”后数据会打印两份的原因 4.内核缓冲…

游戏站的几种形式

游戏站点的主要形式&#xff1a;单品游戏站、游戏盒子站与单类型游戏盒子站 随着互联网的普及和游戏产业的快速发展&#xff0c;游戏站点作为玩家获取游戏资源和信息的重要平台&#xff0c;呈现出多种形式。本文将分析三种常见的游戏站点形式&#xff1a;单品游戏站、游戏盒子站…

打造智能化军工软件工厂,破解版本管理难题

在数字化浪潮席卷全球的当下&#xff0c;军工行业正经历着前所未有的软件工业化转型。作为这一进程的核心支撑&#xff0c;软件工厂模式正在重塑军工领域的研发体系。然而&#xff0c;传统版本管理方式已难以适应现代军工软件研发的复杂需求&#xff0c;成为制约行业发展的关键…

SpringbBoot nginx代理获取用户真实IP

为了演示多级代理场景&#xff0c;我们分配了以下服务器资源&#xff1a; 10.1.9.98&#xff1a;充当客户端10.0.3.137&#xff1a;一级代理10.0.4.105&#xff1a;二级代理10.0.4.129&#xff1a;三级代理10.0.4.120&#xff1a;服务器端 各级代理配置 以下是各级代理的基本配…

allure报告自定义logo和名称

根据pytest框架&#xff0c;做自动化测试的时候&#xff0c;选择的是allure测试报告&#xff0c;这个报告是目前所有报告中功能最强大最好用的测试报告之一 我们在使用这个测试报告的时候&#xff0c;怎么样去把allure的logo和名称替换成自己公司或者自己的logo呢&#xff1f;…

【AI论文】对抗性后期训练快速文本到音频生成

摘要&#xff1a;文本到音频系统虽然性能不断提高&#xff0c;但在推理时速度很慢&#xff0c;因此对于许多创意应用来说&#xff0c;它们的延迟是不切实际的。 我们提出了对抗相对对比&#xff08;ARC&#xff09;后训练&#xff0c;这是第一个不基于蒸馏的扩散/流模型的对抗加…

测试工程师如何学会Kubernetes(k8s)容器知识

Kubernetes(K8s)作为云原生时代的关键技术之一&#xff0c;对于运维工程师、开发工程师以及测试工程师来说&#xff0c;都是一门需要掌握的重要技术。作为一名软件测试工程师&#xff0c;学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程…

遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1542 标注数量(xml文件个数)&#xff1a;1542 标注数量(txt文件个数)&#xff1a;1542 …

每日Prompt:迷你 3D 建筑

提示词 3D Q版迷你风格&#xff0c;一个充满奇趣的迷你星巴克咖啡馆&#xff0c;外观就像一个巨大的外带咖啡杯&#xff0c;还有盖子和吸管。建筑共两层&#xff0c;大大的玻璃窗清晰地展示出内部温馨而精致的设计&#xff1a;木质的家具、温暖的灯光以及忙碌的咖啡师们。街道…

el-breadcrumb 面包屑第一项后面怎么写没有分隔符

<el-breadcrumb separator"/"><el-breadcrumb-item>当前位置&#xff1a;</el-breadcrumb-item><el-breadcrumb-item :to"{ path: / }">首页</el-breadcrumb-item><el-breadcrumb-item><a href"/">活…

MYSQL 高可用

目录 一 什么是MYSQL高可用 1.1 什么是MySQL高可用 1.2方案组成 1.3 优势 2.1 案例环境 二 案例实施 1.安装mysql数据库 &#xff08;1 基础环境 &#xff08;2二进制安装进行bash (3 设置配置文件 MYSQL 的配置文件跟上面编译安装的配置文件类似 &#xff08;4. 配…

【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战

目录 1 背景介绍 2 CDC的实现原理 3 DRS的CDC实现方式 4 DRS的CDC使用介绍 5 总结 1 背景介绍 随着国内各大行业数字化转型的加速&#xff0c;客户的数据同步需求越来越复杂。特别是当需要将一个源数据库的数据同时迁移到不同的目标库场景时&#xff0c;华为云通常会创建…

HoloTime:从一张图片生成可交互的4D虚拟世界——突破静态生成模型,重构VR/AR内容生产范式

引言:静态生成模型的局限与HoloTime的突破 在空间智能与虚拟内容生成领域,传统生成模型(如扩散模型)面临两大瓶颈: 静态输出:仅能生成固定视角的3D场景或局部物体动画。沉浸感缺失:无法构建用户可“走进去”的动态4D空间(时间+空间)。HoloTime 通过“图像→全景视频→…

【深度学习】#11 优化算法

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 深度学习中的优化挑战局部极小值鞍点梯度消失 凸性凸集凸函数 梯度下降一维梯度下降学习率局部极小值 多元梯度下降 随机梯度下降随机梯度更新动态学习率…

根据台账批量制作个人表

1. 前期材料准备 1&#xff09;要有 人员总的信息台账 2&#xff09;要有 个人明白卡模板 2. 开始操作 1&#xff09;打开 人员总的信息台账&#xff0c;选择所需要的数据模块&#xff1b; 2&#xff09;点击插入&#xff0c;选择数据透视表&#xff0c;按流程操作&…

LocaleContextResolver实现多语言切换-笔记

1. LocaleContextResolver功能简介 org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale&#xff08;语言环境&#xff09; 的核心接口。 //LocaleContextResolver 接口定义 public interface LocaleContextResolver extends L…

Zephyr OS Nordic芯片的Flash 操作

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…

uv python 卸载

又是查了半天 官网wiki没有 网上一堆傻子胡说 uv提示也不对 AI还在这尼玛胡编乱造 开始 我原来装了这几个环境 uv python list 现在python3.7.7不需要了&#xff0c;卸载&#xff0c;直接 uv python uninstall 3.7.7 去找你自己要卸载的版本号&#xff0c;不需要整个包名复制…