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

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

Связанный контент