2

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

但是,我不确定它何时会扩展到负值。

我试过了

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

这段代码,qtSpim 给出了以下错误。

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

为了将符号扩展到负值,MSB 必须为“1”,但它超出了立即值的范围。

所以,我猜是addi不是“实际上”碰巧是符号扩展的。我猜对了吗?

或者如果没有,你能告诉我我在哪里犯了错误吗?还有一个符号扩展的例子会有很大帮助:)

4

1 回答 1

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ưu Vĩnh Phúc 指出,-0x8000 或 -32768 应该可以工作。我建议使用 -32768 而不是 -0x8000,这更有可能被其他汇编程序以相同的方式接受。抱歉,没有方便测试的 mips 工具链。

于 2014-10-26T18:47:51.290 回答