【问题标题】:In MIPS Assembly, Can 'addi' operate on coprocessor registers?在 MIPS 汇编中,“addi”可以对协处理器寄存器进行操作吗?
【发布时间】:2012-08-19 06:38:16
【问题描述】:

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

我在阅读一些代码时遇到了一个代码片段,其中代码将“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 吗?

【问题讨论】:

    标签: assembly mips machine-code


    【解决方案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 执行相同的算术运算,但不会捕获溢出。

    所以没有addi 不能对协处理器寄存器进行操作

    格式:CVT.S.D fd, fs MIPS32
    CVT.S.W fd, fs MIPS32
    CVT.S.L 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.S.L,如果处理器在 16 个 FP 寄存器中执行,则该指令的结果是 UNPREDICTABLE
    模式。
    手术:
    StoreFPR(fd, S, ConvertFmt(ValueFPR(fs, fmt), fmt, S))
    例外:
    协处理器不可用,保留指令
    浮点异常:
    无效操作、未实现操作、不精确、上溢、下溢

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

    【讨论】:

    • 感谢您的帮助。我在哪里可以找到所有说明的规格?我相信它会对我有点不确定的其他一些事情有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多