Assembly MIPS汇编中的除法(和负数),如何计算余数并打印结果?

Assembly MIPS汇编中的除法(和负数),如何计算余数并打印结果?,assembly,mips,negative-number,Assembly,Mips,Negative Number,我现在对处理如此正数的负数持怀疑态度,但当我输入54作为第一个整数,输入8作为第二个整数时,我得到的结果是6,而不是6.75。在我的例子中,如何将6和余数都输出为0.75 .data msg1: .asciiz "\nEnter the first integer" msg2: .asciiz "Enter the second integer" msg3: .asciiz "Result" .text li $v0, 4

我现在对处理如此正数的负数持怀疑态度,但当我输入54作为第一个整数,输入8作为第二个整数时,我得到的结果是6,而不是6.75。在我的例子中,如何将6和余数都输出为0.75

.data
msg1:   .asciiz "\nEnter the first integer"
msg2:   .asciiz "Enter the second integer"
msg3:   .asciiz "Result"

.text
li $v0, 4   # syscall to print string
la $a0, msg1
syscall

li $v0, 5   # syscall to read an integer
syscall
add $t1, $zero, $v0

li $v0, 4   # syscall to print a string
la $a0, msg2
syscall

li $v0, 5   # syscall to read an integer
syscall
add $t2, $zero, $v0

add $t0, $zero, $zero

LOOP:
slt $t3, $t1, $t2
bne $t3, $zero, DONE
sub $t1, $t1, $t2
addi $t0, $t0, 1
j LOOP

DONE:
li $v0, 4   # syscall to print a string
la $a0, msg3
syscall

li $v0, 1   # syscall to print an integer
add $a0, $t0, $zero
syscall

li $v0, 10   # syscall code to exit
syscall
“模板”
主要内容:
#初始化寄存器
循环:
#股息-=股息
#商++
#温度=股息-股息
#如果温度<0,则跳转至完成
#跳转到循环
完成:
#余数=温度

重复减法除法和MIPS上的
div
指令正在执行。这意味着商是一个整数,余数也是一个整数-商或余数都没有四舍五入,它们是按整数除法精确计算的

在你的例子中,商和余数正好都是6。在整数除法中,如果你做55/8,商是6,余数是7。53/8会得到商是6,余数是5(余数是商6乘以除数8,然后从原始股息中减去后的剩余数,例如这里的53-48、54-48、55-48。)

然而,听起来你可能不想要整数除法

如果你用实数除法而不是整数除法,6.75是商,没有余数的概念,只有商——其中一些可能在小数点之后

(0.75是整数余数,6除以除数,8,用实数除法代替整数除法;我不知道它的名字,所以我把它叫做商的“余数”。)

实数除法在使用浮点的处理器上近似。MIPS有一个浮点协处理器,它将为浮点寄存器中的答案提供6.75。为了使用浮点算术,我们将值放入浮点寄存器,然后使用浮点指令,将值返回浮点寄存器-这些寄存器被命名为
$f0
-
$f31
,以区别于整数寄存器。如果您使用的是MARS,则在进行除法后还可以打印6.75


尽管如此,还是有一种方法可以从整数计算中得到数字7和5(尽管这是相当少见的,因为这有点像构建自己的浮点…)

取余数6,乘以10得到60。然后再次进行整数除法,60/8得到7个商和4个余数。打印7,然后用4再次执行上述操作:乘以10得到40,整数除以8:40/8=5,所以打印5-您已经打印了75-如果您从54/8开始,您将得到675作为数字ts,其中小数点应放在打印后的第一个商:6.75。知道在哪里停止打印是一个技巧,因为1/3总是有1的余数,因此永远使用3:0.33333


或者,将被除数乘以100,以:5400/8=675开始,或者,将第一个整数除法后的余数乘以6,再除以100,然后除以8=75。

如果你想要浮点结果,你必须使用浮点指令和数据。Google mips浮点指令。@Michael你知道另一种方法吗方法使用浮点结果,因为我不确定这正是我想要的结果(尽管我仍将对此进行研究)。你知道为什么它被四舍五入到6,而完全忽略了0.75吗?“你知道为什么它被四舍五入到6,而完全忽略了0.75吗?”因为您正在执行整数运算。@Michael,我问了更多关于余数的问题。无论如何,您认为使用此模板是否有助于不需要浮点?请参阅原始帖子/问题“模板”的结尾。据我所知,您的余数(6)已存在于
$t1
中。
'Template'
main:
    #initialize registers

loop:
    #dividend -= divsor
    #quotient++

    #temp = dividend - divsor
    #if temp < 0 jump to done
    #jump to loop

done:
    #remainder = temp