Арифметические команды
Микропроцессор ЦП выполняет четыре основных арифметических действия - сложение, вычитание, умножение и деление над 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 (11111111), то команда NEG изменит его на + 1 (00000001).
Команда СМР служит для сравнения двух операндов путем вычитания значения операнда места назначения из операнда источника. В отличие от обычного вычитания полученная разность никуда не заносится, а результатом операции сравнения являются значения флагов, которые устанавливаются в зависимости от соотношения сравниваемых операндов. Команда СМР имеет форматы, аналогичные команде вычитания.
Операции умножения.Включают два мнемокода: MUL (умножить) и IMUL (умножить числа со знаком).
По команде MUL происходит умножение без знака содержимого аккумулятора (AL или АХ) на операнд источника, а результат двойной длины возвращается в аккумулятор и регистр, используемый для его расширения (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов). Команда затрагивает только два флага CF и OF, которые устанавливаются в «1», если старшая половина результата отлична от нуля.
В отличие от операций сложения и вычитания обычное умножение чисел, представленных в двоичной системе счисления, дает правильные результаты только для чисел без знака. Например, если рассматривать умножение 8-разрядных чисел 11111111В x 11111111В = 1111111000000001В как 255 x 255 = 65 025, то результат будет правильным. Если же эти перемножаемые числа рассматривать как числа со знаком (-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).
Дата добавления: 2018-11-26; просмотров: 1090;