我的作业是初始化某些寄存器中的值。我们必须关闭“允许扩展(伪)”指令和格式。
当我尝试汇编代码时,我得到第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
答案 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条指令。