[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个机器码,为什么会发生这种情况?看起来结果是错误的。
答案 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))