2016-10-05 15 views
1

я работаю инструментирование кусок ассемблера, и я отметил следующие интересные явления:Инструментирования доброкачественного инструкцию вешает программу

Оригинальный монтаж:

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

Instrumented сборка:

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

Во-первых, r15 не используется ни в одной другой части сборки (обеспечивается gcc --fixed-r15). После добавления одного addq программа зависает (например, существует мертвая петля). Я не понял, что имеет значение с этим add, поэтому я попытался поместить его в другие места. Интересно, что я обнаружил, что всякий раз, когда он добавляется после раздела с discriminator 1, тогда возникнут некоторые ошибки. Есть идеи? Я не мог полностью понять discriminator после чтения this. Будет продолжать читать.

Любая идея?

ответ

3

В общем вы не можете просто добавить инструкции в существующий список агрегатов и надеяться, что все будет работать как раньше. Например, добавленная команда может изменить некоторое архитектурное состояние, которое изменяет поведение следующих инструкций.

В вашем конкретном примере, addq инструкции перезаписать флаги ранее установленные ранее cmpl инструкции, так что условное jg будет делать неправильные вещи (зацикливание навсегда в вашем случае).

+0

Вы совершенно правы. Так что я в процессе выяснения, как добавить инструкции, которые мне нужны должным образом. Где я могу найти информацию о том, какие флаги изменены? Я полагаю, руководство Intel является одним из ... – qweruiop

+0

Руководство разработчиков программного обеспечения Intel, безусловно, одно место, но [x86 tag wiki] (http://stackoverflow.com/tags/x86/info) здесь, на SO, есть тонна других хорошие ссылки, в том числе ссылки, которые намного компактнее, чем справочники Intel для более 1000 страниц. – BeeOnRope

+0

BTW, инструкция 'lea' позволяет вам добавить два регистра (и более) без изменения флагов. – BeeOnRope