【问题标题】:MIPS register contentMIPS寄存器内容
【发布时间】:2012-05-26 11:51:34
【问题描述】:

我们从地址 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

【问题讨论】:

  • 它应该在寄存器的前 16 位加载立即操作数,所以我猜它应该是 0x80020000

标签: assembly mips


【解决方案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

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
  • 如果此转储中可见的地址在执行此代码的进程中不可见.. - 很难说不知道环境以及此转储是如何获得的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多