Smali: все аргументы регистра должны соответствовать 4-битной ошибке

когда я использовал smali для dex моего файла мода, я получил эту ошибку:

patch\android\view\Choreographer.smali[1392,4] Все аргументы регистра должны умещаться в 4 бита

Я нашел строку 1392 и нашел:

invoke-direct {p0, p1, p2, p3}, Landroid/view/Choreographer;->MyFunc(JI)V 
invoke-static {}, Ljava/lang/System;->nanoTime()J  (line 1392)

move-result-wide v11

Кто-нибудь знает, как мне это исправить? Я прочитал это сообщение http://forum.xda-developers.com/showthread.php?t=733275, но это не помогло, так как в этой строке не использовался регистр.


person lengxuehx    schedule 26.08.2013    source источник


Ответы (1)


Проблема в первой строке

invoke-direct {p0, p1, p2, p3}, Landroid/view/Choreographer;->MyFunc(JI)V 

Вы можете использовать только регистры v0-v15, потому что числовой индекс регистра должен умещаться в пределах 4 бит. По-видимому, в методе используется большое количество регистров, так что по крайней мере p3 отображается на регистр выше, чем v15.

К счастью, регистры являются смежными, поэтому исправить это несложно.

invoke-direct/range {p0 .. p3}, Landroid/view/Choreographer;->MyFunc(JI)V 

Вариант /range принимает непрерывный диапазон регистров и может адресовать до v65535.

person JesusFreke    schedule 26.08.2013
comment
Если вам непонятно, как регистры p* сопоставляются с регистрами v*, дополнительную информацию можно найти на странице code.google.com/p/smali/wiki/Регистры - person JesusFreke; 26.08.2013
comment
Спасибо, JesusFreke, это действительно то, что вы сказали, что метод имеет более 16 регистров (22). Теперь я исправил проблему с помощью предоставленного вами средства. Большое спасибо! - person lengxuehx; 27.08.2013
comment
Что такое диапазон адресов для invoke-static/range? Я пытаюсь использовать статический метод и регистрирую › v15 - person alchemist; 20.07.2016
comment
@alchemist — документы — ваш друг: source.android.com/devices /tech/dalvik/dalvik-bytecode.html. количество слов аргумента (8 бит) и регистр первого аргумента (16 бит) - person JesusFreke; 20.07.2016
comment
@JesusFreke Спасибо за ответ. Но похоже, даже это не работает для меня. Я не получил сообщение об ошибке, говорящее об использовании регистров v0-v15, но построенный apk разбился на телефоне с ошибкой: проверка времени компиляции не удалась. Пожалуйста помоги. - person alchemist; 20.07.2016
comment
Предыстория: у нас есть код, в который мы пытаемся вставить некоторые журналы отладки. Нам нужно два дополнительных регистра на метод, чтобы включить эти журналы. Что мы пробовали до сих пор: Увеличение регистров — не работает, так как регистры › v15 нарушает код. Перемещение значений регистров v0 и v1 в некоторые регистры с высоким значением, такие как v250 или что-то подобное, затем используйте v0-v1 и переназначьте значения обратно из vTMP в v0-v1 — ошибок нет, но приложение вылетает с ошибкой проверки времени компиляции. - person alchemist; 20.07.2016
comment
@alchemist Не стесняйтесь задавать актуальный вопрос :) - person JesusFreke; 20.07.2016
comment
@JesusFreke, вот и все - stackoverflow.com/questions/38501985 / - person alchemist; 21.07.2016