如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?

2024-02-16

好吧,问题就在这里。我必须编写一个 MIPS 程序,从用户那里获取 2 个输入数字。然后,我必须编写一个代码来输出用户输入的 2 个数字的乘积、商和余数。

现在,这非常简单。但是,我没有意识到我们不能在程序中使用乘法和除法操作数。现在我不知道该怎么做,因为我很困惑如何在没有乘法和除法操作数的情况下做到这一点。我在整个程序中只使用了两次,它工作得很好,但我的教授不会接受它,现在我很难过。任何帮助,将不胜感激。谢谢

这是我的代码

# Given positive integers a and b, output a/b and a%b.
  .data
str1: .asciiz "Enter a: "
str2: .asciiz "Enter b: "
str3: .asciiz "a/b = "
str4: .asciiz "a%b = "
str5: .asciiz "a*b = "
newline: .asciiz "\n"
  .text

main: li   $v0, 4            # system call code for print_string
  la   $a0, str1         # address of str1
  syscall                # print str1

#get the first number from user, put it into $s0

li   $v0, 5            # system call code for read_int
  syscall                # read an integer into $v0 from console
  add  $s0, $v0, $zero   # copy $v0 into $s0 (a)


#read print_string for str2
li   $v0, 4            # system call code for print_string
  la   $a0, str2         # address of str1
  syscall                # print str1

# get second number from user, put it into $t1  
li  $v0, 5      #load syscall for read_int
syscall         #make the syscall
move $s1, $v0       #move the number read into $s1(b)

#DO THE CALCULATIONS................................................
div $s0, $s1        #diving $s0 by $s1
mflo    $t0         #storing value of lo(quotient) in
                #register $t0
mfhi    $t1         #storing value of hi(remainder) in
                #register $t1

mult $s0, $s1
mflo $t2


li $v0,1
move $a0, $t2
syscall

li $v0,4
la $a0, str5
syscall

#read print_string for str3
li   $v0, 4            # system call code for print_string
  la   $a0, str3         # address of str1
  syscall                # print str1   

#print a/b
li  $v0, 1      #load syscall print_int into $v0
move $a0, $t0      #move the number to print into $t2
syscall
# read print string for str4
li $v0, 4
    la $a0, str4
    syscall
# print remainder
li $v0, 1
move $a0, $t1
syscall

#end of program
li  $v0, 10     #system call code for exit
syscall

您正在寻找的是按位乘法/除法。

我不确定我是否可以简洁地总结它,但这里我举一个例子:

乘法

假设您希望将数字 6 乘以数字 5。
如果 a = 数字 6,则(以简化的 8 位表示)为:
a=00000110

如果 b = 数字 5,则(以简化的 8 位表示)为:
b=00000101

要将这些数字相乘,您需要将数字下方最接近的二的倍数移位,然后相加。

例如5以下2的最接近倍数是4,也就是说是2^2;
所以我们按位左移a(数字6)2次:
a << 2
现在这使得它00011000

这意味着我们现在已经乘以 4;现在将其乘以 5,我们只需添加a再次:

     00011000  
    +00000110  
    =00011110  
    =30 (base 10)

也就是6*5。

让我们用 12*11 再试一次 11 以下最接近的 2 的倍数是 8 (2^3)。这意味着我们需要将数字 12 按位移位 3 次,然后再将其与自身相加 3 次。

    00001100 = 12
    //Let's bitshift by 3
    01100000 = 96
    //Let's add 12 3 times
    01100000
   +00001100
   =01101100 = 108
   +00001100
   =01111000 = 120
   +00001100
   =10000100 = 132 = 12*11

划分

12除以11,则相反;从 132 减去 12 3 次,然后向右移位 3 次(除以 8)

相关资源

这是我此刻能做的最好的事情了;如果你想要更多,以及 C 语言的相关算法,请看一下http://www.programmersheaven.com/mb/CandCPP/295363/295363/bitwise-multiplication--division/ http://www.programmersheaven.com/mb/CandCPP/295363/295363/bitwise-multiplication--division/

如果您想扩展此答案中的任何一个,请在下面评论;

附:我已经向您展示了两个带有质数的示例(令人讨厌),但是如果您得到像 12 这样的数字怎么办? 从逻辑上讲,根据我所说的,最接近的 2 的倍数是 8 (2^3),因此您必须向左移位 3,然后将 12 添加到该数字 4 次。

但如果你算一下,你会发现 12 实际上 = (2^3 + 2^2)...这意味着你可以得到 (12

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法? 的相关文章

  • 我们什么时候需要 MIPS 中的 $v1?

    我们都知道 通常一个程序只会返回一个值 但我注意到我们有两个返回值的寄存器 v0 and v1在MIPS中 我见过的代码都只有 v0 but v1 并且我还没有找到任何使用的汇编语言示例代码 v1 谁能告诉我为什么我们在 MIPS 中有两个
  • MIPS if-else 与打印问题

    我正在编写一个程序来确定整数是偶数还是奇数 该程序首先询问用户一个整数 并根据该整数是什么来打印 偶数 和 奇数 我在创建 If else 语句时遇到问题 语句应该是 如果 t2 t0 输出 Odd 否则 输出 Even 这是我现在不起作用
  • 无效的程序计数器值:0

    我目前正在 MIPS 处理器下使用汇编语言 我现在在 使用 MARS 模拟器 由于未知的原因 我每次运行后都会收到以下错误消息 Go 运行 try s 错误 无效的程序计数器值 0 Go 执行因错误而终止 我收到此错误消息 与我正在使用的代
  • MIPS32 路由器:内核模块未调用 module_init

    我正在开发一个要在路由器上运行的内核模块 路由器型号为 Netgear 的 DGN2200v2 它在 MIPS 上运行 Linux 2 6 30 我的问题是 当我加载模块时 似乎我的module init没有接到电话 我试图通过修改我的mo
  • 轮询 I/O (MIPS)

    我正在尝试在 MIPS 中编写一个程序 该程序使用轮询从键盘读取字符 然后使用内置键盘和显示器 MMIO 模拟器显示它 不幸的是 我无法理解所使用的寄存器和控制位背后的概念 但一直试图从在线示例中找出答案 这是我到目前为止所写的内容 dat
  • MIPS 汇编中的奇怪跳跃

    我可能在这里遗漏了一些非常明显的东西 但我已经一遍又一遍地讨论这个问题 而且我肯定被困住了 在下面的代码中 8仅当以下情况时才会递增 2 0 现在我仔细检查了两次和三次beq指令有效 例如 如果我将 lop 更改为 end2 它就会转到那里
  • 为 MIPS 编译 Linux 内核 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一台 32 位 MIPS 机器 想在上面运行 Linux 我需要使用我的 Windows 7 机器将 Linux 交叉编译为 MIPS 我对如何解决这个问题感到困惑 有人可以
  • 使用 MIPS 汇编中的逻辑移位乘以 2 的幂

    有人可以指导我如何在 MIPS 汇编中使用移位来制作乘法代码吗 我不明白数字 2 n 如何帮助我使用奇数被乘数进行乘法 我目前有这段代码 我正在尝试制作一个计算器 text li v0 4 la a0 ask 1 syscall li v0
  • 加载词和移动之间的区别?

    有什么区别 ldw r8 0 r4 and mov r8 r4 Load word 说 从内存复制 但是当 load word 从 r4 复制时 它是从寄存器复制而不是从内存复制 对吧 The lw instruction I assume
  • 同时读取和写入寄存器

    我计划在 FPGA 上用 VHDL 设计一个类似 MIPS 的 CPU CPU 将具有经典的五级管道 没有转发和危险预防 在计算机体系结构课程中 我了解到第一个 MIPS CPU 用于在时钟上升沿读取寄存器文件并在时钟下降沿写入 我使用的F
  • MIPS汇编中$是什么意思?

    什么是 在 MIPS 汇编语言中是什么意思 举个例子 Add 28 R4 R3 表达式中的美元符号是什么 在汇编程序中 符号 通常表示两种不同的含义 数字前缀表示该数字以十六进制书写 本身是一个数值表达式 其计算结果为 当前位置 即组装下一
  • MIPS:将 BEQ 计算为十六进制机器代码

    我有一个作业 必须将 MIPS 指令转换为其十六进制机器代码 我知道如何转换 add addi lw 等指令 但是当它转换为 beq 之类的指令时 我感到困惑 我如何将这个 beq 转换为十六进制 0x00400108 beq t3 t5
  • 提示用户输入汇编 ci20 seg 错误

    我目前正在 ci20 机器上开发一个小程序 提示用户输入整数值 然后将该值打印到屏幕上 我当前的代码 data prompt asciiz Please enter an integer message asciiz nValue ente
  • 是否可以将 MIPS 寄存器名称与 GAS(GNU 汇编器)一起使用?

    如果我使用寄存器名称 我会得到 Error illegal operands add t0 zero zero 如果我使用寄存器号 8代替 t0 and 0代替 zero 有用 我使用的是 binutils 2 17 GNU 汇编器不直接支
  • 如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?

    好吧 问题就在这里 我必须编写一个 MIPS 程序 从用户那里获取 2 个输入数字 然后 我必须编写一个代码来输出用户输入的 2 个数字的乘积 商和余数 现在 这非常简单 但是 我没有意识到我们不能在程序中使用乘法和除法操作数 现在我不知道
  • 为什么 MIPS 中 bgezal 和 bltzal 是基本指令而不是伪指令?

    根据这个MIPS指令参考 http www weblearn hs bremen de risse RST docs MIPS mips isa pdf 有两条指令 bgezal and bltzal 如果分支被采用 则执行相对跳转和链接
  • 如何使用 MPLAB X 中的 mips 汇编为每个宏调用创建唯一的标签

    我有一个执行比较的宏 如果比较不正确 则跳转到宏的末尾 这是一个简化的示例 macro do work if value not zero value li s0 value bne s0 zero exit label nop Do wo
  • 结构中的位是否得到保证

    我有一个与结构位字段相关的问题 请参阅下文 因为我对应该使用哪些关键字来最好地描述我的问题有点无能为力 背景 我正在为 MIPS R3000A 汇编指令编写一个反汇编程序 该指令在 2000 年初用于 Playstation 程序 问题 我
  • 为什么MIPS中内存地址加4?

    如果某些内容存储在 0x1001 0000 处 则下一个内容将存储在 0x1001 0004 处 如果我是正确的 32 位架构中的内存块每个都是 32 位 那么0x1001 0002会指向32位的后半部分吗 首先 MIPS 架构中的内存地址
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无

随机推荐

  • 如何在另一个项目中包含 Web 参考端点配置

    我有 2 个项目 X 和 Y Y 调用 Web 服务 配置在 Y 的 app config 它是一个 DLL 中定义 当 X 调用 Y 方法时 出现以下异常 System InvalidOperationException Could no
  • 如何获取HTA窗口的大小?

    您可以设置 HTA 窗口的大小 但我找不到获取其大小的方法 我所能想到的就是读书document body offsetWidth and offsetHeight 但这些给你的是视口大小而不是实际的窗口大小 有可能知道吗 似乎没有属性或方
  • 退出临界区

    考虑多个线程同时执行以下代码 long gf 0 global variable or class member if InterlockedCompareExchange gf 1 0 0 lock cmpxchg some exclus
  • 重写 JS 中的赋值运算符

    var myObject myKey myValue typeof myObject myKey returns string myObject myKey newValue console log myObject myKey print
  • 如何在Python 3.x中强制输入整数? [复制]

    这个问题在这里已经有答案了 我正在尝试用 Python 编写一个程序 该程序接受输入以重复斐波那契数列的次数 i 1 timeNum input How many times do you want to repeat the sequen
  • 用 C++ 读/写设备

    如何用 C 读取 写入设备 该设备位于 dev ttyPA1 我考虑过 fstream 但我不知道设备是否具有我可以在不阻塞应用程序的情况下读取的输出 我的目标是创建一个应用程序 您可以在终端中写入一些内容 然后将其发送到 dev ttyP
  • 简单 SparkSQL 查询中未修剪分区

    我正在尝试从 SparkSQL 表 S3 中的 parquet 有效地选择各个分区 但是 我看到 Spark 打开表中所有 parquet 文件的证据 而不仅仅是那些通过过滤器的文件 对于具有大量分区的表来说 即使是小型查询也会变得昂贵 这
  • IOS Swift - 无法从地址簿中检索个人笔记

    有人有什么建议为什么我可以获得名字 姓氏和生日 但是我无法检索从 iphone 通讯录中提交的笔记吗 准备工作 已授予地址簿访问权限 添加到地址簿中的人员包含所有字段 包括注释 当前结果 nil 仅用于注释 所有其他字段均已正确检索 使用的
  • Firebase 中如何计算连接

    连接数是如何计算的 假设我有一个 Web 应用程序 其中一个负载会向所有连接的客户端发送一条消息 假设我有 5 个连接的客户端 这是否意味着只要打开了 Web 应用程序的浏览器选项卡 它就会计为 1 个连接 这意味着我将有 6 个并发连接
  • 无法从groovy连接到oracle数据库

    您好 我无法连接到 groovy 中的 Oracle 数据库 我在 groovy 控制台中使用了以下代码 但出现以下编译错误 unable to resolve class oracle jdbc driver OracleTypes at
  • 找不到 ViewModel 的视图

    我有一个使用 Caliburn Micro 的 wpf 应用程序 我有一个视图 MyView
  • Python:没有名为“dash.development”的模块。 “dash”不是一个包

    我正在尝试运行这个 Dash 教程https github com cryptopotluck alpha vantage tutorial tree master dash bootstrap https github com crypt
  • R:如何相对于 x 轴分散(抖动)点?

    我在 R 中有以下代码片段 dat lt data frame cond factor rep A 10 rating c 1 2 3 4 6 6 7 8 9 10 ggplot dat aes x cond y rating geom b
  • 无法在 Visual Studio 2013 中显示 SQL Azure 表定义

    我收到的错误是 加载问题 设计器在加载表定义时遇到错误 我可以很好地查看VS内表中的数据 甚至还可以查询数据 这是我的计算机上的全新安装 我尝试过的 尝试在 服务器资源管理器 和 SQL Server 对象资源管理器 检查我的登录凭据是否有
  • 我应该使用什么标记来描述使用 schema.org 的社交媒体链接?

    我有一个地方 本地企业 其中有多个字段可以很好地映射到 schema org 条目 有一个字段我不确定如何标记 我们有该企业社交媒体帐户的链接 例如 Twitter 帐户 Facebook 页面和 Pinterest 帐户 这些应该如何在
  • Django:ModelChoiceField 删除默认--------- 选择

    如何从 ModelChoiceField 中删除默认的 选择 Use empty label None field2 forms ModelChoiceField queryset empty label None 请检查文档模型选择字段
  • 如何使用 SFINAE 检测 noexcept 方法

    我问的是一个 流行 问题的变体 检测类方法的存在 我在 SO 中读过很多答案 大多数 C 17 后 解决方案看起来像this https stackoverflow com questions 55191505 c compile time
  • 分发依赖于静态框架的动态框架的正确方法是什么?

    我正在构建一个闭源动态框架 它依赖于第三方闭源静态框架 我将静态依赖框架链接到我的框架的项目 目标 如中所述这个苹果技术说明 https developer apple com library content technotes tn243
  • 如何使用 RestClient 修复 Ruby 中的套接字错误?

    我在用RestClient在 ruby 类中进行网络调用 我得到了SocketError每当我没有连接到互联网时 我已经添加了一个救援块来捕获异常 但我仍然无法这样做 错误消息是 SocketError Failed to open TCP
  • 如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?

    好吧 问题就在这里 我必须编写一个 MIPS 程序 从用户那里获取 2 个输入数字 然后 我必须编写一个代码来输出用户输入的 2 个数字的乘积 商和余数 现在 这非常简单 但是 我没有意识到我们不能在程序中使用乘法和除法操作数 现在我不知道