微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 andi mips 指令可能非法时

如何解决当 andi mips 指令可能非法时

mips 指令 andi $a0,$a0,0x9AE3 的格式看起来是正确的。它是一种 I 类型格式 opcode rs rt 立即。为什么是无效的 mips 指令?

解决方法

正如@Peter 所说,如果常量太大而无法放入立即数字段,汇编器将拒绝该行或将其转换为多条指令,在执行请求的操作的过程中构建一些常量。

但是,对于 andi,立即数字段是 16 位,被视为无符号,这意味着我们得到的范围是 0x0000-0xFFFF 和 0x9000显然在那个范围内。

现在,如果操作码是 addi,区别在于 对于 addi,相同的 16 位立即数字段被视为有符号 ,这意味着我们得到的范围是 0xFFFF8000-0x00007FFF,而这里的 0x9000 超出了该范围(因此汇编程序将拒绝该行汇编代码,或者用 2(或更多)条指令序列替换,因为它不能被编码为一条指令)。


顺便说一句,许多 MIPS 汇编程序都非常友好,它们会采用处理器自然不支持的“合理”指令和操作数,并将它们视为伪指令,而是由一系列多条机器代码指令实现.这在 MIPS 思维模式中非常普遍,可以通过保留整个 CPU 寄存器 ($at/$1) 作为此类扩展的临时存储来证明。在 RISC V 中,这已经消失了,只允许可以重用目标的伪指令,否则(人类)汇编程序员必须编写适当的代码序列(这可能涉及识别空闲寄存器)。恕我直言,这是一件好事,b/c MIPS 汇编器隐藏了不应该隐藏在汇编中的东西——例如,将一些看似无辜的指令翻译成一个 3 指令序列,当这些指令发生在循环中时,一些认为,本来可以做得更好(如果汇编程序员没有得到汇编程序的“帮助”,并被提醒要根据硬件可以更直接地考虑这种情况)。


我们还要注意,在 RISC V 中,所有立即数都是符号扩展的,因此它们还删除了对 andiaddi 的立即数的不同处理。正如@Peter 还指出的,RISC V 立即数也更小,这两者都增加了程序员和编译器的工作量,但只需要一种硬件机制来扩大立即数(即符号扩展和无零扩展),从而提高硬件效率),并通过更好地利用编码位(更多位用于操作码、更长的指令集寿命和自定义指令集扩展)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。