Команда NEG


Как выучить английский Как выучить английский

В наше время любой человек должен знать английский язык. А тем более программист. Потому что довольно большая часть документации существует только на английском. А профессионал не может ждать, пока кто-то переведёт ему документацию. Он должен уметь быстро получать нужную инфорамцию и использовать её, независимо от того, на каком она языке - на английском или на русском... Ссылки на курсы по английскому...

Команда NEG в Ассемблере изменяет знак числа на противоположный, то есть положительное число делает отрицательным, а отрицательное - положительным. При этом число преобразуется в двоичный дополнительный код (иногда это называют “дополнение до двух”). Синтаксис:

NEG ЧИСЛО

Инструкция NEG изменяет флаги CF, ZF, SF, OF, AF, PF. Значения флагов зависят от результата операции отрицания.

ЧИСЛО может быть одним из следующих:

  • Область памяти (MEM)
  • Регистр общего назначения (REG)

Операция отрицания

Алгоритм выполнения операции отрицания следующий:

  1. Инвертировать все биты ЧИСЛА
  2. Прибавить единицу к результату выполнения п.1

Надо понимать отличие инструкции NEG от логического отрицания, которое выполняется командой NOT.

Команда NOT только инвертирует все биты числа, но не делает его отрицательным. А команда NEG именно делает число отрицательным. Как? См. дальше.

Дополнение до двух

В общем то алгоритм дополнения до двух уже описан выше. Суть его в том, что все разряды числа инвертируются, а затем к результату прибавляется единица. Таким образом меняется знак числа.

То есть аналогом команды NEG (с определёнными допущениями) можно считать такой код:

 
NOT AX
ADD AX, 1

Более подробно о дополнении до двух см. здесь.

Возможные неожиданности

Результат выполнения команды NEG может вас неприятно удивить. Он будет неправильным, если размер операнда этой команды слишком мал.

Например, если загрузить в регистр AL отрицательное число -128, а затем попытаться инвертировать значение в регистре AL, то по идее должно получиться число +128. Однако это число уже не поместится в регистр AL, так как в регистре AL может поместиться только один байт, а один байт в случае чисел со знаком может хранить значения только от -128 до +127.

В таком случае будет установлен флаг OF (переполнение), а значение в регистре AL (то есть результат выполнения команды NEG) будет неправильным:

 
MOV  AL,  -128         ; AL = 10000000b
NEG  AL                ; AL = 10000000b, OF = 1

Ну а если в регистр AL загрузить число +127 и выполнить команду NEG, то результат будет правильным, а флаг OF не будет установлен:

 
MOV  AL,  127          ; AL = 01111111b
NEG  AL                ; AL = 10000000b, OF = 0

Пример программы, в которой используется команды NEG, приведён ниже.

 
.model	tiny
.code
ORG 	100h
	
start:	
 
; Правильный результат
MOV  AL,  127       ; AL = 01111111b = 7Fh
NEG  AL             ; AL = 10000001b = 81h, OF = 0, SF = 1
 
; Правильный результат
MOV  AL,  -127      ; AL = 10000001b = 81h
NEG  AL             ; AL = 01111111b = 7Fh, OF = 0, SF = 0
 
; Неправильный результат
MOV  AL,  -128      ; AL = 10000000b = 80h
NEG  AL             ; AL = 10000000b = 80h, OF = 1, SF = 1
 
; Правильный результат
MOV  AL,  -1        ; AL = 11111111b = FFh
NEG  AL             ; AL = 00000001b = 01h, OF = 0, SF = 0, CF = 1
 
; Пробуем обойтись без команды NEG
MOV  AL,  -1  		 ; AL = 11111111b = FFh
NOT  AL             ; AL = 00000000b = 0h
ADD  AL,  1         ; AL = 00000001b = 01h, OF = 0, SF = 0, CF = 1
 
MOV  AL,  -128		 ; AL = 10000000b = 80h
NOT  AL             ; AL = 01111111b = 7Fh
ADD  AL,  1         ; AL = 10000000b = 80h, OF = 1, SF = 1
 
END	start

Ну и напоследок о происхождении мнемоники NEG. Это сокращение от слова NEGATIVE - отрицать, отрицание.



Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика