关于MIPS中的addi指令

时间:2014-04-09 10:56:16

标签: mips sign-extension

我了解到符号扩展发生在MIPS addi指令的立即值中。 (http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addi.html

但是,我不确定它何时会签名延伸到负值。

我试过

main:
    addi    $t0, $0, 0x8000
    jr  $31

此代码,qtSpim发出以下错误。

立即值(32768)超出文件第3行的范围(-32768 ... 32767)   addi $ t0,$ 0,0x8000

为了将符号扩展为负值,MSB必须为' 1',但它超出范围成为立即值。

所以,我猜测的是addi实际上不是'恰好是符号扩展。 我猜它是对的吗?

如果没有,你能否告诉我自己哪里错了?另外一个符号扩展的例子将有很多帮助:)

1 个答案:

答案 0 :(得分:0)

addi采用签名值。组装时addi指令的格式为:

bit    31-26  25-21  20-16  15-0  
value    8      rs     rd   (signed) const

*来源请参阅MIPS运行

其中8是操作码,rs是目标寄存器,rd是源寄存器,(signed)const是添加到rd的有符号整数。

汇编程序期望一个(可选)带符号的16位整数,在其中给出0x8000值。您正在使用的特定汇编程序将此视为十六进制的正整数,32768,因为错误表示,这将不适合。

我会小心你正在做的事情溢出。

请记住0x8000是作为整数处理还是原始二进制值取决于您正在使用的汇编程序。 LưuVĩnhPhúc指出,-0x8000或-32768应该可以工作。我建议使用-32768而不是-0x8000,这更有可能被其他汇编程序以相同的方式接受。抱歉,没有mips工具链可以方便地进行测试。