1

首先,我是一个学习汇编/机器代码的初学者,所以如果我问的很明显,请原谅我。

我正在阅读一些代码并遇到了一个代码片段,其中代码将“1.0”放入浮点协处理器寄存器中。

代码是

addi       $t5, $0, 1
mtc1       $t5, $f2
cvt.s.w    $f0, $f2       # 1.0 in $f0

我的第一个问题是:

为什么必须先将“1”放入“$t5”,然后再将其传输到协处理器?做起来不是更容易吗

addi       $f2, $0, 1

甚至

addi       $f2, $0, 1.0

我的第二个问题是:

对于这行代码

 cvt.s.w    $f0, $f2       # 1.0 in $f0

两个寄存器有必要不同吗?或者它们都可以是 $f2 吗?

4

1 回答 1

1

指令对其规范中列出的寄存器类型进行操作,如果您想知道阅读它。

格式:ADDI rt、rs、立即 MIPS32
目的:
将常量添加到 32 位整数。如果发生溢出,则陷阱。
说明: rt ← rs + 立即数
将 16 位有符号立即数添加到 GPR rs 中的 32 位值以产生 32 位结果。
• 如果加法导致 32 位 2 的补码算术溢出,则目标寄存器不会被修改并且
发生整数溢出异常。
• 如果加法没有溢出,则将 32 位结果放入 GPR rt。
限制:
没有任何
手术:
temp ← (GPR[rs]31||GPR[rs]31..0) + sign_extend(立即)
如果 temp32 ¹ temp31 那么
信号异常(整数溢出)
别的
GPR[rt] ← 温度
万一
例外:
整数溢出
编程笔记:
ADDIU 执行相同的算术运算,但不捕获溢出。

所以 noaddi不能对协处理器寄存器进行操作

格式:CVT.SD fd、fs MIPS32
CVT.SW fd, fs MIPS32
CVT.SL fd, fs MIPS64
MIPS32 第 2 版
目的:
将 FP 或定点值转换为单个 FP
说明: fd ← convert_and_round(fs)
FPR fs 中的值,格式为 fmt,被转换为单浮点格式的值,并根据
FCSR 中的当前舍入模式。结果放在 FPR fd 中。
限制:
字段 fs 和 fd 必须指定有效的 FPR——fs 用于类型 fmt,fd 用于单浮点。如果它们无效,则
结果是不可预测的。
操作数必须是格式为 fmt 的值;如果不是,则结果为 UNPREDICTABLE 并且操作数的值
FPR 变得不可预测。
对于 CVT.SL,如果处理器在 16 个 FP 寄存器中执行,则该指令的结果是 UNPREDICTABLE
模式。
手术:
StoreFPR(fd, S, ConvertFmt(ValueFPR(fs, fmt), fmt, S))
例外:
协处理器不可用,保留指令
浮点异常:
无效操作、未实现的操作、不精确、上溢、下溢

它并不是说 fd 和 fs 必须不同,所以除非关于源和目标寄存器的其他规则不能相同,否则您可以使用一个。

于 2012-08-19T07:13:08.370 回答