当我使用QtSpim时,有关lw指令的信息

时间:2016-12-11 11:52:45

标签: mips qtspim

[00400028] 8d090008  lw $9, 8($8);  lw $t1, 0x008($t0) 

[0040002c] 312a0002  andi $10, $9, 2          ; 5: andi $t2,$t1,0x2 

[00400030] 1148fffd  beq $10, $8, -12 [chkswitch-0x00400030]

[00400034] 3c010001  lui $1, 1                ; 7: lw $t3,0x8000($t0) 

[00400038] 00280821  addu $1, $1, $8          

[0040003c] 8c2b8000  lw $11, -32768($1)   

[00400040] 3c010001  lui $1, 1                ; 9: lw $t1, 0x8008($t0)

[00400044] 00280821  addu $1, $1, $8          

[00400048] 8c298008  lw $9, -32760($1)

如上所示,当我使用lw时,0x8000指令被翻译成3个机器码,为什么会发生这种情况?看起来结果是错误的。

1 个答案:

答案 0 :(得分:1)

因为lw的偏移量是16位有符号值,这意味着只能表示-32768 .. + 32767(-0x8000 .. + 0x7FFF)。

汇编程序是"修复"这可以通过将无效指令转换为三个有效指令来实现:

lui $1, 1                # $at = 0x10000
addu $1, $1, $8          # $at += $t0
lw $11, -32768($1)       # $t3 = -32768($at)   (== 32768($t0))