"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
код операции, но оценка по сути ничего не делает.