首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >smali代码问题

smali代码问题
EN

Stack Overflow用户
提问于 2016-01-11 14:06:22
回答 1查看 359关注 0票数 0

让我们假设下面的示例代码

代码语言:javascript
复制
public static int addition() {
int result = 1;
for(int i = 1; i < 10000 ; i++)
result = result + i;
}

相应的smali代码(0002位于if-ge旁边):

代码语言:javascript
复制
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等等。

代码语言:javascript
复制
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

我想我误解了其中一句台词。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-29 19:07:43

是的,这与您发布的java代码相匹配。v1resultv0i

要更改对代码的分析,请执行以下操作:

代码语言:javascript
复制
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;行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34723463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档