Избыточные инструкции по сборке? - PullRequest
4 голосов
/ 22 февраля 2011

Недавно я пытался изучить реверс-инжиниринг.Таким образом, я углубился в много кода сборки.Я озадачен следующим:

movq    %rax,0xf8(%rbp)
movq    0xf8(%rbp),%rax

Я видел это несколько раз.Разве это не избыточно?Почему компилятор делает это?Двоичный файл, на который я смотрю, был скомпилирован с помощью gcc.

1 Ответ

9 голосов
/ 22 февраля 2011

Вы, вероятно, скомпилированы без оптимизации (-O).То, что вы видите, является прямым, наивным переводом промежуточного представления.Подобные фрагменты обычно происходят из-за значения, хранящегося в локальной переменной, в этом случае 0xf8 (% rbp) .Затем значение используется сразу после этого, поэтому оно снова загружается в регистр % rax .Оптимизатор обнаружит, что сохранение из% rax только для восстановления обратно в тот же регистр является излишним, и полностью удалит последовательность.Если все этапы оптимизации не пройдены, по крайней мере, глазок обнаружит, что эти две инструкции являются последовательными.

Если у вас действительно включена оптимизация, то это действительно странно, но может быть объяснено, если вы разместите большую(но не слишком большая) последовательность.Все еще есть много случаев, когда генерируется что-то явно неоптимальное, но ничего более вопиющего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...