Команда 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 - до FF8Аh.
Команда 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 |


