Сборка: что такое семантические NOP? - PullRequest
8 голосов
/ 05 февраля 2010

Мне было интересно, что такое "семантические NOP" в сборке?

Ответы [ 5 ]

5 голосов
/ 05 февраля 2010

Код, который не является действительным, но не влияет на поведение программы.

В C следующую последовательность можно рассматривать как семантическую NOP:

{
    // Since none of these have side affects, they are effectively no-ops
    int x = 5;
    int y = x * x;
    int z = y / x;
}
1 голос
/ 05 февраля 2010

Это инструкции, которые не действуют, как NOP, но занимают больше байтов. Полезно для выравнивания кода по границе строки кэша. Например, инструкция lea edi, [edi + 0], для заполнения одного и того же числа байтов потребуется 7 NOP, но вместо 7 потребуется всего 1 цикл.

0 голосов
/ 13 декабря 2010

Истинный "семантический nop" - это инструкция, которая не имеет никакого эффекта, кроме как занять некоторое время и продвинуть счетчик программ. Многие машины, на которых перемещения от регистра к регистру не влияют на флаги, например, имеют многочисленные инструкции, которые перемещают регистр к себе. Например, на 8088 любое из следующего будет семантическим NOP:

  mov al,al
  mov bl,bl
  mov cl,cl
  ...
  mov ax,ax
  mob bx,bx
  mov cx,cx
  ...
  xchg ax,ax
  xchg bx,bx
  xchg cx,cx
  ...

Обратите внимание, что все вышеперечисленное, кроме "xchg ax, ax", является двухбайтовой инструкцией. Поэтому Intel заявила, что «xchg ax, ax» следует использовать, когда требуется однобайтовая NOP. Действительно, если собрать «mov ax, ax» и разобрать его, он будет разобран как «NOP».

Обратите внимание, что в некоторых случаях команда или последовательность команд могут иметь потенциальные побочные эффекты, но, тем не менее, более желательны, чем обычный "nop". Например, на 6502, если требуется задержка в 7 циклов и указатель стека действителен, но значение вершины стека не имеет значения, PHP, за которым следует PLP, убьет семь циклов, используя только два байта кода. Однако, если значение вершины стека не является резервным байтом ОЗУ, последовательность завершится ошибкой.

0 голосов
/ 05 февраля 2010

Код, который выполняется, но не делает ничего значимого. Они также называются «непрозрачными предикатами» и чаще всего используются обфускаторами .

0 голосов
/ 05 февраля 2010

Семантическая NOP - это набор инструкций машинного языка, которые не имеют никакого эффекта или почти не имеют эффекта (большинство инструкций изменяют коды условий), единственная цель которого - запутывание того, что на самом деле делает программа.

...