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 に答える