2013-02-23 1 views
3

Je reçois constamment un décalage de 1 octet pour l'adresse d'implémentation de la méthode montrée par 'otool'.Mauvaise adresse d'implémentation de méthode d'otool pour armv7?

Pour un exemple 'otool -o' donne 0xe99d5 mais 'otool -tvV' donne:

+[NSError(SomeCategory) someMethod]: 
000e99d4   b590  push {r4, r7, lr} 
000e99d6  f6441184  movw r1, 0x4984 
000e99da   af01  add  r7, sp, #4 
000e99dc  f2c0010a  movt r1, 0xa 

Ainsi, la méthode commence à 0xe99d4. 0xe99d5 semble faux, pas aligné. Je crois que 'otool' fonctionne bien et je ne comprends pas certains aspects de la mise en œuvre. Comment interpréter la sortie?

Répondre

5

Les cœurs ARM modernes ont deux types d'ensembles d'instructions. L'original est appelé mode arm où chaque instruction est longue de quatre octets et une nouvelle est appelée thumb2 (comme vous pouvez le deviner, elle a déjà passé quelques itérations) où les instructions peuvent durer deux ou quatre octets (la raison de l'introduction est la densité de code) .

La CPU peut changer de mode lors de la création d'une branche et le moyen de notifier le CPU de l'ensemble d'instructions utilisé est de définir le bit le moins significatif dans l'adresse de l'instruction à sauter. Si c'est 0 l'instruction sera interprétée comme arm, si elle est 1 ils seront interprétés en mode thumb.

Donc, ce que vous voyez est votre fonction est en mode thumb2 que nous pouvons vérifier en le voyant constitué d'instructions longues de deux et quatre octets.

+0

Bonne réponse! Je vous remercie! –

Questions connexes