2016-01-11 3 views
0

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

public static int addition() { 
int result = 1; 
for(int i = 1; i < 10000 ; i++) 
result = result + i; 
} 

и соответствующий smali код (0002 находится рядом с if-ге):

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 

Я думаю, что я недопонимаю одну из линий. Что я делаю не так?

+2

Было бы правильно, если бы код был «result = result + i;». Может быть, опечатка? –

+0

@Nils: Можете ли вы подтвердить, что это была опечатка? – user1354557

+0

А, да, есть опечатка. Извини за это. Я изменил его выше. – Nils

ответ

0

Да, что соответствует введенному вами 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; линии в оригинальной Яве.

+0

см. Ответ/недостаточно места здесь – Nils

+0

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

Смежные вопросы