Команда OUT служит для пересылки данных (байта или слова) из аккумулятора (из AL или АХ) в порт вывода. Эта команда, как и команда IN, имеет два формата, которые опре­деляют способ адресации порта вывода. Преимущества и недо­статки использования каждого из форматов определяются теми же соображениями, что и для команды IN.

Команда XLAT осуществляет табличное преобразование кодов. Таблица размером не более 256 байт размещается в па­мяти, а ее начальный адрес - в регистре ВХ. При выполнении этой команды содержимое AL использу­ется в качестве относительного адреса строки таблицы, из которой байт пере­сылается в AL.

Пересылки адреса операнда. Включают три команды: LEA (загрузить исполнительный адрес), LDS (загрузить указатель в DS) и LES (загрузить указатель в ES). Эти команды служат средством управления механизмом адресации операндов.

По команде LEA извлекается не сам операнд, а его испол­нительный адрес ЕА. Действие команды состоит в передаче вычисленного 16-разрядного адреса операнда в 16-разрядный регистр, код которого указан в поле reg. Использование коман­ды LEA удобно при составлении подпрограмм, работающих с параметрами. В этом случае перед вызовом подпрограммы выделенный регистр загружается адресом переменной, которая предварительно записана в память в качестве параметра. На­пример, подпрограмма оперирует с параметром, адрес которого содержится в РОН ВХ. Если перед вызовом этой под­программы выполнить команду LEA BX, ALPHA, где ALPHA - имя ячейки памяти, содержащей переменную, то подпрограмма будет использовать в качестве параметра переменную из ячейки ALPHA. Если же перед вызовом подпрограммы выполнить команду LEA BX, BETA, то в качестве значения параметра под­программа будет использовать значение переменной из ячейки с именем BETA.

НЕ нашли? Не то? Что вы ищете?

Команды LDS и LES используются, в основном, при обра­щении к данным, находящимся вне текущих сегментов DS или ES, так, что возникает необходимость изменить базовый адрес сегмента. Пара 16-разрядных адресов - база сегмента и смеще­ние в сегменте, называемая указателем, предварительно загру­жается в память. Относительный адрес указателя определяется значениями полей mod и rпостбайта команды LDS (или LES). Значение смещения содержится в двух первых байтах указателя, а базовый адрес сегмента - в третьем и четвертом байтах. По команде LDS (или LES) происходит обращение к указателю и осуществляется загрузка регистра DS (или ES) базовым адресом, а смещение пересылается в регистр, указан­ный полем reg постбайта команды.

Пересылки флагов. Включают четыре однобайтовые коман­ды: LAHF (загрузить АН флагами), SAHF (запомнить АН в регистре F), PUSH F (занести F в стек) и POP F (извлечь из стека в F).

По команде LAHF осуществляется пересылка младшего байта регистра флагов F в АН, а по команде SAHF - обратная пересылка. Эти команды введены в систему команд ЦП для упрощения программной совместимости с ВМ80. В частности, без их использования для реализации команд PUSH PSW и POP PSW BM80 с помощью команд ЦП потребовалось бы по 9 байт памяти, а использование, например, команды LAHF позволяет при реализации команды PUSH PSW обой­тись всего двумя байтами: LAHF, PUSH AX. Команда PUSHF помещает содержимое регистра F в стек, причем сначала запи­сывается старший байт, а затем младший байт регистра F.

1.5. Арифметические команды

Микропроцессор ЦП выполняет четыре основных арифме­тических действия - сложение, вычитание, умножение и деление над 8- и 16-разрядными данными со знаками и без знака. Числа со знаком представлены в ЦП в дополнительном коде и их диа­пазон составляет от -32768 до +32767. Для реализации арифметических действий над числами, представленными в двоично-десятичном коде, введены специальные команды коррекции ре­зультатов. Все арифметические команды влияют на флаги.

Операции сложения. Включают три мнемокода: ADD (сло­жить), ADC (сложить с учетом переноса) и INC (увеличить на единицу).

Команда ADD осуществляет сложение операнда источника с операндом места назначения. Источником и местом назначе­ния обычно являются регистр и память, причем источником могут быть также данные (константы), непосредственно пред­ставленные в команде. В первом формате поле d определяет место назначения результатов сложения: при d = 1 - это ре­гистр, а при d = 0 - память.

Во втором формате поле s определяет число байтов данных, непосредственно представленных в команде. При s=0 команда состоит из 4 байт, причем в двух последних записана 16-разряд­ная константа. При s=1 команда состоит из 3 байт и послед­ний, третий, содержит 8-разрядную константу, которая предва­рительно (т. е. до сложения) расширяется со знаком до 16 раз­рядов. Напомним, что расширение со знаком состоит в распространении значения знакового разряда байта на весь старший байт; например, константа 5Аh будет расширена до 005Аh, а константа 8Аh - до FFh.

Команда ADC выполняет операцию сложения двух операн­дов с прибавлением значения флага CF. Она используется для организации сложения многоразрядных чисел, двоичное пред­ставление которых превышает 16 разрядов. Сначала по команде ADD суммируются младшие разряды, а затем при сложении старших разрядов чисел используется команда ADC, ко­торая позволяет учитывать единицу переноса. В качестве источ­ника и места назначения операндов может служить регистр и память.

Команда ADC имеет форматы, аналогичные форматам команды ADD.

Команда INC вызывает увеличение на единицу (инкрементирование) содержимого регистра или памяти. Необходимо отме­тить, что эта команда, так же как и команда DEC, влияет на все флаги, кроме CF.

Операции вычитания. Включают пять мнемокодов: SUB (вычесть), SBB (вычесть с учетом заема), DEC (уменьшить на единицу), NEG (изменить знак) и СМР (сравнить).

По команде SUB происходит вычитание операнда источника из операнда места назначения. Как и в команде сложения, операнды могут находиться в регистрах и памяти. В качестве вычитаемого может также служить операнд (константа), задан­ный непосредственно в команде.

Команда SBB служит для вычитания операндов с учетом заема, т. е. наряду с операндами в вычитании участвует значе­ние флага CF.

Команда DEC вызывает уменьшение на единицу (декрементирование) содержимого регистра или памяти и имеет два формата, как и команда INC.

Команда NEG изменяет знак операнда, причем используется представление операнда в дополнительном коде. Например, если операнд есть -1 (), то команда NEG изменит его на + 1 ().

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

Операции умножения. Включают два мнемокода: MUL (ум­ножить) и IMUL (умножить числа со знаком).

По команде MUL происходит умножение без знака содержи­мого аккумулятора (AL или АХ) на операнд источника, а ре­зультат двойной длины возвращается в аккумулятор и регистр, используемый для его расширения (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов). Команда затрагивает только два флага CF и OF, которые устанавливаются в «1», если старшая половина резуль­тата отлична от нуля.

В отличие от операций сложения и вычитания обычное умножение чисел, представленных в двоичной системе счисле­ния, дает правильные результаты только для чисел без знака. Например, если рассматривать умножение 8-разрядных чисел В x В = В как 255 x 255 =, то результат будет правильным. Если же эти перемно­жаемые числа рассматривать как числа со знаком (-1) x (-1), то результат -511 будет неверным. Когда перемножаемые операнды и результат рассматриваются как числа со знаком, используется команда IMUL.

Операции деления. Включают два мнемокода: DIV (разде­лить) и IDIV (разделить числа со знаком).

По команде DIV происходит деление без знака операнда двойной длины, находящегося в аккумуляторе и регистре, ис­пользуемом для расширения аккумулятора (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов) на операнд из заданного источника. Частное зано­сится в аккумулятор (AL или АХ), а остаток - в регистр расши­рения аккумулятора (АН или DX). При выполнении операции деления флаги принимают произвольные значения. При поло­жительном частном, превышающем максимально допустимое значение max, или при отрицательном частном, которое меньше, чем 0 - (mах+1), частное и остаток будут иметь неопределен­ные значения и произойдет прерывание типа 0.

Особенность команды деления IDIV состоит в том, что част­ное и остаток всегда имеют одинаковые знаки. Например, при делении числа -47 на +3 из двух возможных результатов: -15 с остатком -2 и -16 с остатком +1, будет получен пер­вый результат. Дробные значения частного округлены до бли­жайшего целого. Значения флагов при выполнении команды IDIV также не определены.

Операции коррекции результата позволяют выполнять ариф­метические действия над числами, представленными в двоично-десятичной системе счисления или в коде ASCII, используемом при обмене информацией и при вводе с клавиа­туры. Для коррекции результатов сложения и вычитания чисел в двоично-десятичной системе служат команды DAA (коррекция сложения) и DAS (коррекция вычитания).

Аналогичным образом, но с вычитанием констант 6 и 60Н осуществляется коррекция результата вычисления в AL по команде DAS.

Поскольку для чисел, представленных в обычном двоично-де­сятичном коде, коррекция результатов умножения и деления не­возможна, используется неупакованный двоично-десятичный код ASCII.

Для коррекции результатов арифметических действий над числами в коде ASCII используются четыре команды: AAA (кор­рекция сложения), AAS (коррекция вычитания), ААМ (коррек­ция умножения) и AAD (коррекция деления).

К группе арифметических операций относятся также две команды, которые осуществляют расширение со знаком 8- и 16-разрядных операндов. Эти команды играют вспомогательную роль при подготовке операнда, используемого в качестве дели­мого. Поскольку делимое при делении 8-разрядных операндов размещается в 16-разрядном аккумуляторе АХ (а при делении 16-разрядных операндов в 32-разрядном составном регистре DX, АХ), необходимо при подготовке делимого заполнить АН (или DX). Для чисел без знака указанные регистры заполняются ну­лями. При делении чисел со знаком перед заполнением указан­ных регистров требуется анализировать знак делимого и запол­нить регистр либо нулями, если делимое является положитель­ным, либо единицами, если делимое отрицательное. Для этих целей используются команды CBW (расширение со знаком бай­та до слова) и CWD (расширение со знаком слова до двойного слова). По команде CBW (CWD) знак AL (или АХ), т. е. самый старший разряд регистра, записывается во все разряды регист­ра АН (или DX).

1.6. Сдвиги и логические команды

Группа сдвигов и логических команд служит для реализации ряда функций, связанных с преобразованием и анализом опе­рандов, которые размещаются как в регистре, так и в памяти.

Команды сдвига. Обеспечивают прежде всего удвоение чисел и деление пополам. Для удвоения числа без знака достаточно сдвинуть все его разряды на один влево, заполнив младший бит нулем. Поскольку старший бит при сдвиге передается в разряд CF, анализ значения этого флага позволяет судить о точности результата. Например, удвоение числапутем сдвига влево дает точный результат , что определяется значением CF=0. Дальнейшее удвоение даст не­правильный результат 4 (), что определяется значением CF=1. Аналогично, используя сдвиг вправо, осуществляется деление числа без знака пополам. Например, сдвигая число, получаем 6 () и CF=1, что свидетельствует о неточном результате.

Команды, выполняющие удвоение и деление пополам чисел без знака, имеют мнемокоды SHL (логический сдвиг влево) и SHR (логический сдвиг вправо) соответственно. Аналогичные операции для чисел со знаком реализуются с помощью команд SAL (арифметический сдвиг влево) и SAR (арифметический сдвиг вправо).

Длина сдвигаемого операнда, как обычно, опре­деляется полем w первого байта (w = 0 - 8-разрядный операнд, w = 1 - 16-разрядный операнд). С помощью любой из перечис­ленных команд сдвига операнд может сдвигаться на произволь­ное число разрядов до 8 или 16 включительно.

Значение флага OF устанавливается равным «1», если окончательное значение бита знака при последнем сдвиге отли­чается от его предыдущего значения.

Логические команды. Служат для реализации четырех буле­вых функций: AND (поразрядное логическое И), OR (поразряд­ное логическое ИЛИ), XOR (поразрядная логическая сумма по модулю 2) и NOT (поразрядное логическое НЕ). Сюда также от­носится команда TEST (проверка), которая состоит в поразряд­ном логическом умножении (И) операндов без занесения резуль­тата умножения в место назначения и служит для анализа со­держимого источника по значениям флагов.

Все двухоперандные команды AND, OR, XOR и TEST имеют по три одинаковых формата и совпадают по времени исполне­ния. Однооперандная команда NOT осуществляет инвертирова­ние операнда и имеет один формат. Следует отметить, что при выполнении логических команд флаги CF и OF не изменяют сво­их значений, а в соответствии с результатом операции устанав­ливаются флаги PF, SF и ZF. Флаг AF после выполнения логи­ческих команд имеет неопределенное значение.

1.7. Команды обработки строк данных

Строкой называют последовательность байтов или слов, раз­мещаемую в смежных ячейках памяти. Примером может служить строка, которая вводится с терминала в ВМ. Операции со строками выполняются над каждым элементом строки (байтом или словом), так что время их выполнения пропорционально числу элементов в строке. В ЦП имеется несколько однобайт­ных команд, выполняющих простые операции над строками. Эти команды значительно ускоряют манипуляции над строками бла­годаря уменьшению времени, затрачиваемого на обработку каж­дого элемента и на вспомогательные действия, которые необхо­димо выполнять между обработкой последовательных элементов. К вспомогательным действиям относятся: переадресация элемента строки, уменьшение на единицу счетчика числа обрабаты­ваемых элементов и проверка достижения счетчиком нуля.

Для иллюстрации временных затрат на обработку одного элемента строки рассмотрим процесс пересылки строки из одной области памяти в другую. Для указания начального адреса пер­вого элемента исходной строки и строки результата используют­ся регистры SI (индекс источника) и DI (индекс места назначе­ния) соответственно, число пересылаемых элементов задается в регистре-счетчике СХ. Пересылка строки заключается в выпол­нении следующих шагов (при описании каждого шага указана соответствующая команда):

1: JCXZ Exit ; если СХ=0, то пересылка закончена

2: MOV AL, [SI] ; переслать байт из в AL

3: MOV [DI], AL ; запомнить содержимое AL в памяти

4: INC SI ; увеличить SI на «1»

5: INC DI ; увеличить DI на «1»

6: DEC СХ ; уменьшить СХ на «1»

7: JNZ 1 ; перейти к шагу 1.

Собственно пересылка байта выполняется на шагах 2 и 3. На шагах 4 и 5 осуществляется вычисление адресов источника и места назначения для следующего элемента строки. Наконец, шаги 1, 6 и 7 служат для определения числа обработанных эле­ментов.

Действия, которые выполняются с помощью указанных че­тырех команд на протяжении шагов 2-5, могут быть выполне­ны с помощью одной команды MOVS (переслать элемент стро­ки). Для организации циклического исполнения команды MOVS (а также других команд обработки строк) используется одно­байтовая команда-префикс REP (повторить). Она записывается перед основной командой (например, REP MOVS) и обеспечи­вает ее выполнение N раз. Число повторений N предварительно записывается в регистр СХ и на каждом шаге содержимое СХ уменьшается на единицу. Используются три мнемокода команды-префикса: REP, REPNE/REPNZ и REPE/REPZ. Первый мнемо­код анализирует только одно условие окончания повторений: (СХ)=0. В тех случаях, когда возникает необходимость допол­нительно анализировать условие ZF=0 (или ZF=1), исполь­зуется второй (или третий) мнемокод. Команда REP позволяет еще больше сократить время на обработку элементов строки за счет совмещения операций (СХ) = (СХ) - 1 с проверкой дости­жения счетчиком нуля. Так, совокупность действий, выполня­емых за семь указанных выше шагов, может быть выполнена командой MOVS с префиксом REP.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27