为什么MIPS架构中不存在subi操作码?

14

我对汇编语言非常陌生。我正在阅读关于MIPS架构的资料,得知了有addi操作码,但没有subi操作码。为什么没有subi操作码呢?


近似重复:addi和subi之间的“关系”是什么?。一些MIPS汇编器将subi实现为伪指令(包括MARS模拟器但不包括SPIM)。 - Peter Cordes
2个回答

23

创建指令集时,你受到一些限制,如可创建指令的总数。MIPS 的创建者意识到没有必要添加 subi(因为可以使用 2 的补码用addi来加上一个负数),因此他们简单地决定不去制作该指令。这可能是为了节省指令数量,或者只是因为它没有必要。


非常感谢。所以他们遵循了“少即是多”的原则。 - user379888
@JustAnotherProgrammer - 可能是这样。祝你在MIPS方面好运!Patterson and Hennessy 是学习计算机体系结构(圣经)的好书,而 SPIM模拟器 则是一个不错的工具,如果你想练习MIPS汇编的话。 - Chris Gregg
1
为什么还需要“sub”呢?我们不能通过使用2的补码来执行任何“sub”操作吗? - da4kc0m3dy
@mskd96 是的,你可以这样执行 sub,所以它并不是必须的。但是,除非包括 sub 会省略另一个重要操作,否则将其包括在 ISA 中并不会有害。 - Chris Gregg
3
你忘记了Patterson和Hennessy的一个设计原则:“让常见情况快速执行”。 sub比使用大于32767的立即数的subi更常见,因此引入了该指令,否则我们的完整指令集只需要一条指令,但处理常见操作会变得非常缓慢。 “好的设计需要做出好的妥协。” - phuclv

4

无论是addi还是addiu,都将16位有符号立即数作为操作数,因此添加单独的subisubiu操作码没有意义。


他们本可以在汇编器中轻松添加一个subi操作码,用于映射到相同的硬件指令。 - Bo Persson
@Bo 任何一个像样的MIPS汇编器都支持subi助记符(它会发出addi指令)。 - Igor Skochinsky
2
@Bo Persson:那就不是一个操作码,而是一个伪指令 :) - ninjalj
只是一个问题:addi 中的 immediate 在加到寄存器时是否进行符号扩展? - user35443
1
@user35443:是的,对于ADDIU也是一样(ADDIUADDI的唯一区别在于它不会引发溢出异常)。 - ninjalj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接