なぜこれが無効smaliレジスタのですか?

dugof:

私は、コードのこの部分を注射しinvoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V逆コンパイルアプリで。

このような:

.line 70
    move-object/from16 v0, p0

    iget-object v0, v0, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->sharedPreferencesNotificationsHelper:Lcom/bee7/sdk/common/util/SharedPreferencesNotificationsHelper;

    move-object/from16 v21, v0

    sget v22, Lcom/bee7/gamewall/BannerNotification;->NUMBER_OF_REWARD_BANNER_NOTIFICATIONS_LAYOUTS:I

    invoke-virtual/range {v21 .. v22}, Lcom/bee7/sdk/common/util/SharedPreferencesNotificationsHelper;->getNextRewardNotificationLayout(I)I

    .line 76
    sget v21, Lcom/bee7/gamewall/R$layout;->gamewall_banner_notification_reward_0:I

    move-object/from16 v0, p0

    move/from16 v1, v21

    invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V     
    invoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V

    .line 77
    const/16 v21, 0x1

    move/from16 v0, v21

    move-object/from16 v1, p0

    iput v0, v1, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->numberOfOffersInBannerNotification:I

しかし、私は次のメッセージrechieve apktoolでそれを構築しようとしたとき:

com.outfit7.talkingtomcandyrun\smali\com\bee7\gamewall\dialogs\BannerNotificationDialog.smali[179,106] Invalid register: v25. Must be between v0 and v15, inclusive.

この行を参照:invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V

なぜ私はこのエラーを取得していますか?私もレジスタが表示されていないv25コードで。

編集:

私はいくつかの他のアプリでそれを試してみましたが、エラーは常に最高のレジスタに1を加えることに気づきました。方法で最高のレジスタがあるのであればv17、それは言うだろうInvalid register: v18

JesusFreke:

あなたはのドキュメントを見ればinvoke-staticオペコード、あなたはそれが唯一の参照レジスタ0-15にそれを可能にする各パラメータレジスタを、エンコードするために4ビットを使用していることがわかります。

p0 パラメータレジスタであり、パラメータレジスタは、メソッドの「割り当て」レジスタ範囲の端にあります。

この方法は、(、30個のレジスタを言っているのであれば、.registers 30)、そしてそれは5(非ロング/非二重)の引数があり、その後、メソッドの引数は、V25-V29ように渡されます。pNNレジスタは、最後のレジスタのこの範囲に単なるエイリアスです。したがって、この場合には、p0別名ですv25p1別名であるv26など、

引数の数をカウントアップする際にも、暗黙的に含めることを忘れないでくださいthis、常に最初渡される引数である非静的メソッドの引数を、。すなわちp0

この場合は、あなたの最善の策が呼び出す静的使用することです/レジスタの連続した範囲を受け入れる代わりに、範囲、および直接これらのより高いのレジスタを参照することができます。

たとえば、

invoke-static/range {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V`

別のオプションは使用することですmove-objectの値を交換するためにp0一時的に下位レジスタと、その後、後で戻ってそれを交換します。あなたは見つけるか、もちろん、スワップを行うために、未使用のレジスタを作成する必要があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=181678&siteId=1