我有下面的说明,我不明白为什么PCSPIM会给我以下警告:
spim:(parser) immediate value (61440) out of rainge (-32768..32767)
on line 88 of file
addiu $a, $zero, 0xF000
^根据ISA的说法,我应该
Description: Adds a register and a sign-extended immediate value and
stores the result in a register
Operation: $t = $s + imm; advance_pc(4);
Syntax: addiu $t, $s, imm
Encoding: 0010 01ss ssst tttt iiii iiii iiii iiii如果我把$a0,$zero,0xF 000转换成机器代码,我就有了
opcode | rs | rt | imm val
-------+-----+------+--------------------
0010 01|00 00|0 0100| 1111 0000 0000 0000哪一个应该符合指示?
发布于 2016-06-24 04:20:22
我想你的意思是这样的:
addiu $a0,$zero,0xF000这是spim的一个怪癖,因为它并没有把它当作一个伪op。但是,考虑到这一点,指出这一点是正确的。
不管您是使用addi还是addiu,它们都具有相同的-32768 to 32767签名范围。唯一的区别是指令是否会在整数溢出时生成异常。也就是说,这两个指令都会在即时值上进行扩展,而对于addi则不会进行符号扩展,对于addiu则不会进行零扩展。
您的值0xF000为61440小数点,超出了指令的允许范围。在这两种情况下,您将得到0xFFFFF000的符号扩展值
spim看到了0xF000,并认识到您想要添加0x0000F000而不是0xFFFFF000,但是不会自动生成代码,因为它将addiu视为一个低级的文字指令。
另一方面,mars确实将其视为伪op,并生成:
lui $at,0
ori $at,$at,0xF000
addu $a0,$zero,$at它确认您需要一个无符号操作,因此它必须生成使用addu生成真正无符号加法的指令。
但是,如果您将原件改写为:
addu $a0,$zero,0xF000现在,spim将把它当作一个伪op并生成:
ori $a0,$zero,-4096而且,mars对这种重写也很满意
https://stackoverflow.com/questions/38004815
复制相似问题