这篇文章介绍了一些常见的指令语法,
想要知道更全的指令语法,请见:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
.标记
.field 变量
.method 方法的起始
.end method 方法的终止
.locals 本地寄存器数目(总寄存器数reg - 参数寄存器数目para)
移动
move vx,vy 将vy的内容移动到vx中。 两个寄存器必须是最前面256个寄存器中之一。
move-object vx,vy 移动对象的引用。
move-result vx 将前一个方法的结果值移动到vx寄存器中
move-result-wide vx 与上条相似,但是移动64位结果到vx,vx+1
返回值
return-void 返回空值
return vx 返回vx寄存器的值
return-object vx 返回vx寄存器的值(对象)
常量定义
const/4 vx,lit4 移动4bit常量到vx 例如:const/4 v0, 0x0
const/16 vx,lit16 移动16bit常量到vx 例如:const/16 v0, #int 10
const vx, lit32 移动integer常量到vx 例如:const v0, #12345678 // #00BC614E
const-string vx,string_id 移动String的引用到vx 例如:const-string v3, "none"
跳转
if-eqz vx,target vx为0,跳转到目标
if-nez vx,target vx非0,跳转到目标
if-gez vx,target vx>=0 ,跳转到目标
if-ltz vx,target vx<0 ,跳转到目标
结论:eq ,e是等于;ne是不等于 g是大于,l是小于 ,z是零。
if-eq vx,vy,target ;if-ne vx,vy,target;if-ge vx, vy,target;if-ltz vx,target 类似可知。
当然还有无条件跳转的 goto target
读取,写入寄存器
sput-object vx,field_id 将对象引用放入静态域内:方向 vx->field_id
iput vx,vy, field_id 将vx的放入实例域内,vx是vy的引用对象之一
对象创建
new-instance vx,type 创建 type类型的对象,放入vx中
方法调用
invoke-virtual { parameters }, methodtocall 使用参数调用虚方法
invoke-super {parameter},methodtocall 使用参数调用父类方法
invoke-direct { parameters }, methodtocall
invoke-static {parameters}, methodtocall