"nop; jmp short" против "jmp short; nop"

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам