【发布时间】:2021-04-02 05:38:45
【问题描述】:
我是汇编语言 (MIPS) 的新手,正在尝试创建一个计算整数平方根的函数,但无法弄清楚它的逻辑。有人可以帮助或指导我如何正确编码。谢谢。
【问题讨论】:
-
你卡在哪里了?
标签: mips
我是汇编语言 (MIPS) 的新手,正在尝试创建一个计算整数平方根的函数,但无法弄清楚它的逻辑。有人可以帮助或指导我如何正确编码。谢谢。
【问题讨论】:
标签: mips
下面是使用Newton’s Method计算整数平方根的代码:
.globl Squareroot # Function for Squareroot
.ent Squareroot
Squareroot:
#Using Newton’s Method
move $v0, $a0 # $v0 = x = N
li $t6, 0 # counter
Loop:
div $t7, $a0, $v0 # N/x
add $v0, $t7, $v0 # x + N/x
div $v0, $v0, 2 # (x + N/x)/2
add $t6, $t6, 1
blt $t6, 20, Loop
jr $ra
.end Squareroot
【讨论】:
如果您使用的版本支持协处理器 1 - 浮点。
您可以使用它为您执行 sqrt 计算。
$f 表示有效的浮点寄存器。 这可能是 $f0-f31。
如果您想使用双精度(可以表示完整的 32 位 int 而不会丢失精度) {on a 32 bit mips arc} 你应该只使用 EVEN 寄存器号 $f0,f2,f4 ... f30
使用说明:{如果您使用浮点数(单精度),请使用命令的单词/单版本}
load-doubleword-coprocessor1: [ldc1 $f, base+offset] # {lwc1}
平方根双精度:[sqrt.d $f, $f] # {sqrt.s}
convert-word-from-double: [cvt.w.d $f, $f] # {cvt.w.s}
从协处理器 1 移动:[mfc1.d $r, $f] # {mfc1.s}
'# $r 表示通用寄存器,如$t0-8, $s0-8 等
【讨论】: