Assembly MIPS寄存器未将0XFA9C值分配给$a0寄存器

Assembly MIPS寄存器未将0XFA9C值分配给$a0寄存器,assembly,mips,Assembly,Mips,我正在尝试将0xFA9C分配给$a0。但是Qtspim软件显示了一个错误,其屏幕截图附在下面。谢谢你的帮助 0xFA9C是64156,它不适合addi指令的16位有符号立即数字段 如果您确实需要该数字,那么将其作为立即li$t0,0xFA9C加载,汇编程序将使用两条指令来构建该数字 如果您希望它是一个负数,例如-1380,那么使用十进制,或者(这在MARS中有效)将其填充到32位十六进制,并带有符号:0xFFFFFA9C,这会告诉汇编程序它是一个负数,并且该数字将与addi0xFA9C的16位立

我正在尝试将0xFA9C分配给$a0。但是Qtspim软件显示了一个错误,其屏幕截图附在下面。谢谢你的帮助


0xFA9C
是64156,它不适合
addi
指令的16位有符号立即数字段

如果您确实需要该数字,那么将其作为立即
li$t0,0xFA9C
加载,汇编程序将使用两条指令来构建该数字


如果您希望它是一个负数,例如-1380,那么使用十进制,或者(这在MARS中有效)将其填充到32位十六进制,并带有符号:
0xFFFFFA9C
,这会告诉汇编程序它是一个负数,并且该数字将与
addi
0xFA9C
的16位立即数相匹配,它不适合
addi
指令的16位带符号立即数字段

如果您确实需要该数字,那么将其作为立即
li$t0,0xFA9C
加载,汇编程序将使用两条指令来构建该数字


如果您希望它是一个负数,例如-1380,那么使用十进制,或者(这在MARS中有效)将其填充到32位十六进制,并带有符号:
0xFFFFFA9C
,这会告诉汇编程序它是一个负数,并且,这个数字将适合于
addi
的16位立即数,就像错误所说的那样,您尝试使用的值超出了
addi
的范围。您可以尝试使用
li
伪指令,伪指令应允许任何32位常量。正如错误所述,您尝试使用的值超出了
addi
的范围。您可以尝试使用
li
伪指令,伪指令应该允许任何32位常量。汇编程序将使用两条指令来生成该数字。-或者,如果它是智能的,将使用
ori$t0,$zero,0xFA9C
来实现该
li
。MIPS布尔指令零扩展其立即数,而不是符号扩展。我检查过了,qtspim的汇编程序确实知道这个技巧。(但它将生成的
3408fa9c
机器指令反汇编为
ori$8,$0,-1380
,只有当您将立即数视为
int16\u t
,而不是零扩展后的32位:/)非常确定的是,GAS和clang也知道使用
ori
,可能还有MARS。@PeterCordes。你说得对,火星确实有
ori$t0$at,0xFA9C
;然而,MARS也采用
addi$a0,$a0,0xFA9C
,它生成
lui$at,0x0
,然后是
ori$a0,$a0,0xFA9C
,然后是
add$a0,$a0,$at
!是的,MARS支持“扩展”伪指令,超出了标准MIPS汇编程序支持的范围。i、 它将每一条具有立即数的指令视为潜在的伪指令。它处理这种情况的方式通常非常愚蠢(低效),当扩展到可以处理一般情况的模式时,不会对值为零的部分进行优化。e、 g.
addi$a0,$zero,0xFA9C
以您描述的相同模式展开。MARS没有仅允许“正常”伪指令的选项。如果禁用“扩展(伪)指令和格式”,则也将禁用
li
。汇编程序将使用两条指令生成该数字。-或者,如果它是智能的,将使用
ori$t0,$zero,0xFA9C
来实现该
li
。MIPS布尔指令零扩展其立即数,而不是符号扩展。我检查过了,qtspim的汇编程序确实知道这个技巧。(但它将生成的
3408fa9c
机器指令反汇编为
ori$8,$0,-1380
,只有当您将立即数视为
int16\u t
,而不是零扩展后的32位:/)非常确定的是,GAS和clang也知道使用
ori
,可能还有MARS。@PeterCordes。你说得对,火星确实有
ori$t0$at,0xFA9C
;然而,MARS也采用
addi$a0,$a0,0xFA9C
,它生成
lui$at,0x0
,然后是
ori$a0,$a0,0xFA9C
,然后是
add$a0,$a0,$at
!是的,MARS支持“扩展”伪指令,超出了标准MIPS汇编程序支持的范围。i、 它将每一条具有立即数的指令视为潜在的伪指令。它处理这种情况的方式通常非常愚蠢(低效),当扩展到可以处理一般情况的模式时,不会对值为零的部分进行优化。e、 g.
addi$a0,$zero,0xFA9C
以您描述的相同模式展开。MARS没有仅允许“正常”伪指令的选项。如果禁用“扩展(伪)指令和格式”,则也会禁用
li