2

Хорошо, сначала позвольте мне получить это прямо: это не о микрооптимизации.

Но, я знаю, в загрузчиках на разделе, многие используют jmp short; nop кодирования. Но, насколько я понимаю, чем меньше "скачет" jmp :), тем меньше циклов требуется процессору для завершения, и некоторые процессоры видят 0x90 и просто пропускают его, не оценивая его.

1 ответ1

2

Возможно, вы захотите взглянуть на Руководства разработчика программного обеспечения для архитектуры Intel 64 и IA-32, они являются отличным ресурсом для понимания архитектуры x86 с точки зрения программиста (при условии, что вы уже знакомы со сборкой).

[...] я понимаю, что чем меньше "скачет" jmp :), тем меньше циклов требуется процессору для завершения

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

Дальнейшие переходы сохраняют фактический новый адрес указателя инструкции в следующем слове или в ячейке памяти, поэтому для этого требуется дополнительная выборка - и, следовательно, для этого требуется больше времени. На x86 и x86-64 вы не можете далеко перейти к месту, содержащемуся в регистре (это должно быть следующее слово инструкции или место в памяти).

и некоторые процессоры видят 0x90 и просто пропускают его, не оценивая его.

Да, это определение того, что должна делать инструкция NOP . Процессору все еще нужно получить код операции 0x90 , но оценка по существу ничего не делает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .