Добрый вечер. Объясните, пожалуйста, зачем в ассемблере нужны выравнивания и когда их стоит использовать? Спасибо.
есть еще выравнивание кода и выравнивание данных нужно для повышения перфоманса, т.к. физически память читается рядами по 16 (вроде как) байт и помещается в кеш - поэтому имеет смысл выравнивать данные, чтобы уменьшать кол-во обращений к памяти. Выравнивание кода - примерно то же + оптимизация загрузки конвейеров процессора. Примерно так... подробнее пускай знающие люди расписывают
Нужно что ничего не отвалилось. Ибо всюду проверки на выравнивание, да и не только програмные. Кое что хардварно вызывает фолт при кривом стеке.
Оставлю тут для истории . Длинные nop - до 11 байт включительно. Границу легко можно выровнять, например до 32 байт, современные камни могут обрабатывать от 3х и более nop-ов за такт. Код (Text): NOP1_OVERRIDE_NOP TEXTEQU <DB 090h> NOP2_OVERRIDE_NOP TEXTEQU <DB 066h, 090h> NOP3_OVERRIDE_NOP TEXTEQU <DB 00fh, 01fh, 000h> NOP4_OVERRIDE_NOP TEXTEQU <DB 00fh, 01fh, 040h, 000h> NOP5_OVERRIDE_NOP TEXTEQU <DB 00fh, 01fh, 044h, 000h, 000h> NOP6_OVERRIDE_NOP TEXTEQU <DB 066h, 00fh, 01fh, 044h, 000h, 000h> NOP7_OVERRIDE_NOP TEXTEQU <DB 00fh, 01fh, 080h, 000h, 000h, 000h, 000h> NOP8_OVERRIDE_NOP TEXTEQU <DB 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h> NOP9_OVERRIDE_NOP TEXTEQU <DB 066h, 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h> NOP10_OVERRIDE_NOP TEXTEQU <DB 066h, 066h, 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h> NOP11_OVERRIDE_NOP TEXTEQU <DB 066h, 066h, 066h, 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h>
shufps NOP содержит MRM, из за этого длина меняется. Причём это особая инструкция как LEA, она не производит выборку из памяти.