Перейти в середину инструкции - в IA-32

Почему IA-32 позволяет нам прыгнуть в середину обучения?

как я могу использовать эту архитектоническую характеристику для оптимизации, когда я пишу на ассемблере? (помимо очевидных случаев, нам нравится сохранять кодировку команды внутри регистра и после этого активировать эту команду) ?


person Aviv A.    schedule 03.03.2011    source источник


Ответы (2)


IA-32 позволяет перейти в середину инструкции по историческим причинам. Набор инструкций x86 является результатом последовательных уровней над набором инструкций, используемым 8080, предшественником первого «x86», что возвращает нас к концу 70-х. В то время оперативная память стоила очень дорого, и было целесообразно иметь как можно более короткие инструкции, даже если это означало, что все инструкции имеют разную длину. Прямо сейчас длина инструкции IA-32 может составлять от 1 байта до более чем 12 байтов. Это означает, что любой адрес потенциально может быть началом инструкции (не требуется выравнивания), но многие адреса указывают на некоторый байт в середине инструкции. Переход в середину инструкции указывает ЦП переинтерпретировать байты машинного кода, начиная с целевого байта перехода, что приводит к совершенно другим инструкциям.

Для оптимизации правильный способ использования функции "прыгнуть в середину" — не ее использовать. ЦП декодирует поток инструкций, преобразуя его внутри в последовательность микроинструкций с гораздо более регулярной структурой, и работает над этим, чтобы ускорить процесс (параллельное выполнение, спекулятивное отслеживание ветвей и т. д.). Прыжки в середину могут нанести ущерб этим оптимизациям.

person Thomas Pornin    schedule 03.03.2011
comment
Инструкции x86 имеют размер от 1 до 15 байт, а не 12. - person phuclv; 02.02.2014
comment
Ну, я написал больше 12 и считаю, что 15 действительно больше 12. Поскольку каждая новая версия архитектуры вводит новые коды операций, максимальная длина инструкции на самом деле не ограничена. Даже если сегодняшняя x86 дойдет до 15 байт, скрытая версия может выйти за его пределы. - person Thomas Pornin; 02.02.2014

Правильнее было бы сказать, что это не заставляет вас только переходить к началу обучения...

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

Прыгать в середину инструкции кажется плохой идеей. Единственное использование без ошибок, которое я вижу, это переход к инструкции, чтобы избежать префикса (например, LOCK). Хотя понятия не имею, как это может быть реально полезно.

person Brian Knoblauch    schedule 03.03.2011
comment
Вероятно, наиболее распространенной причиной является обфускация, затрудняющая дизассемблирование кода. - person Brendan; 04.03.2011