Понимание ассемблерного кода MIPS Linux о загрузочном байте - PullRequest
0 голосов
/ 31 октября 2011

У меня следующий вопрос здесь

Мне нужно понять следующий код разборки 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  #

Задача, которую мне нужно решить, состоит в том, чтобы изменить идентификатор веб-языка с BIG-5 на ISO-8859-5 в диспетчере встроенных программ моего маршрутизатора (без источников :)). Таким образом, ISO-8859-5 на 5 букв длиннее, чем BIG- 5. Я переместил правый блок текста (из BIG-5) в раздел .rodata) вот шестнадцатеричный фрагмент:

  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 байтов (я вижу «ISO-88» вместо (ISO-8859-5) в HTML-кодовой странице маршрутизатора. Поэтому, я думаю, мне нужно найти, где находится число развивающихся байтов). исправить и изменить его. Может кто-нибудь прокомментировать этот код. Большое спасибо:)

1 Ответ

0 голосов
/ 14 ноября 2011

Количество байтов не указано. Он просто загружает слово и два байта и все:

; 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 символов, и более длинная не будет работать без исправления кода. Вы могли бы быть в состоянии исправить это для 7-символьного (8 байт), загрузив слова и заменив два sb на swl и swr. Другой вариант, если вы уверены, что s1 выровнен, - это загрузить три слова (12 байт) и сохранить последние два, используя sw вместо пары swl / swr.

...