【问题标题】:Issue with smali codesmali 代码问题
【发布时间】:2016-01-11 14:06:22
【问题描述】:

让我们假设以下示例代码

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

我想我误解了其中一条线。我究竟做错了什么?

【问题讨论】:

  • 如果代码是result = result + i; 是正确的。也许是错字?
  • @Nils:你能确认这是一个错字吗?
  • 啊,是的,有一个错字。对于那个很抱歉。我在上面修改过。
  • 不过我还是不明白为什么 v1 会递增并返回。谁能帮我翻译一下 smali 代码的前两个循环?

标签: android disassembly smali


【解决方案1】:

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

重新表述您对代码的分析:

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; 行。

【讨论】:

  • 查看答案/此处空间不足
  • 非常感谢您的帮助 JesusFreke。我的错。显然,无论出于何种原因,我将我的 result+i 解释为 result 加 1 并且感到困惑。现在它完全有道理。很抱歉。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多