在 MIPS 中使用 la 之前需要清除寄存器吗?
Do you need to clear a register before using la in MIPS?
我们被教导在使用寄存器之前始终清除寄存器,或者将其视为可能已经包含可能影响我们尝试对该寄存器执行的操作的数据。如果我使用 la
指令,它是否会覆盖该寄存器中的任何内容,所以它是否已经有数据无关紧要?
or
操作或 and
操作是否能够做与 la
相同的事情?有没有比 la
更好的加载地址的方法?这是我最常看到的那种类型的操作,但我觉得在我使用 or
之前可能有一次。
我知道有些指令是伪指令,速度不够快或不够理想。首选方法是什么?
而不是使用 la
,更常见的是使用 addi
。你总是做这两个中的一个,因为如果你不这样做,变量里面就会有垃圾,而不是特定的值。 or
或 and
只能在条件语句中使用。
la
是一个伪指令,所以由每个汇编器决定是否要实现它以及如何实现它。但我会说它通常实现为 lui
+ ori
或 lui
+ addiu
。这两种组合都会影响目标寄存器的所有位,而不依赖于旧值。 (他们以 lui
开头)
We are taught to always clear a register before using it
这听起来很奇怪。如果必须,请清除寄存器,否则不要。 MIPS 没有像 x86 那样的部分寄存器。
在设置其他值之前将寄存器设置为 0
只会使您的源代码混乱并使您的程序变慢。连续两次对寄存器进行只写访问是没有意义的。
Is there a better way to load an address than la?
不,不是真的。这是最方便的方法。除非汇编器在做一些愚蠢的事情,否则它几乎总是和任何手写方法一样有效。 (除了利用 lw
指令中的位移位,但 MARS 除了硬编码数字地址外没有提供其他方法。请参阅评论。)
我们被教导在使用寄存器之前始终清除寄存器,或者将其视为可能已经包含可能影响我们尝试对该寄存器执行的操作的数据。如果我使用 la
指令,它是否会覆盖该寄存器中的任何内容,所以它是否已经有数据无关紧要?
or
操作或 and
操作是否能够做与 la
相同的事情?有没有比 la
更好的加载地址的方法?这是我最常看到的那种类型的操作,但我觉得在我使用 or
之前可能有一次。
我知道有些指令是伪指令,速度不够快或不够理想。首选方法是什么?
而不是使用 la
,更常见的是使用 addi
。你总是做这两个中的一个,因为如果你不这样做,变量里面就会有垃圾,而不是特定的值。 or
或 and
只能在条件语句中使用。
la
是一个伪指令,所以由每个汇编器决定是否要实现它以及如何实现它。但我会说它通常实现为 lui
+ ori
或 lui
+ addiu
。这两种组合都会影响目标寄存器的所有位,而不依赖于旧值。 (他们以 lui
开头)
We are taught to always clear a register before using it
这听起来很奇怪。如果必须,请清除寄存器,否则不要。 MIPS 没有像 x86 那样的部分寄存器。
在设置其他值之前将寄存器设置为 0
只会使您的源代码混乱并使您的程序变慢。连续两次对寄存器进行只写访问是没有意义的。
Is there a better way to load an address than la?
不,不是真的。这是最方便的方法。除非汇编器在做一些愚蠢的事情,否则它几乎总是和任何手写方法一样有效。 (除了利用 lw
指令中的位移位,但 MARS 除了硬编码数字地址外没有提供其他方法。请参阅评论。)