Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 加载32位常量以在MIPS中注册_Assembly_Mips - Fatal编程技术网

Assembly 加载32位常量以在MIPS中注册

Assembly 加载32位常量以在MIPS中注册,assembly,mips,Assembly,Mips,我在学习MIPS时对这一部分感到困惑 教授编写的教科书说,如果我们要加载一些大常数,我们应该 lui $s0, upper(big) ori $s0, $s0, lower(big) 但我们为什么不这样做呢 addi $s0, $zero, big 由于寄存器是32位的,所以这是更直接的,不是吗?传递到addi的立即参数只有16位。要加载超出16位值范围的32位立即数,需要分两步进行,如教科书中的示例所示 (考虑到进一步的问题,没有采用32位立即数的load immediate或add im

我在学习MIPS时对这一部分感到困惑

教授编写的教科书说,如果我们要加载一些大常数,我们应该

lui $s0, upper(big)
ori $s0, $s0, lower(big)
但我们为什么不这样做呢

addi $s0, $zero, big

由于寄存器是32位的,所以这是更直接的,不是吗?

传递到
addi
的立即参数只有16位。要加载超出16位值范围的32位立即数,需要分两步进行,如教科书中的示例所示


(考虑到进一步的问题,没有采用32位立即数的load immediate或add immediate指令的原因是因为MIPS ISA使用固定大小的32位指令,因此任何指令参数总是<32位可用-这在RISC体系结构中非常常见。)

是寄存器是32位的,但如何在32位指令中指定32位数字?指令由操作码和数据组成。因此,不能在单个addi中压缩操作码+32位数据

如果需要加载大量常量,可以使用文字池。那么每个常量加载只需要一条加载指令。更多信息和

或者,使用.data和.text


非常感谢。由于长度固定,立即数格式只保留16位用于常量,其他16位用于操作和寄存器代码。另一个关于组合“lui”、“ori”和“or”将大常量加载到寄存器的问题。1.为什么要这样做,而不仅仅是通过加法运算计算值并将其保存到寄存器中?2.另外,如何使用大于26位的常数?j-type指令只需要26位常量。你可以这样做,但lw是一个相对昂贵的操作,所以最好不要这样做。
.data
   word32bits: .word 0xFFFFFFFF

.text
   lw $t0, word32bits # $t0 now contains your 32 bit word.