const/4 v1, 0x1 这里大家应该知道 v1=1。但是真真正正想过为什么?也许很多人都知道,这里是写给不知道的。 首先4代表4字节,那么就是4位的。所以呢 v1=0*4+1=1 const/4 v0,0x1 0*4 + 1 const/16 v2, 0x10 这里的话,16字节,那么16位对吧。所以v2 = 1*16+0 = 16 const/16 v3, 0x28 16字节,16位。v3 = 2*16+8 = 40; .local 4 //本地4个寄存器,也就是下面的v0,v1,v2,v3 const/4 v2, 0x1 //4字节常量 v2=1 const/16 v1, 0x10 //16字节常量 v1=16 :local v1, "length":I //int length=v1 if-nez v1,:cond_1 //如果v1不等于0,这跳转至cond_1 :cond_0 //cond_0标签 :goto_0 //goto_0标签 return v2 //返回v2的值 :cond_1 //开始执行cond_1标签代码 const/4 v0,0x0 //4字节常量 v0=0 :local v0, "i":I //int i=v0 :goto_1 //开始执行goto_1标签代码 if-lt v0, v1, :cond_2 //如果v0小于v1,则跳转至cond_2 const/16 v3,0x28 //如果v0大于等于v1,则执行下面语句: 16字节常量v3=40 if-le v1,v3, :cond_0 //如果v1小于等于v3,则跳转至cond_0,即返回v2的值 const/4 v2, 0x0 //如果v1大于v3,则4字节常量v2=0 goto:goto_0 //跳转至goto_0,即返回v2的值 :cond_2 //cond_2标签 xor-int/lit8 v1, v1, 0x3b //将第二个v1寄存器中的值与0x3b(59)进行异或运算,得到的值赋值给第一个v1寄存器中 add-int/lit8 v0, v0, 0x1 //将第二个v0寄存器中的值加上0x1(1),所得的值放入第一个v0寄存器中 goto:goto_1 //跳转值goto_1标签
翻译成java代码就是
int v2 = 1; int v1 = 16; if (v1 != 0){ for (int v0 = 0; v0 < v1;){ v1 = v1 ^ 59; v0++; } if (v1 > 40){ v2 = 0; } } return v2;