Команда обмена операндами
Команда обмена XCHG (exchange - обменять) меняет между собой значения двух регистров или регистра и ячейки памяти, но она не может выполнить обмен значений регистров сегмента. Несколько примеров команд XCHG:
XCHG АХ,ВХ ;Обменять значения двух регистров (слова
XCHG AL,BH ;или байты)
XCHG WORD MEM,DX ;Поменять значения ячейки памяти
XCHG DL,BYTE MEM ; и регистра
Команды пересылки адреса
Команды пересылки адреса передают не содержимое переменных, а их адреса.
Команда LEA (load effective address - загрузить исполнительный адрес) пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр. Она имеет формат
LEA reg16,mem16
Первый операнд какой либо регистр, второй операнд ячейка памяти, причем операнд mem16 должен иметь атрибут типа WORD. По своему результату эквивалентна команде
MOV reg16,offset mem16
Но в отличие от команды Mov с префиксом OFFSET, операнд mem16 в команде LEA может быть индексирован, что дает возможность осуществить гибкую адресацию. Например, если регистр DI содержит 5, то команда
LEA ВХ,TABLE[DI]
Загрузит смещение адреса TABLE + 5 в регистр ВХ.
Команды сложения
Команда сложения ADD и команда сложения с добавлением переноса ADC
Команды ADD (add - сложить) и ADC (add with carry - сложить с переносом) могут складывать как 8-, так и 16-битовые операнды. Команда ADD складывает содержимое операнда-источника и операнда-приемника и помещает результат в операнд-приемник. Формат команды:
ADD приемник,источник
В символической нотации ее действия можно описать как:
приемник : = приемник + источник
Команда ADC делает то же, что и команда ADD, но складывает не два а три слагаемых. Приемник, источник и флаг переноса. Формат команды:
ADC приемник,источник + CF
В символической нотации ее действия можно описать как:
приемник := приемник + источник + перенос
Перенос при сложении двоичных чисел аналогичен переносу при сложении десятичных чисел в столбик. Когда ЭВМ складывает двоичные числа и сумма не помещается в операнде-приемнике, то генерируется перенос. Как известно, 8-битовый регистр может содержать значения без знака в диапазоне от 0 до 255. Если мы, например, выполним двоичное сложение чисел 250 и 10, то получим
1111 1010 ;двоичное представление числа 250
+ 0000 1010 ;двоичное представление числа 10
1 0000 0100 ;ответ: десятичное значение 260
Результат верен, но занимает 9 двоичных битов. Если при выполнении этой операции мы использовали 8-битовые регистры, то младшие 8 битов будут занесены в регистр-приемник, а девятый бит - во флаг переноса CF.
Теперь нетрудно понять, почему микропроцессор 8088 имеет две разные команды сложения. Одна из них (ADD) может складывать значения, представляемые байтами или словами, а также младшие части значений повышенной точности. Другая команда (ADC) используется для сложения старших частей значений повышенной точности.
Например, команда
ADD AX,CX
складывает 16-битовые значения регистров АХ и СХ и возвращает результат в регистр АХ. Если операнды имеют длину более 16 битов, то можно воспользоваться следующей последовательностью команд которая складывает 32-битовое число, находящееся в регистрах СХ и DX, с 32-битовым числом, находящимся в регистрах АХ и ВХ
ADD АХ,СХ ;Сначала сложить младшие 16 битов, а затем
ADC BX,DX ; старшие 16 бит
Складываемые операнды могут находиться в памяти или в регистре или иметь непосредственное значение. Например:
ADD АХ,MEM_WORD ; Добавить содержимое ячейки памяти к регистру
ADD MEM_WORD,AX ; или наоборот.
ADD AL, 10 ; Добавить константу к регистру
ADD MEM_BYTE,OFH ; или к ячейке памяти
Допускается большинство возможных комбинаций, но нельзя добавить значение одной ячейки памяти к другой или использовать в качестве приемника непосредственное значение.
Команды ADD и ADC могут воздействовать на шесть флагов:
Флаг переноса CF равен 1, если результат сложения не помещается в операнде-приемнике; в противном случае он равен 0.
Флаг четности PF равен 1, если результат имеет четное число битов со значением 1; в противном случае он равен 0.
Вспомогательный флаг переноса AF равен 1, если результат сложения десятичных чисел требует коррекции; в противном случае он равен 0.
Флаг нуля ZF равен 1, если результат равен 0; в противном случае он равен 0.
Флаг знака SF равен 1, если результат отрицателен (старший бит равен 1); в противном случае он равен 0.
Флаг переполнения OF равен 1, если сложение двух чисел одного знака (оба положительные или оба отрицательные) приводит к результату, который превышает диапазон допустимых значений приемника в обратном коде, а сам приемник при этом меняет знак. В противном случае флаг OF равен 0.
Флаги SF и OF имеют смысл только при сложении чисел со знаком, а флаг AF -
только при сложении десятичных чисел.
Дата добавления: 2016-01-26; просмотров: 1398;