Размер команды NOP
2025-01-08 14:08Какой размер команды NOP на интеловском процессоре? Правильный ответ: размер любой, от 1 до 9 байт.
Чтобы жизнь программиста мёдом не казалась. 😀
Length Assembly Byte Sequence ------------------------------------------------------------------ 1 byte nop 90 2 bytes xchg %ax,%ax 66 90 3 bytes nopl (%rax) 0f 1f 00 4 bytes nopl (%rax,%rax,1) 0f 1f 04 00 5 bytes nopw (%rax,%rax,1) 66 0f 1f 04 00 6 bytes nopw 1(%rax,%rax,1) 66 0f 1f 44 00 01 7 bytes nopl 0x04030201(%rax) 0f 1f 80 01 02 03 04 8 bytes nopl 0x04030201(%rax,%rax,1) 0f 1f 84 00 01 02 03 04 9 bytes nopw 0x04030201(%rax,%rax,1) 66 0f 1f 84 00 01 02 03 04
Чтобы жизнь программиста мёдом не казалась. 😀

no subject
Date: 2025-01-08 23:09 (UTC)Скорее всего чтобы гарантировать что определённые опкоды для патчей и инструментирования всегда оставались NOP. Есть и другие формы NOPs которые превратились во всякие прочистки кэшей и хинты.
no subject
Date: 2025-01-08 23:34 (UTC)no subject
Date: 2025-01-08 23:47 (UTC)no subject
Date: 2025-01-08 23:56 (UTC)no subject
Date: 2025-01-09 18:57 (UTC)Скорей всего нет (это предположение). 15 нопов будет.
Это отразится на том, что где-то всередине этих нопов может прийти прерывание. А если ноп написан как 66 0f 1f 84 00 01 02 03 04 то прерывание всередине не может прийти, и соответственно адрес возврата, если прерывание придет, не может быть всередину этой последовательности.
no subject
Date: 2025-01-10 13:41 (UTC)no subject
Date: 2025-01-09 09:56 (UTC)Поэтому строго говоря, ноп может выполняться сколь угодно долго. А другие инструкции - и подавно.
Наверное, вопрос имеет какой-то условный смысл, когда команда полностью лежит всеми лапами в одном кешлайне. Но опять же - на практике никто никогда не будет оптимизировать, чтобы ноп лежал по фен шую. Если и есть какая-то задача его всунуть, то его сунут именно туда, где он нужен, а не туда, где он будет правильно лежать.
Размер кешлайна обычно 64 байта, если что.
no subject
Date: 2025-01-09 15:49 (UTC)no subject
Date: 2025-01-09 16:47 (UTC)А еще я не совсем понимаю, почему один многобайтовый ноп лучше нескольких однобайтовых.
Скорей свего нету там великой цели, в нопах этих.
no subject
Date: 2025-01-09 17:53 (UTC)То, что последовательность нопов, вставляемых с упомянутой целью добить адрес следующей команды до ближайшего кратного 8 или 16, не пересекает границу кэш-лайна.
А еще я не совсем понимаю, почему один многобайтовый ноп лучше нескольких однобайтовых.
Скорей свего нету там великой цели, в нопах этих.
Мой вопрос о скоростях выполнения тоже выражает именно это непонимание.
no subject
Date: 2025-01-09 18:50 (UTC)это ж как вставишь - так и будет.
вообще, я плохо понимаю, зачем такое может понадобиться. Но clang ставит странные jmp на аддрес, который идет сразу после этого jmp. Тоже не знаю, зачем это.
> Мой вопрос о скоростях выполнения
насколько я понимаю, в х86 никогда скорости не стандартизировали. И в разных поколениях не гарантируется одинаковость скорости каждой инструкции.
А во многих cpu хоть и написано 1 такт, но по факту бывает больше почему-то. Я на такое не нарывался, но человек который шил какие-то микроконтроллеры мне на такое жаловался. Не знаю, я не вникал.
Возможно это связано с конвеером, но это не точно.
no subject
Date: 2025-01-10 13:42 (UTC)You'll be surprised.
no subject
Date: 2025-01-10 17:22 (UTC)Кто-то может это делать в академических целях. Но для практических/прикладных - никто никогда
no subject
Date: 2025-01-10 19:18 (UTC)I know JIT compilers that do take into account much finer CPU performance recommendations than just plain cache line alignment.
no subject
Date: 2025-01-10 20:13 (UTC)no subject
Date: 2025-01-11 00:12 (UTC)no subject
Date: 2025-01-11 15:34 (UTC)Я правда плохо представляю, зачем это может понадобиться, но видимо у людей, которые это делали, какие-то соображения были.
no subject
Date: 2025-01-11 16:18 (UTC)For example, trampolines, bits of code that may need replacing, bits of code where the callee may need to manipulate return point, ....
no subject
Date: 2025-01-09 22:32 (UTC)no subject
Date: 2025-01-09 10:09 (UTC)Ну и опять же, если аддерсс rax существует но не в L1, то его надо туда подгрузить, возможно вытеснив что-то. Ну то есть, вроде ноп - но может быть задействована целая куча подсистем. Или нет?
no subject
Date: 2025-01-09 22:33 (UTC)no subject
Date: 2025-01-10 17:17 (UTC)По старым временам я бы проверил, но сейчас нет. Времени не всегда на потрындеть хватает.
no subject
Date: 2025-01-10 10:25 (UTC)Eg 0F 1F C0 = NOP RAX, no addresses involved.
no subject
Date: 2025-01-10 10:25 (UTC)Еще было прикольно, я написал вначале алгоритм в виде паскалеподобного псевдокода, потом сам на бумажке переводил его в ассемблер, а рядом сидел коллега, который ассемблировал, то есть выписывал шестнадцатиричные коды, а третий прошивал ПЗУ на программаторе.
Я еще шутку придумал "Что такое программатор? - Это устройство, заменяющее программиста"