Команды передач данных
Во всех компьютерах необходимы команды, предназначенные просто для пересылок данных, адресов и непосредственных операндов в регистры или ячейки памяти. В МП Intel 8086 имеется пять базовых команд для выполнения таких действий:
MOV – переслать;
LEA – загрузить (load) эффективный (внутрисегментный) адрес;
LDS и LES – загрузить адрес в сегментные регистры DS и ES соответственно;
XCHG – обменять (exchange).
MOV – наиболее универсальная команда, предназначенная для пересылки информации между регистрами МП, регистрами и ячейками памяти, загрузки непосредственного операнда в регистр или ячейку памяти. Для краткого символического описания сути выполняемых командами МП действий введем следующие обозначения:
(...) – содержимое регистра или ячейки памяти;
← – заменить старое содержимое новым.
Приведем несколько примеров команды MOV с использованием разных режимов адресации:
• MOV АХ, SI (АХ) ← (ST)
в регистр АХ заносится содержимое регистра SI;
• MOV ALPHA, CL (ALPHA) ← (CL)
в ячейку ALPHA заносится содержимое регистра CL, при этом сама ячейка должна быть объявлена как однобайтная;
• MOV ВЕТА+5, 9835Н (ВЕТА+5) ← 9835Н
в двухбайтную ячейку, отстоящую от ячейки BETA на 5 байтов, заносится шестнадцатеричное число 9835. т.е. 1001100000110101;
• MOVDX, [BP] [5/]+30 (ОХ) ← ([BP] [67]+30)
в регистр DX заносится содержимое двухбайтной ячейки, внутрисегментный адрес которой вычисляется сложением содержимого регистров BP, SI и смещения 30.
Команды LEA. LDS и LES обеспечивают загрузку адресов из памяти. Команда LEA загружает внутрисегментный адрес в любой регистр МП, этот адрес в ассемблере называется эффективным. Адрес ячейки памяти может быть указан всеми косвенными способами адресации, причем если в командах MOV, LDS, LES при этом будет выбрано содержимое ячейки, то в этой команде будет загружен именно адрес. Команды LDS и LES аналогичны, но первая загружает из памяти регистр DS, а вторая – ES. Обе команды кроме сегментных регистров загружают также дополнительно еще один внутренний регистр МП (несегментный), указанный в качестве операнда в команде. Типичный вид команд:
LEA SI, COL [ВХ] (SI) ← COL [BX]
LDS DI, TABLE [BX] (DI) ← (TABLE [BX])
(DS) ← (TABLE [BX]+2).
Команда XCHG осуществляет обмен содержимым двух операндов, т.е. первый операнд помещается на место второго, а второй – на место первого:
XCHG BX, [BP] [SI]+68 (ВХ) ([ВР] [SI]+68).
Арифметические команды. К арифметическим операциям, выполняемым МП Intel 8086, относятся сложение, вычитание, умножение и деление. Однако набор арифметических команд МП гораздо больше. Так как разрядность регистров МП составляет 16, диапазон чисел, представленных таким числом двоичных разрядов, ограничен и составляет всего ±32 768. Для расширения диапазона представляемых чисел двухбайтные слова могут сцепляться в четырехбайтные, шестибайтные и т.д. Поэтому наряду с командами, обеспечивающими сложение и вычитание обычных 16-разрядных чисел, в МП есть команды для выполнения арифметических операций с учетом переноса или заема, образовавшегося при обработке предыдущего двухбайтного слова цепочки.
Команды сложения и вычитания без учета и с учетом переноса (заема) имеют следующий вид:
ADD op1, ор2 – сложение без учета переноса;
SUB op1, opi – вычитание без учета заема;
ADC op1, ор2 – сложение с учетом переноса;
SB В op1, ор2 – вычитание с учетом заема.
Под "op1" и "ор2" понимают первый и второй операнды, один из которых – содержимое регистра, а другой может быть задан всеми возможными режимами адресации данных.
Кроме команд, реализующих обычные операции сложения и вычитания двух операндов в МП, как и во многих других, имеются команды сложения (инкремент) и вычитания (декремент) операнда с единицей: INC op1 – инкремент; DEC op1 – декремент.
В этих командах только один операнд (другой определен операцией, это – единица), а результат операции помещается на прежнее место операнда. В качестве операнда может выступать содержимое регистра МП или ячейки ОЗУ:
LEA SI, COL [BX] LDSDI, TABLE [BX] |
(SI) ← COL [BX] (DI) ← (TABLE [BX]) (DS) ← (TABLE [BX]+2). |
INC АХ DEC [ВХ] [DI]+45 |
(АХ) ← (AХ)+1 ([ВХ] [DI]+45) ← ([ВХ] [DI]+45) – 1. |
Очень часто возникает задача сравнения двух операндов. При этом необходимо определить, какой из операндов больше или меньше, но сами операнды нужно сохранить. Для этого в МП есть команда сравнения двух операндов СМР. Сравнение операндов осуществляется путем вычитания второго операнда из первого. При этом формируются все признаки результата операции, но сам результат нигде не сохраняется. Эта команда схожа с командой SUB, но отличается от нее тем, что результат операции не запоминается.
В двоичной арифметике, как и в любой другой, разрядность произведения больше разрядности сомножителей. Если в качестве сомножителей выступают однобайтные операнды, то произведение будет двухбайтным, если операнды двухбайтные, то произведение – четырехбайтное. В качестве одного из операндов всегда выступает содержимое регистра АХ, или его младшей половины AL, и в команде он не обозначается. Другой операнд может быть содержимым регистра или ячейки ОЗУ. Если в команде указан однобайтный операнд, то он умножается на содержимое регистра AL, а двухбайтное произведение размещается в регистре АХ. Если же операнд двухбайтный, то он умножается на содержимое всего регистра АХ, для размещения произведения требуется еще один регистр. Старшая половина произведения помещается в регистр DX, а младшая – в АХ.
Операция деления является обратной умножению. Здесь также указывается только один операнд – делитель, а делимое всегда размещается либо в регистрах DX, АХ, либо только в регистре АХ. Частное всегда помещается в регистр АХ (AL).
Другая особенность двоичной арифметики – в работе с двоичными числами со знаком и без знака. Если число со знаком, его функцию выполняет старший разряд, при этом "0" соответствует положительному числу, а "1" – отрицательному. Поэтому операции умножения и деления с учетом знака чисел и без учета знака также отличаются друг от друга, и команды МП, выполняющие операции с учетом и без учета знака операндов, разные. Приведем команды умножения и деления беззнаковых чисел с кратким символическим пояснением:
MUL GAMMA (DX) (АХ) ← (АХ) × (GAMMA)
(при условии, что GAMMA – двухбайтная ячейка);
DIV СН (AL) ← (АХ): (СН)
DIV [SI] (АХ) ← (DX, АХ):([SI])
(при условии, что ячейка, адрес которой содержится в SI, – двухбайтная).
Беззнаковые команды умножения и деления используются при обработке чисел с разрядностью, кратной двум байтам, составленных из цепочек. Мнемоника команд, обеспечивающих обработку чисел с учетом знака, отличается наличием буквы "I" в обозначении: IMUL op1 и IDIV op1.
Наконец, еще одной особенностью арифметики МП является возможность представления двоично-десятичных чисел. В таких числах четыре двоичных разряда объединяются в тетраду и соответствуют одной десятичной цифре. Двухбайтное двоичное число может соответствовать четырехразрядному десятичному числу. Такая форма представления чисел и называется двоично-десятичной. Так, например, десятичное число 958010 запишется в двоично-десятичном виде как 1001010110000000. Операции над двоично-десятичными числами выполняются в два этапа. Сначала осуществляется операция над операндами, как обычными двоичными числами, а затем осуществляется коррекция результата с помощью специальных команд коррекции.
Логические команды и команды сдвига. В МП могут выполняться все базовые логические операции, а также некоторые другие. Их мнемоника практически совпадает с названием операций:
AND op1, ор2 – (логическое И);
OR op1, ор2 – (логическое ИЛИ);
NOT op1 – (логическое НЕ);
XOR op1, ор2 – (исключающее ИЛИ или сумма но модулю два).
Каждый разряд двоичного числа в логических командах рассматривается как логическая переменная – "1" или "0" и выполнение логических операций осуществляется поразрядно. Команда AND используется для того, чтобы сбросить в "0" отдельные разряды операнда, не затронув остальные. Для этого операция логического И выполняется между операндом и "маской" – двоичным числом, все разряды которого равны единице, а те, которые у операнда должны быть установлены в "0", – равны нулю. Например, для установки 3-го разряда у некоторого операнда А в нуль достаточно выполнить операцию логического "И" с маской, в которой все разряды, кроме третьего, равны "1", т.е. 11110111:
Для установки в единицу отдельных разрядов операнда, не затрагивая других, используется команда OR (логическое ИЛИ). Для этого в качестве маски выбирается число, в котором все разряды равны нулю, кроме тех, которые в операнде должны быть установлены в единицу:
В данном примере с помощью операции логического ИЛИ пятый и нулевой разряды операнда А устанавливаются в "1", не затрагивая остальных.
Команда XOR используется для получения инверсии всех или отдельных разрядов операнда А или обнуления всех его разрядов. В первом случае необходима маска, в которой разряды, подлежащие инвертированию, равны "1", во втором достаточно выполнить команду, используя в качестве операндов одно и то же слово:
Логической командой, позволяющей осуществлять проверку отдельных разрядов операнда без изменения его, является команда TEST. Эта команда выполняет операцию логического И операнда с маской. При этом устанавливаются все признаки результата, а сам результат не сохраняется и операнд таким образом не изменяется.
Для выполнения операций сдвига битов операнда на определенное число разрядов влево или вправо в МП Intel 8086 имеется восемь команд. Сдвиги подразделяются на простые и циклические, арифметические и логические, сдвиги с учетом бита переноса CF или без учета (рис. 4.16).
Рис. 4.16. Логический сдвиг (й); циклический сдвиг через перенос (б); циклический сдвиг (в)
В командах логических сдвигов влево или вправо (рис. 4.16, а) с противоположной стороны операнда "вдвигаются" нули, а выдвигаемые биты теряются, кроме последнего, который сохраняется в бите переноса СF. Арифметический сдвиг влево аналогичен логическому, а сдвиг вправо (на рисунке не показан) отличается от логического тем, что вместо нулей на место выдвигаемых битов дублируется самый старший знаковый бит. Команды циклического сдвига отличаются тем, что операнд считается "кольцом", в котором выдвигаемые с одной стороны биты вдвигаются с другой (см. рис. 4.16, б, в). Циклический сдвиг может осуществляться с учетом бита переноса или без учета. Если сдвиг осуществляется с учетом бита переноса (см. рис. 4.16, б), то этот бит включается в кольцо.
Команда сдвига имеет следующий обобщенный вид: Мнемоника Операнд, Число сдвигов.
Мнемоника команд сдвига состоит из трех символов. Первый обозначает тип сдвига: простой S (shift), или циклический, называемый ротацией R (rotation). Второй символ конкретизирует тип сдвига: арифметический H, логический L, простой циклический О, циклический с учетом переноса С. Третий символ обозначает направление сдвига: влево L и вправо R. Например, команда RCL соответствует циклическому сдвигу с учетом переноса влево. В качестве операнда может выступать содержимое регистра или ячейки ОЗУ. Число сдвигов может быть указано числовой константой либо косвенно, путем указания регистра CL. В последнем случае в этот регистр предварительно должна быть занесена константа, соответствующая числу сдвигов. Приведем примеры команд сдвигов:
SLR [SI]+50, 1
логический сдвиг вправо содержимого ячейки ОЗУ с адресом [SI] +50 на один разряд;
ROL SIGMA, CL
циклический сдвиг влево содержимого ячейки ОЗУ SIGMA. Количество сдвигаемых разрядов содержится в регистре CL.