smali 代码问题
Issue with smali code
让我们假设下面的示例代码
public static int addition() {
int result = 1;
for(int i = 1; i < 10000 ; i++)
result = result + i;
}
和对应的smali代码(0002在if-ge旁边):
const/4 v0,#int 1
move v1,v0
const/16 v2,#int 10000
if-ge v0,v2,<0x0a>
add-int/2addr v1,v0
add-int/lit8 v0,v0,#int 1
goto <0002>
return v1
我试图理解相应的 smali(汇编)代码,但遇到了一行现在对我来说毫无意义的行(标记为 ???)。如果我没记错的话,v1 的值每轮都会增加 v0 的值,这根本没有意义——第一轮:v1 = 2;第二轮 v1 = 4 依此类推
put 1 into register v0 // v0 = 1
move value register v0 into v1 // v0 = 1 ; v1 = 1
put 10000 into register v2 // v0 = 1 ; v1 = 1 ; v2 = 10000
if v0 >= v2 goto 0x0a // v0 = 1 ; v1 = 1 ; v2 = 10000
v1 = v1 + v0 (???) // v0 = 1 ; v1 = 2 ; v2 = 10000
v0 = 1 + v0 // v0 = 2 ; v1 = 2 ; v2 = 10000
goto 0x02
return v1
我想我误解了其中一行。我究竟做错了什么?
是的,与您发布的 java 代码匹配。 v1
是 result
,v0
是 i
。
重新表述您对代码的分析:
put 1 into variable i // i = 1
move value i into result // i = 1 ; result = 1
put 10000 into register v2 // i = 1 ; result = 1 ; v2 = 10000
if i >= v2 goto 0x0a // i = 1 ; result = 1 ; v2 = 10000
result = i + result // i = 1 ; result = 2 ; v2 = 10000
i = 1 + i // i = 2 ; result = 2 ; v2 = 10000
goto 0x02
return result
您的问题具体是关于 add-int/2addr v1,v0
指令,它类似于原始 java 中的 result = result + i;
行。
让我们假设下面的示例代码
public static int addition() {
int result = 1;
for(int i = 1; i < 10000 ; i++)
result = result + i;
}
和对应的smali代码(0002在if-ge旁边):
const/4 v0,#int 1
move v1,v0
const/16 v2,#int 10000
if-ge v0,v2,<0x0a>
add-int/2addr v1,v0
add-int/lit8 v0,v0,#int 1
goto <0002>
return v1
我试图理解相应的 smali(汇编)代码,但遇到了一行现在对我来说毫无意义的行(标记为 ???)。如果我没记错的话,v1 的值每轮都会增加 v0 的值,这根本没有意义——第一轮:v1 = 2;第二轮 v1 = 4 依此类推
put 1 into register v0 // v0 = 1
move value register v0 into v1 // v0 = 1 ; v1 = 1
put 10000 into register v2 // v0 = 1 ; v1 = 1 ; v2 = 10000
if v0 >= v2 goto 0x0a // v0 = 1 ; v1 = 1 ; v2 = 10000
v1 = v1 + v0 (???) // v0 = 1 ; v1 = 2 ; v2 = 10000
v0 = 1 + v0 // v0 = 2 ; v1 = 2 ; v2 = 10000
goto 0x02
return v1
我想我误解了其中一行。我究竟做错了什么?
是的,与您发布的 java 代码匹配。 v1
是 result
,v0
是 i
。
重新表述您对代码的分析:
put 1 into variable i // i = 1
move value i into result // i = 1 ; result = 1
put 10000 into register v2 // i = 1 ; result = 1 ; v2 = 10000
if i >= v2 goto 0x0a // i = 1 ; result = 1 ; v2 = 10000
result = i + result // i = 1 ; result = 2 ; v2 = 10000
i = 1 + i // i = 2 ; result = 2 ; v2 = 10000
goto 0x02
return result
您的问题具体是关于 add-int/2addr v1,v0
指令,它类似于原始 java 中的 result = result + i;
行。