2016-01-11 2 views
0

Supposons que le code exemple suivantProblème avec le code Smali

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

et le code Smali correspondant (0002 est à côté du 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 

J'ai essayé de comprendre le Smali correspondant (assembly) code, mais est tombé sur une ligne qui n'a aucun sens pour moi en ce moment (marqué par ???). Si je ne me trompe pas, la valeur de v1 est augmentée à chaque tour par la valeur de v0, ce qui n'a aucun sens - premier tour: v1 = 2; deuxième tour v1 = 4 et ainsi de suite

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 

Je suppose que je ne comprends pas l'une des lignes. Qu'est-ce que je fais mal?

+2

Il serait correct que le code soit 'résultat = résultat + i; Peut-être une faute de frappe? –

+0

@Nils: Pouvez-vous confirmer que c'était une faute de frappe? – user1354557

+0

Ah, ouais, il y a une faute de frappe. Désolé pour ça. Je l'ai modifié ci-dessus. – Nils

Répondre

0

Oui, cela correspond au code Java que vous avez publié. v1 est result et v0 est i.

Pour reformuler votre analyse du code:

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 

Votre question concerne l'instruction spécifique add-int/2addr v1,v0, qui est analogue à la ligne result = result + i; dans la java originale.

+0

voir la réponse/pas assez d'espace ici – Nils

+0

Merci beaucoup pour votre aide JesusFreke. Ma faute. Apparemment, j'ai interprété mon résultat + i comme résultat plus 1 pour une raison quelconque et est devenu confus. Maintenant, cela prend tout son sens. Désolé. – Nils