Хорошо, сначала позвольте мне прояснить: речь не идет о микрооптимизации.
Но я знаю, что в загрузчиках на разделе многие используют кодировку jmp short; nop
. Но, насколько я понимаю, чем меньше jmp "прыгает" :), тем меньше циклов требуется процессору для завершения, и некоторые процессоры видят 0x90
и просто пропускают его, не оценивая.
решение1
Возможно, вам захочется взглянуть наРуководства для разработчиков программного обеспечения для архитектур Intel 64 и IA-32, они являются отличным источником информации для понимания архитектуры x86 с точки зрения программиста (при условии, что вы уже освоились с ассемблером).
[...] насколько я понимаю, чем меньше количество "прыганий" jmp :) тем меньше циклов требуется процессору для завершения
Вам нужно различать ближние и дальние переходы. Ближние переходы просто добавляют (или вычитают с помощью дополнения до 2) смещение к указателю инструкций (IP) или перезагружают смещение IP из текущего сегмента кода (CS). Ближние переходы часто могут сохранять смещение в самом слове инструкции или в регистре — так что вся инструкция перехода может быть извлечена за один цикл.
Дальние переходы сохраняют фактический новый адрес указателя инструкций вследующийслово, или в ячейке памяти, так что это требует дополнительной выборки - и, таким образом, занимает больше времени. На x86 и x86-64 вы можетенетдальний переход к месту, хранящемуся в регистре (это должно быть следующее слово инструкции или место в памяти).
а некоторые процессоры видят 0x90 и просто пропускают его, не оценивая.
Да, это определение того, что NOP
должна делать инструкция. ЦП все еще должен получить 0x90
код операции, но оценка по сути ничего не делает.