Почему NOP был назначен на 0x90 в сборке x86? - PullRequest
3 голосов
/ 01 мая 2019

Почему nop присвоено 0x90 в сборке Intel x86?

Интуитивно я ожидаю, что 0x00 будет отображаться в nop (что также xchg eax, eax в Intel x86), как в случае ARM A32 и некоторых других архитектур.

1 Ответ

6 голосов
/ 01 мая 2019

0x00000000 на самом деле не является NOP на ARM A32, хотя ведет себя как единое целое;на самом деле это andeq r0, r0, r0, тогда как реальный NOP равен 0xe1a00000 (mov r0, r0).Это довольно плохая идея, чтобы байт NUL был NOP, потому что это делает каждую пустую область памяти свободным слайдом NOP, значительно увеличивая риск для атак.Современные архитектуры обычно пытаются сделать все нули инструкцией разрыва или подобной, чтобы избежать этого вектора атаки.Например, ARM A64 делает 0x00000000 постоянно неопределенной инструкцией udf 0.

0x90 на самом деле является лишь одной инструкцией семейства опкодов 0x90 + r, которая обозначает xchg r32, eax.eax - это регистр 0, поэтому 0x90 означает xchg eax, eax, что является NOP.В длинном режиме 0x90 имеет специальный регистр, чтобы не обнулять старший 32-битный rax, чтобы сохранить свою функцию в качестве однобайтового NOP.

...