logo

Система команд x86

Программирование - Архитектура и система команд микропроцессоров x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

NEG

Изменить знак

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

*

 

 

 

*

*

*

*

*

 

Код

Команда

Описание

Проц.

Пример

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, NEGCMP.

В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:

  • команды сложения (ADDADCINC);
  • команды вычитания (SUB, SBB, DEC);
  • команды умножения (IMUL, MUL);
  • команды деления (IDIV, DIV).
  • команды сравнения и изменения знака (CMP, NEG).

Входит в группу команд: Базовая система команд CPU




Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники