Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
NEG
Влияние команды на флаги и форматы команды:
* |
|
|
|
* |
* |
* |
* |
* |
F6 /3 |
NEG r/m8 |
r/m8 = -r/m8 |
8086 |
neg byte ptr [bx+6] |
F7 /3 |
NEG r/m16 |
r/m16 = -r/m16 |
8086 |
neg cx |
F7 /3 |
NEG r/m32 |
r/m32 = -r/m32 |
Intel386 |
neg eax |
Описание:
Команда NEG (Two's Complement Negation) обычно относится к группе команд целочисленной (или двоичной) арифметики (Binary Arithmetic Instructions). Она заменяет значение операнда-назначения (DEST), его точным дополнением в двоичной системе, то есть числом, которое при сложении с исходным операндом дает 0 во всех разрядах и перенос из старшего разряда. Можно также сказать, что операнд команды вычитается из нуля, и результат помещается на место этого операнда. Операнд-назначение (DEST) является единственным операндом команды и может быть быть переменной в регистре или в памяти (r/m8, r/m16, r/m32).
Команда NEG предназначена для манипуляции числами, представленными в дополнительном коде (two’s complement) и по сути осуществляет инверсию знака операнда (то есть положительное значение становится отрицательным и наоборот), сохраняя его представление все в том же дополнительном коде. Отсюда и название команды, которое при дословном переводе звучало бы как "изменить знак во втором дополнении".
Флаги EFLAGS.OF, EFLAGS.SF, EFLAGS.ZF и EFLAGS.PF устанавливаются по результату операции. Флаг переноса устанавливается (EFLAGS.CF = 1), если исходный операнд не нуль, иначе — флаг переноса сбрасывается (EFLAGS.CF = 0).
Если операнд имеет минимальное (максимальное по модулю) отрицательное значение (например, -128 для 8 битного операнда), то его величина не меняется, но устанавливаются флаг переполнения (EFLAGS.OF = 1) и флаг переноса (EFLAGS.CF = 1).
Команда NEG с операндом-назначением (DEST), являющимся переменной в памяти, может использоваться совместно с префиксом блокировки LOCK, который обеспечит атомарное исполнение команды.
Операция:
IF (DEST = 0)
THEN CF = 0
ELSE CF = 1;
FI;
DEST = -DEST;
Особые ситуации защищенного режима:
#GP(0), если операнд-назначение (DEST) находится в памяти в сегменте, запрещенном для записи.
#GP(0), если при обращении к операнду в памяти в сегменте DS, ES, FS или GS используется нулевой селектор.
#GP(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в стековом сегменте SS.
Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK, если операнд-назначение (DEST) не является значением в памяти.
Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда в памяти находится вне допустимого для реального режима пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS, если любая часть операнда в памяти выходит за допустимую для реального режима верхнюю границу стекового сегмента SS.
Intel386 … :
#UD при использовании префикса LOCK, если операнд-назначение (DEST) не является значением в памяти.
Особые ситуации режима V86:
#GP(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в стековом сегменте SS.
Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK, если операнд-назначение (DEST) не является значением в памяти.
Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).
Замечание:
К командам целочисленной арифметики относятся команды ADD, ADC, SUB, SBB, IMUL, MUL, IDIV, DIV, INC, DEC, NEG, CMP.
В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru