MIPS、ADDIU 在 PCSPIM 中超出范围
MIPS, ADDIU out of range in PCSPIM
我有以下说明,但我不明白为什么 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
如果我将 addiu $a0, $zero, 0xF000 转换成机器码,我会得到
opcode | rs | rt | imm val
-------+-----+------+--------------------
0010 01|00 00|0 0100| 1111 0000 0000 0000
哪个应该符合说明
我假设你的意思是这样的:
addiu $a0,$zero,0xF000
这是 spim
的怪癖,因为它 没有 将其视为伪操作。但是,鉴于此,正确 标记它。
无论您使用 addi
还是 addiu
,它们 两者 具有相同的 signed 范围 -32768 to 32767
。唯一的区别是指令是否会在整数溢出时产生异常。也就是说,两条指令都将对立即值进行符号扩展,not 对 addi
进行符号扩展,对 addiu
.
进行零扩展
您的值 0xF000
是 61440 [十进制],超出了指令允许的范围。在这两种情况下,您都会得到 符号扩展 值 0xFFFFF000
spim
看到 0xF000
并认识到您想要添加 0x0000F000
和 not 0xFFFFF000
但不会自动生成代码,因为它将 addiu
视为低级文字指令。
另一方面,mars
确实将其视为伪操作并生成:
lui $at,0
ori $at,$at,0xF000
addu $a0,$zero,$at
它识别出您需要 unsigned 运算,因此它必须使用 addu
生成产生真正无符号加法的指令
但是,如果您将原来的重写为:
addu $a0,$zero,0xF000
现在,spim
将将其视为伪操作并生成:
ori $a0,$zero,-4096
而且,mars
对重写也很满意
我有以下说明,但我不明白为什么 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
如果我将 addiu $a0, $zero, 0xF000 转换成机器码,我会得到
opcode | rs | rt | imm val
-------+-----+------+--------------------
0010 01|00 00|0 0100| 1111 0000 0000 0000
哪个应该符合说明
我假设你的意思是这样的:
addiu $a0,$zero,0xF000
这是 spim
的怪癖,因为它 没有 将其视为伪操作。但是,鉴于此,正确 标记它。
无论您使用 addi
还是 addiu
,它们 两者 具有相同的 signed 范围 -32768 to 32767
。唯一的区别是指令是否会在整数溢出时产生异常。也就是说,两条指令都将对立即值进行符号扩展,not 对 addi
进行符号扩展,对 addiu
.
您的值 0xF000
是 61440 [十进制],超出了指令允许的范围。在这两种情况下,您都会得到 符号扩展 值 0xFFFFF000
spim
看到 0xF000
并认识到您想要添加 0x0000F000
和 not 0xFFFFF000
但不会自动生成代码,因为它将 addiu
视为低级文字指令。
另一方面,mars
确实将其视为伪操作并生成:
lui $at,0
ori $at,$at,0xF000
addu $a0,$zero,$at
它识别出您需要 unsigned 运算,因此它必须使用 addu
但是,如果您将原来的重写为:
addu $a0,$zero,0xF000
现在,spim
将将其视为伪操作并生成:
ori $a0,$zero,-4096
而且,mars
对重写也很满意