在Mars 4.5中初始化值时出错

时间:2019-06-02 14:12:48

标签: assembly mips mars-simulator

我的作业是初始化某些寄存器中的值。我们必须关闭“允许扩展(伪)”指令和格式。

当我尝试汇编代码时,我得到第7、8、9行的错误消息

不允许使用扩展的(伪)指令或格式。

还有没有一种方法可以优化代码?上周我们开始使用汇编语言,所以它很新。

.text
addi $8, $0, 1
addi $9, $0, 11
addi $10, $0, 0x1000
addi $11, $0, -1
addi $12, $0, -0x8000
addi $13, $0, 0x8000
addi $14, $0, 0xffff0000
addi $15, $0, 0x7fffffff
addi $24, $0, 5322
addi $25, $0, 75

1 个答案:

答案 0 :(得分:1)

addi指令需要一个16位带符号的参数。在16位上,您可以从-32768(-0x8000)到+32767(0x7fff)进行编码。

说明7 addi $13, $0, 0x8000超出范围(+32768)。

还有指令8 addi $14, $0, 0xffff0000和9 addi $15, $0, 0x7fffffff

使用具有超过16个有效位的参数初始化寄存器通常需要两条指令。这就是宏指令的目的,例如li可以在两个指令中加载32个整数或la,它们对地址(标签)进行相同的操作。

基本上,要在$ 2中加载0x01234567,首先要做的是先用lui加载高阶位(先加载立即数),然后再用参数的下半部分加载。

lui $2, 0x0123     # load the upper part and clears 16 LSBs
                   # content of $2 is 0x01230000
ori $2, $2, 0x4567 # ors with the 16 least significant bits

请注意,ori(和andi, xori)将其操作数视为逻辑,并且不执行符号扩展。操作数只是零扩展。

因此,您可以将ligne 7替换为

ori $13, $0, 0x8000

在一条指令中进行有效的初始化。

类似地,指令8立即清除了其所有16 LSB,并且初始化可以在唯一的lui中完成

lui $14, 0xffff

对于第9行,需要两个说明

lui $15, 0x7fff     
ori $15, $15, 0xffff

无法真正优化代码。要初始化10个不同的寄存器,您至少需要10条指令。