2016-10-05 2 views
1

Je travaille sur instrumenter un morceau de code assembleur et je note les phénomènes intéressants suivants:L'instrumentation d'une instruction bénigne est suspendu le programme

L'assemblage d'origine:

64  .loc 1 22 0 is_stmt 0 discriminator 1 
    65  cmpl $31, -4(%rbp) #, i 
    66  jg .L2 #, 

assemblage instrumenté:

64  .loc 1 22 0 is_stmt 0 discriminator 1 
    65  cmpl $31, -4(%rbp) #, i 
    66  addq $15, %r15 
    67  jg .L2 #, 

Premièrement, r15 n'est utilisé par aucune autre partie de l'assemblage (assurée par gcc --fixed-r15). Après avoir ajouté un seul addq, le programme se bloque (comme s'il y avait une boucle morte). Je n'ai pas compris quelle est la signification de ce add alors j'ai essayé de le mettre à d'autres endroits. Fait intéressant, j'ai trouvé que chaque fois qu'il est ajouté après une section avec discriminator 1, alors certaines erreurs se produiraient. Une idée? Je ne pouvais pas entièrement comprendre le discriminator après une lecture de this. Continuera à lire.

Une idée?

Répondre

3

En général, vous ne pouvez pas simplement ajouter des instructions dans une liste d'assemblage existante et espérer que tout fonctionnera comme avant. Par exemple, l'instruction ajoutée peut modifier un état d'architecture qui modifie le comportement des instructions suivantes.

Dans votre exemple particulier, l'instruction addq écrase les drapeaux précédemment définis par l'instruction cmpl avant, de sorte que le jg conditionnelle fera la mauvaise chose (en boucle pour toujours dans votre cas).

+0

Vous avez tout à fait raison. Donc, je suis en train de trouver comment ajouter les instructions dont j'ai besoin correctement. Où puis-je trouver des informations sur les drapeaux qui sont modifiés? Je suppose que le manuel d'Intel en est un ... – qweruiop

+0

Le guide des développeurs de logiciels Intel est certainement un endroit, mais le [wiki tag x86] (http://stackoverflow.com/tags/x86/info) ici sur SO a une tonne d'autres de bons liens, y compris des références beaucoup plus compactes que les guides de plus de 1 000 pages. – BeeOnRope

+0

BTW, l'instruction 'lea' vous permet d'ajouter deux registres (et plus) sans modifier les drapeaux. – BeeOnRope