mirror of
https://github.com/revanced/smali.git
synced 2025-05-09 10:54:29 +02:00
Added support for opcodes using format 12x
git-svn-id: https://smali.googlecode.com/svn/trunk@7 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
b759a665c8
commit
e170edc52c
@ -93,14 +93,15 @@ tokens {
|
|||||||
I_METHOD_RETURN_TYPE;
|
I_METHOD_RETURN_TYPE;
|
||||||
I_REGISTERS;
|
I_REGISTERS;
|
||||||
I_STATEMENTS;
|
I_STATEMENTS;
|
||||||
I_STATEMENT_FORMAT35c_METHOD;
|
|
||||||
I_STATEMENT_FORMAT3rc_METHOD;
|
|
||||||
I_STATEMENT_FORMAT10x;
|
I_STATEMENT_FORMAT10x;
|
||||||
I_STATEMENT_FORMAT11x;
|
I_STATEMENT_FORMAT11x;
|
||||||
|
I_STATEMENT_FORMAT12x;
|
||||||
I_STATEMENT_FORMAT21c_TYPE;
|
I_STATEMENT_FORMAT21c_TYPE;
|
||||||
I_STATEMENT_FORMAT21c_FIELD;
|
I_STATEMENT_FORMAT21c_FIELD;
|
||||||
I_STATEMENT_FORMAT22c_FIELD;
|
I_STATEMENT_FORMAT22c_FIELD;
|
||||||
I_STATEMENT_FORMAT21c_STRING;
|
I_STATEMENT_FORMAT21c_STRING;
|
||||||
|
I_STATEMENT_FORMAT35c_METHOD;
|
||||||
|
I_STATEMENT_FORMAT3rc_METHOD;
|
||||||
I_REGISTER_RANGE;
|
I_REGISTER_RANGE;
|
||||||
I_REGISTER_LIST;
|
I_REGISTER_LIST;
|
||||||
}
|
}
|
||||||
@ -230,7 +231,10 @@ instruction
|
|||||||
-> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_NAME_FORMAT10x)
|
-> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_NAME_FORMAT10x)
|
||||||
| //e.g. move-result-object v1
|
| //e.g. move-result-object v1
|
||||||
INSTRUCTION_NAME_FORMAT11x REGISTER
|
INSTRUCTION_NAME_FORMAT11x REGISTER
|
||||||
-> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_NAME_FORMAT11x REGISTER)
|
-> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_NAME_FORMAT11x REGISTER)
|
||||||
|
| //e.g. move v1 v2
|
||||||
|
INSTRUCTION_NAME_FORMAT12x REGISTER REGISTER
|
||||||
|
-> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] INSTRUCTION_NAME_FORMAT12x REGISTER REGISTER)
|
||||||
| //e.g. sget_object v0 java/lang/System/out LJava/io/PrintStream;
|
| //e.g. sget_object v0 java/lang/System/out LJava/io/PrintStream;
|
||||||
INSTRUCTION_NAME_FORMAT21c_FIELD REGISTER full_field_name_and_type
|
INSTRUCTION_NAME_FORMAT21c_FIELD REGISTER full_field_name_and_type
|
||||||
-> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_NAME_FORMAT21c_FIELD REGISTER full_field_name_and_type)
|
-> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_NAME_FORMAT21c_FIELD REGISTER full_field_name_and_type)
|
||||||
@ -280,6 +284,7 @@ simple_name
|
|||||||
instruction_name
|
instruction_name
|
||||||
: INSTRUCTION_NAME_FORMAT10x
|
: INSTRUCTION_NAME_FORMAT10x
|
||||||
| INSTRUCTION_NAME_FORMAT11x
|
| INSTRUCTION_NAME_FORMAT11x
|
||||||
|
| INSTRUCTION_NAME_FORMAT12x
|
||||||
| INSTRUCTION_NAME_FORMAT21c_FIELD
|
| INSTRUCTION_NAME_FORMAT21c_FIELD
|
||||||
| INSTRUCTION_NAME_FORMAT21c_STRING
|
| INSTRUCTION_NAME_FORMAT21c_STRING
|
||||||
| INSTRUCTION_NAME_FORMAT21c_TYPE
|
| INSTRUCTION_NAME_FORMAT21c_TYPE
|
||||||
@ -330,39 +335,6 @@ double_literal
|
|||||||
ACCESS_SPEC
|
ACCESS_SPEC
|
||||||
: 'public' | 'private' | 'static' | 'constructor' | 'final';
|
: 'public' | 'private' | 'static' | 'constructor' | 'final';
|
||||||
|
|
||||||
INSTRUCTION_NAME_FORMAT35c_METHOD
|
|
||||||
: 'invoke-virtual'
|
|
||||||
| 'invoke-super'
|
|
||||||
| 'invoke-direct'
|
|
||||||
| 'invoke-static'
|
|
||||||
| 'invoke-interface'
|
|
||||||
;
|
|
||||||
|
|
||||||
INSTRUCTION_NAME_FORMAT3rc_METHOD
|
|
||||||
: 'invoke-virtual/range'
|
|
||||||
| 'invoke-super/range'
|
|
||||||
| 'invoke-direct/range'
|
|
||||||
| 'invoke-static/range'
|
|
||||||
| 'invoke-interface/range'
|
|
||||||
;
|
|
||||||
|
|
||||||
INSTRUCTION_NAME_FORMAT22c_FIELD
|
|
||||||
: 'iget'
|
|
||||||
| 'iget-wide'
|
|
||||||
| 'iget-object'
|
|
||||||
| 'iget-boolean'
|
|
||||||
| 'iget-byte'
|
|
||||||
| 'iget-char'
|
|
||||||
| 'iget-short'
|
|
||||||
| 'iput'
|
|
||||||
| 'iput-wide'
|
|
||||||
| 'iput-object'
|
|
||||||
| 'iput-boolean'
|
|
||||||
| 'iput-byte'
|
|
||||||
| 'iput-char'
|
|
||||||
| 'iput-short'
|
|
||||||
;
|
|
||||||
|
|
||||||
INSTRUCTION_NAME_FORMAT10x
|
INSTRUCTION_NAME_FORMAT10x
|
||||||
: 'return-void'
|
: 'return-void'
|
||||||
| 'nop';
|
| 'nop';
|
||||||
@ -379,6 +351,65 @@ INSTRUCTION_NAME_FORMAT11x
|
|||||||
| 'monitor-exit'
|
| 'monitor-exit'
|
||||||
| 'throw';
|
| 'throw';
|
||||||
|
|
||||||
|
INSTRUCTION_NAME_FORMAT12x
|
||||||
|
: 'move'
|
||||||
|
| 'move-wide'
|
||||||
|
| 'move-object'
|
||||||
|
| 'array-length'
|
||||||
|
| 'neg-int'
|
||||||
|
| 'not-int'
|
||||||
|
| 'neg-long'
|
||||||
|
| 'not-long'
|
||||||
|
| 'neg-float'
|
||||||
|
| 'neg-double'
|
||||||
|
| 'int-to-long'
|
||||||
|
| 'int-to-float'
|
||||||
|
| 'int-to-double'
|
||||||
|
| 'long-to-int'
|
||||||
|
| 'long-to-float'
|
||||||
|
| 'long-to-double'
|
||||||
|
| 'float-to-int'
|
||||||
|
| 'float-to-long'
|
||||||
|
| 'float-to-double'
|
||||||
|
| 'double-to-int'
|
||||||
|
| 'double-to-long'
|
||||||
|
| 'double-to-float'
|
||||||
|
| 'int-to-byte'
|
||||||
|
| 'int-to-char'
|
||||||
|
| 'int-to-short'
|
||||||
|
| 'add-int/2addr'
|
||||||
|
| 'sub-int/2addr'
|
||||||
|
| 'mul-int/2addr'
|
||||||
|
| 'div-int/2addr'
|
||||||
|
| 'rem-int/2addr'
|
||||||
|
| 'and-int/2addr'
|
||||||
|
| 'or-int/2addr'
|
||||||
|
| 'xor-int/2addr'
|
||||||
|
| 'shl-int/2addr'
|
||||||
|
| 'shr-int/2addr'
|
||||||
|
| 'ushr-int/2addr'
|
||||||
|
| 'add-long/2addr'
|
||||||
|
| 'sub-long/2addr'
|
||||||
|
| 'mul-long/2addr'
|
||||||
|
| 'div-long/2addr'
|
||||||
|
| 'rem-long/2addr'
|
||||||
|
| 'and-long/2addr'
|
||||||
|
| 'or-long/2addr'
|
||||||
|
| 'xor-long/2addr'
|
||||||
|
| 'shl-long/2addr'
|
||||||
|
| 'shr-long/2addr'
|
||||||
|
| 'ushr-long/2addr'
|
||||||
|
| 'add-float/2addr'
|
||||||
|
| 'sub-float/2addr'
|
||||||
|
| 'mul-float/2addr'
|
||||||
|
| 'div-float/2addr'
|
||||||
|
| 'rem-float/2addr'
|
||||||
|
| 'add-double/2addr'
|
||||||
|
| 'sub-double/2addr'
|
||||||
|
| 'mul-double/2addr'
|
||||||
|
| 'div-double/2addr'
|
||||||
|
| 'rem-double/2addr';
|
||||||
|
|
||||||
INSTRUCTION_NAME_FORMAT21c_FIELD
|
INSTRUCTION_NAME_FORMAT21c_FIELD
|
||||||
: 'sget'
|
: 'sget'
|
||||||
| 'sget-wide'
|
| 'sget-wide'
|
||||||
@ -403,6 +434,39 @@ INSTRUCTION_NAME_FORMAT21c_TYPE
|
|||||||
: 'check-cast'
|
: 'check-cast'
|
||||||
| 'new-instance'
|
| 'new-instance'
|
||||||
| 'const-class';
|
| 'const-class';
|
||||||
|
|
||||||
|
INSTRUCTION_NAME_FORMAT22c_FIELD
|
||||||
|
: 'iget'
|
||||||
|
| 'iget-wide'
|
||||||
|
| 'iget-object'
|
||||||
|
| 'iget-boolean'
|
||||||
|
| 'iget-byte'
|
||||||
|
| 'iget-char'
|
||||||
|
| 'iget-short'
|
||||||
|
| 'iput'
|
||||||
|
| 'iput-wide'
|
||||||
|
| 'iput-object'
|
||||||
|
| 'iput-boolean'
|
||||||
|
| 'iput-byte'
|
||||||
|
| 'iput-char'
|
||||||
|
| 'iput-short'
|
||||||
|
;
|
||||||
|
|
||||||
|
INSTRUCTION_NAME_FORMAT35c_METHOD
|
||||||
|
: 'invoke-virtual'
|
||||||
|
| 'invoke-super'
|
||||||
|
| 'invoke-direct'
|
||||||
|
| 'invoke-static'
|
||||||
|
| 'invoke-interface'
|
||||||
|
;
|
||||||
|
|
||||||
|
INSTRUCTION_NAME_FORMAT3rc_METHOD
|
||||||
|
: 'invoke-virtual/range'
|
||||||
|
| 'invoke-super/range'
|
||||||
|
| 'invoke-direct/range'
|
||||||
|
| 'invoke-static/range'
|
||||||
|
| 'invoke-interface/range'
|
||||||
|
;
|
||||||
|
|
||||||
/*since SIMPLE_NAME is so all-encompassing, it includes all integer literals
|
/*since SIMPLE_NAME is so all-encompassing, it includes all integer literals
|
||||||
and a subset of the possible floating point literals. For floating point
|
and a subset of the possible floating point literals. For floating point
|
||||||
|
@ -261,7 +261,16 @@ instruction returns[Instruction instruction]
|
|||||||
short regA = parseRegister_byte($REGISTER.text);
|
short regA = parseRegister_byte($REGISTER.text);
|
||||||
|
|
||||||
$instruction = Format11x.Format.make(dexFile, opcode.value, regA);
|
$instruction = Format11x.Format.make(dexFile, opcode.value, regA);
|
||||||
}
|
}
|
||||||
|
| //e.g. move v1 v2
|
||||||
|
^(I_STATEMENT_FORMAT12x INSTRUCTION_NAME_FORMAT12x registerA=REGISTER registerB=REGISTER)
|
||||||
|
{
|
||||||
|
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_NAME_FORMAT12x.text);
|
||||||
|
byte regA = parseRegister_nibble($registerA.text);
|
||||||
|
byte regB = parseRegister_nibble($registerB.text);
|
||||||
|
|
||||||
|
$instruction = Format12x.Format.make(dexFile, opcode.value, regA, regB);
|
||||||
|
}
|
||||||
| //e.g. sget_object v0 java/lang/System/out LJava/io/PrintStream;
|
| //e.g. sget_object v0 java/lang/System/out LJava/io/PrintStream;
|
||||||
^(I_STATEMENT_FORMAT21c_FIELD INSTRUCTION_NAME_FORMAT21c_FIELD REGISTER full_field_name_and_type)
|
^(I_STATEMENT_FORMAT21c_FIELD INSTRUCTION_NAME_FORMAT21c_FIELD REGISTER full_field_name_and_type)
|
||||||
{
|
{
|
||||||
@ -384,6 +393,7 @@ simple_name
|
|||||||
instruction_name returns[String value]
|
instruction_name returns[String value]
|
||||||
: INSTRUCTION_NAME_FORMAT10x
|
: INSTRUCTION_NAME_FORMAT10x
|
||||||
| INSTRUCTION_NAME_FORMAT11x
|
| INSTRUCTION_NAME_FORMAT11x
|
||||||
|
| INSTRUCTION_NAME_FORMAT12x
|
||||||
| INSTRUCTION_NAME_FORMAT21c_FIELD
|
| INSTRUCTION_NAME_FORMAT21c_FIELD
|
||||||
| INSTRUCTION_NAME_FORMAT21c_STRING
|
| INSTRUCTION_NAME_FORMAT21c_STRING
|
||||||
| INSTRUCTION_NAME_FORMAT21c_TYPE
|
| INSTRUCTION_NAME_FORMAT21c_TYPE
|
||||||
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* [The "BSD licence"]
|
||||||
|
* Copyright (c) 2009 Ben Gruver
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.JesusFreke.dexlib.code.Format;
|
||||||
|
|
||||||
|
import org.JesusFreke.dexlib.code.Instruction;
|
||||||
|
import org.JesusFreke.dexlib.code.Opcode;
|
||||||
|
import org.JesusFreke.dexlib.DexFile;
|
||||||
|
|
||||||
|
public class Format12x extends Format
|
||||||
|
{
|
||||||
|
public static final Format12x Format = new Format12x();
|
||||||
|
|
||||||
|
private Format12x() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instruction make(DexFile dexFile, byte opcode, byte regA, byte regB) {
|
||||||
|
byte[] bytes = new byte[2];
|
||||||
|
|
||||||
|
Opcode op = Opcode.getOpcodeByValue(opcode);
|
||||||
|
|
||||||
|
checkOpcodeFormat(op);
|
||||||
|
|
||||||
|
if (regA >= 1<<4 ||
|
||||||
|
regB >= 1<<4) {
|
||||||
|
throw new RuntimeException("The register number must be less than v16");
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes[0] = opcode;
|
||||||
|
bytes[1] = (byte)((regB << 4) | regA);
|
||||||
|
|
||||||
|
return new Instruction(dexFile, bytes, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getByteCount()
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormatName()
|
||||||
|
{
|
||||||
|
return "12x";
|
||||||
|
}
|
||||||
|
}
|
@ -86,12 +86,14 @@
|
|||||||
invoke-virtual/range {v1 .. v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String;
|
invoke-virtual/range {v1 .. v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String;
|
||||||
move-result-object v1
|
move-result-object v1
|
||||||
|
|
||||||
|
move-object v2 v1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
check-cast v4 Landroid/app/Activity;
|
check-cast v4 Landroid/app/Activity;
|
||||||
|
|
||||||
invoke-virtual {v0,v1} android/widget/TextView.setText(Ljava/lang/CharSequence;)V
|
invoke-virtual {v0,v2} android/widget/TextView.setText(Ljava/lang/CharSequence;)V
|
||||||
invoke-virtual {v4,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V
|
invoke-virtual {v4,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V
|
||||||
|
|
||||||
return-void
|
return-void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user