Проблема со smali-кодом

Предположим, что следующий пример кода

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

Кажется, я неправильно понимаю одну из строк. Что я делаю не так?


person Nils    schedule 11.01.2016    source источник
comment
Было бы правильно, если бы код был result = result + i;. Может опечатка?   -  person Daniel Zolnai    schedule 11.01.2016
comment
@Nils: Вы можете подтвердить, что это опечатка?   -  person user1354557    schedule 14.01.2016
comment
Ах да, там опечатка. Прости за это. Я изменил его выше.   -  person Nils    schedule 17.01.2016
comment
Тем не менее, я до сих пор не понимаю, почему v1 увеличивается и возвращается. Может ли кто-нибудь перевести мне первые два цикла этого smali-кода?   -  person Nils    schedule 17.01.2016


Ответы (1)


Да, это соответствует коду 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, которая аналогична строке result = result + i; в исходном пакете java.

person JesusFreke    schedule 29.01.2016
comment
см. ответ / здесь недостаточно места - person Nils; 04.03.2016
comment
Большое спасибо за вашу помощь JesusFreke. Виноват. Видимо, по какой-то причине я интерпретировал свой результат +i как результат плюс 1 и запутался. Теперь это имеет смысл. Простите за это. - person Nils; 05.03.2016