я работаю инструментирование кусок ассемблера, и я отметил следующие интересные явления:Инструментирования доброкачественного инструкцию вешает программу
Оригинальный монтаж:
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. Будет продолжать читать.
Любая идея?
Вы совершенно правы. Так что я в процессе выяснения, как добавить инструкции, которые мне нужны должным образом. Где я могу найти информацию о том, какие флаги изменены? Я полагаю, руководство Intel является одним из ... – qweruiop
Руководство разработчиков программного обеспечения Intel, безусловно, одно место, но [x86 tag wiki] (http://stackoverflow.com/tags/x86/info) здесь, на SO, есть тонна других хорошие ссылки, в том числе ссылки, которые намного компактнее, чем справочники Intel для более 1000 страниц. – BeeOnRope
BTW, инструкция 'lea' позволяет вам добавить два регистра (и более) без изменения флагов. – BeeOnRope