0

ここで次の質問があります

次の MIPS 逆アセンブル コードを理解する必要があります。

.text:00489060             la      $v0, 0x4D0000

.text:00489064             la      $v0, 0x4D0000

.text:00489068             addiu   $v1, $v0, (aBig5 - 0x4D0000)  # "BIG-5"

.text:0048906C             lw      $v0, (aBig5 - 0x4D0000)($v0)  # "BIG-5"

.text:00489070             lbu     $a0, (aBig5+5 - 0x4D6A68)($v1)

.text:00489074             lbu     $v1, (aBig5+4 - 0x4D6A68)($v1)

.text:00489078             swl     $v0, 0($s1)

.text:0048907C             swr     $v0, 3($s1)

.text:00489080             sb      $a0, 5($s1)

.text:00489084             b       loc_48A190

.text:00489088             sb      $v1, 4($s1)

.text:0048908C  # ---------------------------------------------------------------------------

.text:0048908C

.text:0048908C loc_48908C:              # CODE XREF: cgiGetVar+B8j

.text:0048908C             lw      $v1, (dword_4D6A5C - 0x4D0000)($v0) #"ISO-"

.text:00489090             addiu   $v0, (dword_4D6A5C - 0x4D0000)

.text:00489094             lw      $a0, (dword_4D6A60 - 0x4D6A5C)($v0) #"8859"

.text:00489098             swl     $v1, 0($s1)

.text:0048909C             lbu     $a1, (byte_4D6A66 - 0x4D6A5C)($v0)  # zero byte

.text:004890A0             lbu     $a2, (byte_4D6A64 - 0x4D6A5C)($v0)  # "-"

.text:004890A4             lbu     $v0, (byte_4D6A65 - 0x4D6A5C)($v0)  # "1"

.text:004890A8             swr     $v1, 3($s1)

.text:004890AC             swl     $a0, 4($s1)

.text:004890B0             swr     $a0, 7($s1)

.text:004890B4             sb      $a1, 0xA($s1)

.text:004890B8             sb      $a2, 8($s1)

.text:004890BC             b       loc_48A190

.text:004890C0             sb      $v0, 9($s1)

.text:004890C4  #

私が解決する必要があるタスクは、ルーターのファームウェア マネージャーで Web 言語 ID を BIG-5 から ISO-8859-5 に変更することです (ソースなし:)) したがって、ISO-8859-5 は BIG-5 よりも 5 文字長くなります。右側の (BIG-5 の) テキスト ブロックを .rodata セクションに移動しました)ここに 16 進数のフラグメントがあります:

  4d6a50:   68746d6c 63686172 73657400 49534f2d     htmlcharset.ISO-
  4d6a60:   38383539 2d310000 4249472d 35000000     8859-1..BIG-5...
  4d6a70:   53757043 484c616e 67000000 636f6e6e     SupCHLang...conn

& .text セクションのポインターを変更しました。ただし、プログラムを実行すると、6バイトしかロードされません(ルーターのHTMLコードページに(ISO-8859-5)の代わりに「ISO-88」が表示されます。したがって、開発中のバイト数がどこにあるかを見つける必要があると思います修正して変更してください.誰かこのコードにコメントしてくれませんか.どうもありがとう:)

4

1 に答える 1

0

バイト数は指定されていません。1 ワードと 2 バイトをロードするだけです。

; load one word (4 bytes) into v0
lw      $v0, (aBig5 - 0x4D0000)($v0)
; load one byte into a0
lbu     $a0, (aBig5+5 - 0x4D6A68)($v1)
; load one byte into v1
lbu     $v1, (aBig5+4 - 0x4D6A68)($v1)
; store left part of the word from v0
swl     $v0, 0($s1)
; store right part of the word from v0
swr     $v0, 3($s1)
; store byte from a0
sb      $a0, 5($s1)
; store byte from v1
sb      $v1, 4($s1)

したがって、基本的には 5 文字の文字列で修正され、コードにパッチを適用しないと、より長い文字列は機能しません。単語をロードし、2 つをとで置き換えることで、7 文字 (8 バイト) のパッチを適用できる場合があります。アラインされていることが確実な場合の別のオプションは、3 ワード (12 バイト) をロードし、swl/swr ペアの代わりに使用して後の 2 ワードを格納することです。sbswlswrs1sw

于 2011-11-14T11:50:30.203 に答える