MIPS разборка: lui, затем lbu - PullRequest
       18

MIPS разборка: lui, затем lbu

2 голосов
/ 26 января 2012

Я разбираю прошивку, используя IDA (процессор mipsb)

Я вижу это много в этом разложении IDA.

lui       $t9 , 0x802f

... ничего не делает с $t9 ... и не прыгает ..

lbu      $t9, 0x200+var_24($sp)

И это не имеет смысла для меня.в первой строке: $t9 становится 0x802F0000, во 2-й строке: $t9 становится тем байтом, который хранится в этом месте в стеке.

Если я прав, тогда какой смысл?Это ошибка используемого компилятора, или ошибка программиста, или я что-то упустил?

enter image description here

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Вы не показали, что происходит до этого.Если перед lui существует ветвь, код в месте назначения ветки может использовать загруженное значение t9.

Кроме того, отключите упрощение инструкций в параметрах, специфичных для процессора.Я подозреваю, что магазин в 800D8328 использует значение t9 для части адреса, и IDA упростила его, подставив полное значение.

1 голос
/ 07 февраля 2012

Это так и останется загадкой, как он попал сюда, но, очевидно, lui $t9 , 0x802F не имеет абсолютно никакого смысла в этом коде (и других частях прошивки, на которые я смотрю, я вижу то же самое .. та же ерунда ... с одинаковыми значениями lui $t9, 0x802f)

hsikcah ответ определенно неправильный. (lbu загружает один байт, но он обнуляет первые 3 байта регистра) ..

Ответ, кажется, мое первоначальное предположение. Это либо артефакт компилятора, либо нонсенс кодера, который не был удален компилятором (также предложенный комментариями m0skit0 и markgz )

0 голосов
/ 03 февраля 2012

Инструкция lbu не расширена знаком. В результате предположим, что 0x200 + var_24 ($ sp) содержит 0x12, после этих 2 инструкций значение $ t9 станет ox80200012. Эти пары инструкций являются общими для загрузки 32-битного адреса памяти. В качестве общего примера можно было бы перебрать структуру данных в куче.

...