MIPS整数指令实现浮点运算

news2024/11/28 16:34:18

OVERVIEW

实现上,我采用了空间换时间和实现复杂度的这么一个tradeoff。把每个部分都用一个word来存,这样读取就只要lw就行了,如果到bit级别的话,可能跨越多个byte或者word,那么 我就需要到内存或者cache里面读取更多次,性能就不高了,而且每次移动来移动去的也很烦,所以采用了下面这样的存储方式。

加法和减法运算

我们要先输入,然后把输入的两个浮点数的各个部分,记录到这个value里面,然后把这个value,再转化成两个number来存储,加减法都要指数位对齐(在MIPS中,做加法运算时需要先对齐操作数的指数,与指数大的操作数的小数点对齐,然后再进行加法运算。这个过程称为浮点数规格化,可以保证两个操作数的尾数部分都在相同的位数上进行运算)。然后取符号位来判断,因为我们最后要确定这个浮点数的答案符号,所以我们比较大小,对于减法运算同理。

 

 乘法和除法运算

我的实现是把指数相加,然后有效数相乘,因为我们的有效数只有23位,但是两个整数相乘要hi lo,两个register,因为精度问题,我们只要高位的hi,

  1. 通过jal指令调用in_put函数从键盘输入两个浮点数,并将它们以IEEE 754的二进制表示转换后存储在内存中。
  2. 通过jal指令调用input_change_to_value函数将两个浮点数的符号,指数和尾数分别提取出来存储在内存中。
  3. 通过jal指令调用value_change_to_number函数将两个浮点数的指数与尾数转化为有效值(尾数+隐含前导1)与指数(Exp-127)并分别存储在指定的内存位置中。
  4. 依次从内存中加载第一个数的有效值、第二个数的有效值、第一个数的指数、第二个数的指数和两个数的符号位。通过判断除数是否为0来决定程序执行流程。
  5. 对两个数的指数进行比较,如果第一个数的指数大于等于第二个数的指数,则执行dividegreater操作,否则执行dividelower操作。
  6. dividegreater操作使用相减的方法计算出商的有效值并将其存储在t8寄存器中,同时t8寄存器中,同时t8对应的位置置1,计数变量$t5加1。
  7. dividelower操作将第一个数左移1位,t8左移1位,计数变量t8左移1位,计数变量t5加1。
  8. 通过比较t5和24的大小来决定是否退出循环。如果t5和24的大小来决定是否退出循环。如果t5小于24,则返回到步骤5继续执行,否则跳转到dividebreakout。
  9. 将计算出的商的有效值存储在指定的内存位置中,并将商的指数计算出来存储在内存中。
  10. 如果两个数的符号相同,则将结果的符号位设为正;否则设为负。
  11. 跳转到add_or_sub_output函数对结果进行输出。   

MIPS 汇编代码,包含三个函数 decimalbinaryhexadecimal,分别用于将输入的二进制浮点数转换为十进制、二进制和十六进制格式输出。

 

decimal 函数从内存中读取一个 32 位 IEEE754 格式的浮点数,将其转换为十进制格式并输出。具体实现方法是将读取到的浮点数加载到协处理器1的寄存器 f12 中(这里使用了 MIPS 架构的协处理器1,它用于浮点运算),然后使用系统调用 `syscall` 和 `f12中(这里使用了MIPS架构的协处理器1,它用于浮点运算),然后使用系统调用‘syscall‘和‘v0` 寄存器指定的输出函数来输出 $f12 寄存器中的浮点数。

binary 函数同样从内存中读取一个 32 位 IEEE754 格式的浮点数,并将其转换为二进制格式输出。具体实现方法是利用二进制的性质,从浮点数的头部开始逐位取出二进制数,并将其转换为字符输出。循环次数为32次(因为一个32位的二进制数有32位)。在循环中,首先从内存中读取浮点数,然后利用掩码和移位操作将浮点数的头部四位取出来,保存到寄存器 $t1 中;接着将浮点数的头部截去四位,以便下一轮循环中取出下一个二进制位。然后,将 $t1 中的值转换成字符输出。如果 $t1 大于 9,则需要将其转换为 A~F 中的一个字符。

hexadecimal 函数从内存中读取一个 32 位 IEEE754 格式的浮点数,并将其转换为十六进制格式输出。具体实现方法类似于 binary 函数,不同之处在于每次循环中取出的是 4 个二进制位,对应于一个十六进制数字。然后将这个数字转换成字符输出。如果数字大于 9,则需要将其转换为 A~F 中的一个字符

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

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

相关文章

零售行业如何进行活动前的准备工作

新钛云服已累计为您分享743篇技术干货 背景 零售行业通常会面临618、双十一、周年庆等活动。在面对这些重要的活动通常会担心资源是否需要扩容?应用能否抗住大并发的请求? 本人曾面对过几千大并发请求和客户这边搞活动出现问题的经验教训。希望能通过这些…

安装多个NodeJS windows上安装多个Nodejs版本 解决vue2/vue3同时运行

第一步下载nvm-windowsnvm-windows 下载地址:Github最新下载地址 进入之后直接下载 第二步 安装NVM 注意路径一定不要包含空格 中文否则会报错 点击安装之后 如果之前安装了nodejs的话会提示 希望nvm管理已安装node 版本吗 点击 是 即可 安装完成后 打开 cmd 输入 n…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(五)

如表1所示是dds_ip_transform模块信号列表,在正弦波模块中我们需要把上游指令解析模块中发来的频率控制字和指示信号即dds_din_freq和dds_din_freq_vld、相位控制字和指示信号即dds_din_phase和dds_din_phase_vld、复位信号即ddsip_sclr写入到DDS IP核中&#xff0c…

【数据库】增删改查(进阶)

目录 1、数据库的约束类型 1.1、not noll约束 1.2、unique(唯一性约束) 1.3、default默认值约束 1.4、primary key(主键约束) 1.4.1、自增主键(关键字auto_increment) 1.5、foreign key (外…

2023-Hive必备详细教程

Hive涉及的知识点如下图所示,本文将逐一讲解: 一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务…

【 Spark编程基础 】实验3

准备工作 启动Hadoop集群 & Spark • 启动Hadoop集群start-all.sh • 启动Sparkcd /usr/local/spark/spark-2.3.3-bin-hadoop2.6/# ./sbin/start-all.sh 实验数据说明。 • 数据为1970年到2016年,每年各球队的球员比赛数据统计,数据文件的格式如图1所…

数据治理-数据质量篇

1、什么是数据质量 按照国际数据管理协会的《数据管理知识手册》中规定,数据质量(DQ)是“既指与数据有关的特征,也指用于衡量或改进数据质量的过程。”但要深入理解数据质量,需要切分不同层次或维度。 数据无处不在。…

一种用于地灾边坡大坝安全深度位移监测测斜仪

1用途 固定测斜仪广泛适用于测量土石坝、面板坝、岩土边坡、路堤、基坑、岩石边坡等结构物的水平位移、垂直沉降及滑坡,固定测斜仪配合测斜管可反复使用,并方便实现测量数据的自动采集。 固定测斜仪采用的是耐冲击型倾斜传感器,可靠性好&am…

【可解释AI】图神经网络的可解释性方法及GNNexplainer代码示例

图神经网络的可解释性方法及GNNexplainer代码示例 GNNExplainerIntroductionModelSingle-instance explanations(Explanation via Structural Information)Joint learning of graph structural and node feature information(Explanation via…

Linux常用命令——ip6tables命令

在线Linux命令查询工具 ip6tables linux中防火墙软件 补充说明 ip6tables命令和iptables一样&#xff0c;都是linux中防火墙软件&#xff0c;不同的是ip6tables采用的TCP/ip协议为IPv6。 语法 ip6tables(选项)选项 -t<表>&#xff1a;指定要操纵的表&#xff1b; …

Code area 和Data area的区别

Code Area FLASH &#xff1a;程序在这个flash运行时&#xff0c;几乎没有延时&#xff0c; 运行速度以时钟设置为准。 Data Area FLASH&#xff1a; 程序在这段flash运行时&#xff0c;每条语句都有延时&#xff0c; 最后的速度可能是以10M为时钟&#xff08;举例&#xff09;…

webpack4和webpack5有什么区别

webpack4和webpack5有什么区别 前言一、比较二、使用步骤1.5缓存使用方法和构建速度对比2.资源模块处理3.Webpack 5 支持在请求中处理协议。4.tree-shaking。 前言 Webpack4和Webpack5是两个版本的Webpack&#xff0c;其中Webpack5是Webpack的最新版本。 一、比较 性能&#…

一、Go语言初识

在日新月异的技术进步中,我们程序设计在不断的优化,程序的编译速度,程序的设计速度,程序的可读性等都在不断的提升。在这样的时代背景下,一些技术的先驱,技术的头部公司在不断的探索,GO语言就是在这样的环境中被设计开发的。 我们技术团队也在不断的学习,不断的进步,…

golang入门记录

参考&#xff1a; https://www.runoob.com/go/go-tutorial.html https://zhuanlan.zhihu.com/p/63310903 下载安装包&#xff1a; windows:https://dl.google.com/go/go1.20.2.windows-amd64.msi 对基础设施&#xff0c;包括跨操作系统、网络、多线程&#xff0c;web、cli都比…

OpenCV EigenFaceRecognizer 人脸识别

目录 一、人脸检测vs人脸识别 二、数据库 三、准备需要识别的人脸 四、人脸识别(OpenCV) 一、人脸检测vs人脸识别 人脸检测只是需要检测图像中是否有人脸&#xff0c;而人脸识别是一个程序能够识别出给定图像或者视频中的人脸。 二、数据库 人脸数据库&#xff0c;这个博客…

大数据之Hadoop分布式数据仓库HBase

目录&#xff1a; 一、Hadoop的局限二、HBase简介三、HBase Table四、数据的读写流程简述五、HBase Java API 1.0 的基本使用六、HBase Java API 2.0 的基本使用七、正确连接Hbase八、Hbase 常用 Shell 命令九、Hbase容灾与备份十、引入Phoenix core JAR包&#xff08;HBase中间…

好用免费的电脑摄像头录视频软件分享!

案例&#xff1a;如何录制电脑的摄像头&#xff1f; 【这周我需要开一个视频会议&#xff0c;会议十分重要&#xff0c;我希望把它录制下来。有没有小伙伴知道&#xff0c;电脑摄像头如何录制&#xff1f;求一个可以快速上手的方法&#xff01;】 在现如今的数字化时代&#…

计算机网络学习03(OSI、TCP/IP网络分层模型详解))

1、OSI 七层模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能&#xff0…

【小程序】图文教程:完整说明如何把小程序代码提交到gitee上

目录 建项目本地打开配置远程分支发布到远程分支检验后续提交 建项目 注*&#xff1a;会在gitee上建项目的可以略过 进入到gitee官网&#xff0c;点击右侧的&#xff0c;创建新项目 进入到该页面&#xff1a; 填好之后&#xff0c;点击创建 进入下面页面&#xff0c;点击初…

用GPT 从0搭建 Jest 到帮写测试用例

本文作者为 360 数据平台部前端开发工程师 为什么要用AI写单测 这个问题分两点来说&#xff0c;第一是为什么要写单测&#xff0c;第二是为什么要用AI。 先来说为什么写单测&#xff0c;这很简单&#xff0c;我们项目或者说我们前端团队有公共模块&#xff0c;包含有组件类型、…