首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS,ADDIU超出PCSPIM的范围

MIPS,ADDIU超出PCSPIM的范围
EN

Stack Overflow用户
提问于 2016-06-24 02:37:46
回答 1查看 943关注 0票数 0

我有下面的说明,我不明白为什么PCSPIM会给我以下警告:

代码语言:javascript
复制
spim:(parser) immediate value (61440) out of rainge (-32768..32767)
on line 88 of file
   addiu $a, $zero, 0xF000
                    ^

根据ISA的说法,我应该

代码语言:javascript
复制
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转换成机器代码,我就有了

代码语言:javascript
复制
opcode | rs  | rt   | imm val
-------+-----+------+--------------------
0010 01|00 00|0 0100| 1111 0000 0000 0000

哪一个应该符合指示?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-24 04:20:22

我想你的意思是这样的:

代码语言:javascript
复制
    addiu    $a0,$zero,0xF000

这是spim的一个怪癖,因为它并没有把它当作一个伪op。但是,考虑到这一点,指出这一点是正确的。

不管您是使用addi还是addiu,它们都具有相同的-32768 to 32767签名范围。唯一的区别是指令是否会在整数溢出时生成异常。也就是说,这两个指令都会在即时值上进行扩展,而对于addi则不会进行符号扩展,对于addiu则不会进行零扩展。

您的值0xF000为61440小数点,超出了指令的允许范围。在这两种情况下,您将得到0xFFFFF000的符号扩展值

spim看到了0xF000,并认识到您想要添加0x0000F000而不是0xFFFFF000,但是不会自动生成代码,因为它将addiu视为一个低级的文字指令。

另一方面,mars确实将其视为伪op,并生成:

代码语言:javascript
复制
    lui    $at,0
    ori    $at,$at,0xF000
    addu   $a0,$zero,$at

它确认您需要一个无符号操作,因此它必须生成使用addu生成真正无符号加法的指令。

但是,如果您将原件改写为:

代码语言:javascript
复制
    addu    $a0,$zero,0xF000

现在,spim将把它当作一个伪op并生成:

代码语言:javascript
复制
    ori     $a0,$zero,-4096

而且,mars对这种重写也很满意

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38004815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档