Skip to content

Smali语法

孔子:三人行,必有我师焉

语法记录

语法含义
nop没有操作
move vx,vy移动内容 vy 到 vx.寄存器范围必须在256以内
move/from16 vx,vy移动 vy 到 vx. vy寄存器范围只能在64k以内 vx 寄存器范围必须在256内.
move-wide/from16 vx,vy移动long/double值从vy到vx. vy寄存器范围只能在64k以内 vx是一个 256 寄存器
move-object vx,vy自动对象引用从 vy 到 vx.
move-object/from16 vx,vy移动对象引用从 vy 到 vx, vy 可以添加 64k 寄存器和 vx 可以添加 256 寄存器.
move-result vx把前面运行的结果赋值给 vx.
move-result-wide vx移动 long/double 方法调用结果赋值到vx,vx+1.
move-result-object vx移动前面的方法调用结果到 vx
move-exception vx移动异常对象 并抛出异常到 vx.
return-void没有返回值返回
return vx返回值 vx
return-wide vx返回double/long 结果 vx,vx+1.
return-object vx返回vx对象引用值
const/4 vx,lit4将4字节的参数赋值到 vx
const/16 vx,lit16将16进制数赋值到 vx
const vx, lit32将整数常量赋值到 vx
const/high16 v0, lit16将16位不变的最高位寄存器用于初始化浮点数
const-wide/16 vx, lit16将整数常量vx和vx+1寄存器扩大整数为常量..
const-wide/32 vx, lit32把 32 bit 常数 vx 和 vx+1 寄存器
const-wide vx, lit64把64 bit 常数 vx 和 vx+1 放入寄存器.
const-wide/high16 vx,lit16将16位常数 vx 和 vx+1 的最高位寄存器终于初始化值的两倍
const-string vx,string_id设定一个字符串常量 vx 字符串id
const-string/jumbo vx,string_id通过字符串索引(较大)构造一个字符串并赋给寄存器vx
const-class vx,type_id 从 type_id移动类对象和类标识(e.g. Object.class) 到 vx.
monitor-enter vx监控对象引用 vx.
monitor-exit监视器对象引用 vx.
check-cast vx, type_id检查是否对象引用
instance-of vx,vy,type_id检查是否 vy 是否是一个类的实例 type_id.
array-length vx,vy计算vy引用的数组元素并赋值到 vx.
new-instance vx,type实例化对象引用并将 vx 创建为新实例
new-array vx,vy,type_id生成新的数组 type_id 类型和 vy 元素大小并将数组赋值给 vx.
throw vx抛出一个异常对象,异常对象vx.
goto target无条件跳转.
goto/16 target无条件跳转
packed-switch vx,table实例化switch语句,查找表与常量和偏移量为常数,如表里无匹配则执行下一条
sparse-switch vx,tableswitch操作指令使用查找表与常量和偏移量为常数,如表里无匹配则执行下一条
cmpl-float在vy 比较浮点值后赋值到 vx
cmpg-float vx, vy, vz比较浮点值 vy 和 vz 和设置整数赋值到 vx.
cmpl-double vx,vy,vz比较 double 值 vy 和 vz 并设置整数 赋值到 vx.
cmpg-double vx, vy, vz比较 double 值 vy 和 vz 并设置整数 赋值到 vx.
cmp-long vx, vy, vz比较 long 值 vy 和 vz 并设置整数 赋值到 vx.
if-eq vx,vy,目标如果vx == vy注2,跳转到目标。
if-ne vx,vy,目标如果vx != vy注2,跳转到目标
if-lt vx,vy,目标如果vx < vy注2,跳转到目标
if-ge vx, vy,目标如果vx >= vy注2,跳转到目标。
if-gt vx,vy,目标如果vx > vy注2,跳转到目标
if-le vx,vy,目标如果vx <= vy注2,跳转到目标
if-eqz vx,目标如果vx == 0注2,跳转到目标。
if-nez vx,目标如果vx != 0注2,跳转到目标。
if-ltz vx,目标如果vx < 0跳转到目标
if-gez vx,目标如果vx >= 0跳转到目标.
if-gtz vx,目标如果vx > 0跳转到目标.
if-lez vx,目标如果vx <= 0跳转到目标.
aget vx,vy,vz获得vy对应的int数组中索引为vz的值并赋值给vx
aget-object vx,vy,vz获得对象引用值和 n对象引用 数组赋值到 vx vy
引用数组和vz引索
aget-boolean vx,vy,vz获得 boolean值和boolean 数组赋值到 vx vy 引用数组和vz引索
aget-byte vx,vy,vz获得 byte值把byte 数组赋值到 vx vy 引用数组和vz引索
aget-char vx, vy,vz获得vy对应的的char数组中索引为vz的值并赋值给vx
aput vx,vy,vz把integer 赋值到 vx得到整数元素组. .
aput-wide vx,vy,vz把double/long 赋值到 vx,vx+1 成double/long 数组.
aput-object vx,vy,vz把vy对象引用 赋值到 vx得到整数元素组
aput-boolean vx,vy,vz把boolean 赋值到 vx得到元素 boolean 数组 .
aput-byte vx,vy,vz把 byte 赋值到 vx得到元素 byte 数组 .
aput-char vx,vy,vz把 char 赋值到 vx 字符数组的一个元素被vy引用的数组对象.
aput-short vx,vy,vz把 short 赋值到 vx得到元素 short 数组 .
iget vx, vy, field_id读取一个实例字段到 vx. 实例从vy引用.
iget-wide vx,vy,field_id读取一个实例字段到 vx1. 实例从vy引用.
iget-object vx,vy,field_id读取一个对象引用 实例字段到 vx. 实例从vy引用.
iget-boolean vx,vy,field_id读取 boolean 实例字段到 vx. 实例从vy引用.
iget-byte vx,vy,field_id读取 byte 实例字段到 vx. 实例从vy引用.
iget-char vx,vy,field_id读取 char 实例字段到 vx. 实例从vy引用.
iget-short vx,vy,field_id读取 short 实例字段到 vx. 实例从vy引用.
iput vx,vy, field_id将vx放入一个实例字段. 实例从vy引用.
iput-wide vx,vy, field_id把 wide 数值 in vx and vx+1 注册到一个实例字段 实例从vy引用.
iput-object vx,vy,field_id把 the对象引用在vx实际化字段. 实例从vy引用.
iput-boolean vx,vy, field_id把 boolean 数值在vx实际化字段 实例从vy引用.
iput-byte vx,vy,field_id把 byte 数值在vx实际化字段. 实例从vy引用.
iput-char vx,vy,field_id把 char 数值在vx实际化字段. 实例从vy引用.
iput-short vx,vy,field_id把 short 数值在vx实际化字段. 实例从vy引用.
sget vx,field_id 从 field_id读取整个字段到 vx.
sget-wide vx, field_id从 field_id 读取静态字段到 vx 和 vx+1 寄存器.
sget-object vx,field_id读取对象引用 field_id 到 vx.
sget-boolean vx,field_id读取 boolean 静态字段 field_id 到 vx.
sget-byte vx,field_id读取 byte 静态字段 field_id 到 vx.
sget-char vx,field_id读取 char 静态字段 field_id 到 vx.
sget-short vx,field_id读取 short 静态字段 field_id 到 vx.
sput vx, field_id把 vx静态字段
sput-wide vx, field_id把 vx and vx+1 转到一个静态字段
sput-object vx,field_id对象引用 in vx 转到一个静态字段
sput-boolean vx,field_id把 boolean 赋值到 vx转到一个静态字段
sput-byte vx,field_id把 byte 赋值到 vx转到一个静态字段
sput-char vx,field_id把 char 赋值到 vx 转到一个静态字段
sput-short vx,field_id把 short 赋值到 vx 转到一个静态字段
invoke-virtual { parameters },<br> methodtocall调用一个虚拟方法与参数.
invoke-super {parameter},methodtocall调用直接父类的虚方法.
invoke-direct { parameters },<br> methodtocall调用一个方法参数,没有虚拟方法解析
invoke-static {parameters}, methodtocall调用一个静态方法与参数
invoke-interface<br> {parameters},methodtocall调用接口方法
invoke-virtual/range<br> {vx..vy},methodtocall调用虚拟方法的寄存器.指定一个寄存器和寄存器数量被传递给方法
invoke-super/range直接调用父类的虚方法。指定一个寄存器和寄存器数量被传递给方法
invoke-direct/range<br> {vx..vy},methodtocall直接调用寄存器方法指定一个寄存器和寄存器数量被传递给方法
invoke-static/range<br> {vx..vy},methodtocall调用静态方法寄存器指定一个寄存器和寄存器数量被传递给方法
invoke-interface-range调用一个接口方法寄存器,指定一个寄存器和寄存器数量被传递给方法
neg-int vx,vy计算 vx = -vy.
neg-long vx,vy计算 vx,vx+1=-(vy,vy+1)
neg-float vx,vy计算 vx = -vy
neg-double vx,vy计算 vx,vx+1=-(vy,vy+1)
int-to-long vx, vy转换整数到 vy 并转成 long in vx,vx+1.
int-to-float vx, vy转换整数到 vx 并转成 float in vx.
int-to-double vx, vy转换vy到整数 double in vx,vx+1.
long-to-int vx,vy转换 long vy 值 ,vy+1 到整数储存到 vx
long-to-float vx, vy转换 long vy 值 ,vy+1 成 float in vx.
long-to-double vx, vy转换 long vy 值 ,vy+1 成 double 赋值到 vx,vx+1.
float-to-int vx, vy转换 float vy 值到整数并赋值到 vx.
float-to-long vx,vy转换 float vy 值成long 赋值到 vx.
float-to-double vx, vy转换 float vy 值成double 赋值到 vx,vx+1.
double-to-int vx, vy转换 double vy 值 ,vy+1 到整数赋值到 vx.
double-to-long vx, vy转换 double vy 值 ,vy+1 成long 赋值到 vx,vx+1.
double-to-float vx, vy转换 double vy 值 ,vy+1 成float 赋值到 vx.
int-to-byte vx,vy转换 int vy 值到 byte 值,并保存到vx.
int-to-char vx,vy转换 int vy 值到char 值,并保存到vx.
int-to-short vx,vy转换 int vy 值到 short 值,并保存到vx.
add-int vx,vy,vz计算 vy + vz 并将结果放到 vx.
sub-int vx,vy,vz计算 vy - vz 并将结果放到 vx.
mul-int vx, vy, vzvz 与 vy 相乘并将结果转int放到 vx.
div-int vx,vy,vzDivides vy 与 vz 并将结果赋值到 vx.
rem-int vx,vy,vz计算 vy % vz 并将结果赋值到 vx.
and-int vx, vy, vz计算 vy AND vz 并将结果赋值到vx.
or-int vx, vy, vz计算 vy OR vz 并将结果赋值到vx.
xor-int vx, vy, vz计算 vy XOR vz 并将结果赋值到vx.
shl-int vx, vy, vz转换 vy 指定的位置留下后并储存结果 到 vx.
shr-int vx, vy, vz从vy指定位置转换并储存到 vx.
ushr-int vx, vy, vz无符号右移 (>>>) vy 指定位置后将结果储存到 vx
add-long vx, vy, vz添加 vy 到 vz 并将结果赋值到 vx1.
sub-long vx,vy,vz计算 vy - vz 并将结果赋值到 vx1.
mul-long vx,vy,vz计算 vy * vz 并将结果赋值到 vx1.
div-long vx, vy, vz计算 vy / vz 并将结果赋值到 vx1.
rem-long vx,vy,vz计算 vy % vz 并将结果赋值到 vx1.
and-long vx, vy, vz计算 the vy AND vz 并将结果赋值到 vx1.
or-long vx, vy, vz计算 the vy OR vz 并将结果赋值到 vx1.
xor-long vx, vy, vz计算 the vy XOR vz 并将结果赋值到 vx1.
shl-long vx, vy, vzShifts left vy by vz positions 并将结果储存在 vx1.
shr-long vx,vy,vzShifts right vy by vz positions 并将结果储存在 vx1.
ushr-long vx, vy, vzUnsigned shifts right vy by vz positions 并将结果储存在 vx1.
add-float vx,vy,vz添加 vy 到 vz 并将结果赋值到 vx.
sub-float vx,vy,vz计算 vy - vz 并将结果赋值到 vx.
mul-float vx, vy, vz增加 vy 与 vz 并将结果赋值到 vx.
div-float vx, vy, vz计算 vy / vz 并将结果赋值到 vx.
rem-float vx,vy,vz计算 vy % vz 并将结果赋值到 vx.
add-double vx,vy,vz添加 vy 到 vz 并将结果赋值到 vx1.
sub-double vx,vy,vz计算 vy - vz 并将结果赋值到 vx1.
mul-double vx, vy, vz增加 vy 与 vz 并将结果赋值到 vx1.
div-double vx, vy, vz计算 vy / vz 并将结果赋值到 vx1.
rem-double vx,vy,vz计算 vy % vz 并将结果赋值到 vx1.
add-int/2addr vx,vy添加 vy 到 vx.
sub-int/2addr vx,vy计算 vx - vy 并将结果赋值到 vx.
mul-int/2addr vx,vy相乘 vx 和 vy.
div-int/2addr vx,vyDivides vx 和 vy 并将结果赋值到 vx.
rem-int/2addr vx,vy计算 vx % vy 并将结果赋值到 vx
and-int/2addr vx, vy计算 vx AND vy 并将结果赋值到 vx.
or-int/2addr vx, vy计算 vx OR vy 并将结果赋值到 vx.
xor-int/2addr vx, vy计算 vx XOR vy 并将结果赋值到 vx.
shl-int/2addr vx, vyShifts vx left by vy positions.
shr-int/2addr vx, vy从 vy 转换到 vx.
ushr-int/2addr vx, vy无符号右移vy到vx的指定位置
add-long/2addr vx,vy添加 vy 到 vx1.
sub-long/2addr vx,vy计算 vx - vy 并将结果赋值到 vx1.
mul-long/2addr vx,vy计算 vx * vy 并将结果赋值到 vx1.
div-long/2addr vx, vy计算 vx / vy 并将结果赋值到 vx1.
rem-long/2addr vx,vy计算 vx % vy 并将结果赋值到 vx1.
and-long/2addr vx, vy计算 vx AND vy 并将结果赋值到 vx1.
or-long/2addr vx, vy计算 vx OR vy 并将结果赋值到 vx1.
xor-long/2addr vx, vy计算 vx XOR vy 并将结果赋值到 vx1.
shl-long/2addr vx, vyShifts left the 赋值到 vx,vx+1 从 vy 指定的位置 并将结果储存在 vx,vx+1.
shr-long/2addr vx, vyShifts right the 赋值到 vx,vx+1 从 vy 指定的位置 并将结果储存在 vx,vx+1.
ushr-long/2addr vx, vy无条件转移vy赋值到 vx,vx+1 并将结果储存在
vx,vx+1.
add-float/2addr vx,vy添加 vy 到 vx.
sub-float/2addr vx,vy计算 vx - vy 并将结果储存在 vx.
mul-float/2addr vx, vy相乘 vx 和 vy.
div-float/2addr vx, vy计算 vx / vy 并将结果赋值到 vx.
rem-float/2addr vx,vy计算 vx / vy 并将结果赋值到 vx.
add-double/2addr vx, vy添加 vy 到 vx1.
sub-double/2addr vx, vy计算 vx - vy 并将结果赋值到 vx1.
mul-double/2addr vx, vy相乘 vx 和 vy1.
div-double/2addr vx, vy计算 vx / vy 并将结果赋值到 vx1.
rem-double/2addr vx,vy计算 vx % vy 并将结果赋值到 vx1.
add-int/lit16 vx,vy,lit16添加 vy to lit16 并将结果储存到 vx
sub-int/lit16 vx,vy,lit16计算 vy - lit16 并将结果储存到 vx
mul-int/lit16 vx,vy,lit16计算 vy * lit16 并将结果储存到 vx
div-int/lit16 vx,vy,lit16计算 vy / lit16 并将结果储存到 vx
rem-int/lit16 vx,vy,lit16计算 vy % lit16 并将结果储存到 vx
and-int/lit16 vx,vy,lit16计算 vy AND lit16 并将结果储存到 vx
or-int/lit16 vx,vy,lit16计算 vy OR lit16 并将结果储存到 vx
xor-int/lit16 vx,vy,lit16计算 vy XOR lit16 并将结果储存到 vx
add-int/lit8 vx,vy,lit8添加 vy to lit8 并将结果储存到 vx
sub-int/lit8 vx,vy,lit8计算 vy - lit8 并将结果储存到 vx
mul-int/lit8 vx,vy,lit8增加 vy 与 lit8 8-bit 文字常量 并将结果赋值到 vx.
div-int/lit8 vx,vy,lit8计算 vy / lit8 并将结果储存到 vx
rem-int/lit8 vx,vy,lit8计算 vy % lit8 并将结果储存到 vx
and-int/lit8 vx,vy,lit8计算 vy AND lit8 并将结果储存到 vx
or-int/lit8 vx, vy, lit8计算 vy OR lit8 并将结果赋值到 vx.
xor-int/lit8 vx, vy, lit8计算 vy XOR lit8 并将结果赋值到 vx.
shl-int/lit8 vx, vy, lit8转换 v0 留下指定位置
shr-int/lit8 vx, vy, lit8从指定位置读取文字常量并将结果储存到 vx.
ushr-int/lit8 vx, vy, lit8无符号右移 v0 (>>>)
execute-inline {parameters},inline ID执行内联方法内联 ID.
invoke-direct-empty占位符修改空对象.<init>. 期间使用nop正常执行6.
iget-quick vx,vy,offset从vy实例的数据区获得的数据储存到vx
iget-wide-quick vx,vy,offset获取对象引用偏移vy值到vx,vx+16.
iget-object-quick vx,vy,offset获取对象引用 偏移vy值到vx6.
iput-quick vx,vy,offset vy实例数据抵消并将值储存在 vx.
iput-wide-quick vx,vy,offset将值储存在 vx,vx+1 to offset in vy instance's data area6.
iput-object-quick vx,vy,offset将对象引用值储存在vx来抵消vy实例的数据区域

更多语法

vim
/*	smali invoke	*/
invoke-virtual-quick {parameters},vtable<br> offset				#调用方法目地址对象
invoke-virtual-quick/range {parameter<br> range},vtable offset	#调用一个方法使用vtable的目标对象
invoke-super-quick {parameters},vtable<br> offset				#调用一个虚方法直接在目标对象的父类直接使用.
invoke-super-quick/range {register<br> range},vtable offset		#调用一个虚方法在目标对象父类使用.

提示

  • filled-new-array {parameters},type_id
    生成新数组 type_id 并填充 parameters5. 生成的数组可以通过 move-result-object 引用后使用 filled-new-array 指令
  • filled-new-array-range {vx..vy},type_id
    生成一个新数组 type_id 和填补参数 生成新数组引用可以通过 move-result-object 指令使用 filled-new-array fill-array-data vx,array_data_offset 填充数组引用到vx

Copyright © manosP . 2023