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

Микропроцессор ЦП выполняет четыре основных арифме­тических действия - сложение, вычитание, умножение и деление над 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).








Дата добавления: 2015-12-22; просмотров: 1688;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.