0

我们从地址8002000 到 80020028运行代码,问题是当我们最后时寄存器$18里面是什么。我认为可能有0x0E但我真的不确定我是如何得到这个答案的。谁能解释一下?

如果我们从 80020000 开始并按照书面说明进行操作,是否会发生异常?如果是,什么时候会发生?

8001FFF8    NOP 
8001FFFC    NOP
80020000    LUI     $16, 0x8002
80020004    ADDIU   $16, $16, 0x30
80020008    ADDI    $17, $00, 0x3
8002000c    SLL     $17, $17, 0x2
80020010    LW      $18, 0x4 ($16)
80020014    LW      $19, 0x0 ($16)
80020018    SW      $18, 0x8 ($16)
8002001C    NOP
80020020    ADD     $18, $18, $17
80020024    NOP
80020028    NOP
8002002C    NOP
80020030    ???
80020034    SRL     $00, $00, 0
80020038    SRA     $00, $00, 0
8002003C    SLLV    $00, $00, $00
80020040    NOP
80020044    NOP
4

1 回答 1

1
8001FFF8    NOP 
8001FFFC    NOP
80020000    LUI     $16, 0x8002
80020004    ADDIU   $16, $16, 0x30

$16 = 0x80020030

80020008    ADDI    $17, $00, 0x3
8002000c    SLL     $17, $17, 0x2

17 美元 = 12 ( 3 << 2 )

80020010    LW      $18, 0x4 ($16)

$18 = 0x2(从反汇编的 80020034 加载值是 srl $0,$0,0 -> 0x2)

80020014    LW      $19, 0x0 ($16)

19 美元 = ??? (0x80020030 下的值未知)

80020018    SW      $18, 0x8 ($16)

存储在 0x80020038 (0x2) 下

8002001C    NOP
80020020    ADD     $18, $18, $17

$18 = 0xE ( 0x2 + 12 )

80020024    NOP
80020028    NOP

$18 = 0xE(nops 不会改变任何东西)

8002002C    NOP
80020030    ???
80020034    SRL     $00, $00, 0
80020038    SRA     $00, $00, 0
8002003C    SLLV    $00, $00, $00
80020040    NOP
80020044    NOP

此代码中的异常是可能的(我可能会错过一些东西):

  • 在 80020018 sw 指令中,如果该内存片段被写保护(分段错误)
  • 在 80020030 如果继续执行代码并执行此地址(非法指令)
  • 在 80020010 如果这个内存片段被读保护(非常不可能)(分段错误)
  • 如果此内存片段不可执行(不太可能)(分段错误),则为 80020000
  • 如果此转储中可见的地址对执行此代码的进程不可见.. - 很难说不知道环境以及如何获得此转储。
于 2012-06-20T17:50:56.990 回答