为何在这段MIPS汇编代码中使用ori指令?
为什么这段MIPS汇编用
ori指令加载50000? 先明确核心背景:50000转十六进制是0xC350,刚好是16位无符号数。
MIPS的I型指令(比如ori、addi)的立即数字段只有16位,而寄存器是32位,所以加载时必须把16位立即数扩展到32位,这里的关键是两种扩展方式的区别:
addi这类算术指令会做符号扩展:如果16位立即数的最高位是1(0xC350的最高位就是1),高16位会被填满1,最终得到0xFFFFC350,这对应十进制的-15536,完全不是我们要的50000。ori是逻辑或指令,它做零扩展:不管立即数最高位是什么,高16位都填0,0xC350扩展后就是0x0000C350,正好是十进制的50000,符合赋值需求。
再看指令本身:$zero寄存器的值永远是0,ori $t0, $zero, 0xC350就相当于把零扩展后的32位数值直接写入$t0,刚好完成了加载目标数的操作。
要是不用ori,对于超过16位的数才需要用lui(加载高位)加ori组合,但这里50000刚好能放进16位,单条ori就足够高效。
内容的提问来源于stack exchange,提问作者Loylis
相关产品推荐
相关产品推荐

