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

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

Большинство арифметических и логических команд влияют на регистр состояния процессора (или Флаги)

Как вы можете видеть, в этом регистре 16 бит. Каждый бит называется флагом и может принимать значение 1 или .

    Carry Flag (CF) — перенос — этот флаг устанавливается в 1, когдаслучается беззнаковое переполнение. Например, если вы увеличили байт 255 + 1 (результат не помещается в диапазоне 0. 255). Если переполнение не происходит, этот флаг установлен в .

Zero Flag (ZF) — ноль — устанавливается в 1, если результат равен нулю. Если результат не нулевой, то этот флаг устанавливается в .

Sign Flag (SF) — знак — установлен в 1, если результат — отрицательное число. Если результат положительный, то этот флаг устанавливается в . Обычно этот флаг принимает значение старшего значащего бита.

Overflow Flag (OF) — переполнение — устанавливается в 1, если случается переполнение при арифметических операциях со знаком. Например, если вы увеличили байт 100 + 50 (результат не помещается в диапазоне -128. 127).

Parity Flag (PF) — контроль четности — этот флаг устанавливается в 1, если в младших 8-битовых данных четное число. Если число нечетное, то этот бит установлен в . Даже если результат — это слово, то анализируются только 8 младших бит!

Auxiliary Flag (AF) — внешний перенос — установлен в 1, если случилось переполнение без знака младших 4-х битов (т.е. перенос из 3-го бита).

Interrupt enable Flag (IF) — прерывание — если этот флаг установлен в 1, то процессор реагирует на прерывание от внешних устройств.

Direction Flag (DF) — направление — этот флаг используется некоторыми командами для обработки цепочки данных. Если флаг установлен в — обработка происходит в прямом направлении, если 1 — в обратном.

Имеются три группы команд.

Первая группа: ADD, SUB,CMP, AND, TEST, OR, XOR

Эти типы операндов поддерживаются:

REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memory: [BX], [BX+SI+7], переменная, и т.п.

immediate: 5, -24, 3Fh, 10001101b, и т.п.

После операции между операндами результат всегда записывается в первый операнд. Команды CMP и TEST воздействуют только на флаги и не записывают результат (эта команда используется для принятия решения во время выполнения программы).

Эти команды влияют только на флаги:
CF, ZF, SF, OF, PF, AF.

    ADD — Прибавить второй операнд к первому.

SUB — Вычесть второй операнд из первого.

CMP — Вычесть второй операнд из первого только для флагов.

AND — Логическое И между всеми битами двух операндов. При этом соблюдаются правила:

1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0

Как видите, мы получаем 1 только в том случае, если оба бита равны 1.

TEST — То же самое, что AND, но только для флагов.

OR — Логическое ИЛИ между всеми битами двух операндов. При этом соблюдаются правила:

1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0

Как видите, мы получаем 1 каждый раз, когда хотя бы один бит равен 1.

XOR — Логическое XOR (исключающее ИЛИ) между всеми битами двух операндов. При этом соблюдаются правила:

1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0

Как видите, мы получаем 1 каждый раз, когда биты имеют различное значение.

Вторая группа: MUL, IMUL, DIV, IDIV

Эти типы операндов поддерживаются:

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memory: [BX], [BX+SI+7], переменная, и т.п.

Команды MUL и IMUL влияют только на эти флаги:
CF, OF
Если результат превышает размер операнда, то эти флаги установлены в 1, если результат умещается в размер операнда, то эти флаги установлены в .

Для команд DIV и IDIV флаги не определены.

    MUL — беззнаковое умножение:

если операнд — это байт:
AX = AL * операнд .

если операнд — это слово:
(DX AX) = AX * операнд .

если операнд — это байт:
AX = AL * операнд .

если операнд — это слово:
(DX AX) = AX * операнд .

если операнд — это байт:
AL = AX / операнд
AH = остаток (модуль). .

если операнд — это слово:
AX = (DX AX) / операнд
DX = остаток (модуль). .

если операнд — это байт:
AL = AX / операнд
AH = остаток (модуль). .

если операнд — это слово:
AX = (DX AX) / операнд
DX = остаток (модуль). .

Третья группа: INC, DEC, NOT, NEG

Эти типы операндов поддерживаются:

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memory: [BX], [BX+SI+7], переменная, и т.п.

Команды INC и DEC влияют только на эти флаги:
ZF, SF, OF, PF, AF.

Команда NOT не влияет ни на какие флаги!

Команда NEG влияет только на эти флаги:
CF, ZF, SF, OF, PF, AF.

    NOT — инвертирование каждого бита операнда.

  • NEG — Меняет знак операнда (дополнение до двух). Обычно она инвертирует каждый бит операнда, а затем прибавляет к нему единицу. Например, 5 преобразуется в -5, а -2 преобразуется в 2.
  • Арифметические и логические команды

    В общем случае система команд процессора включает в себя следующие четыре основные группы команд:

    • команды пересылки данных;
    • арифметические команды;
    • логические команды;
    • команды переходов.

    Команды пересылкиs данных не требуют выполнения никаких операций над операндами. Операнды просто пересылаются (точнее, копируются) из источника (Source) в приемник (Destination). Источником и приемником могут быть внутренние регистры процессора, ячейки памяти или устройства ввода/вывода. АЛУ в данном случае не используется.

    Арифметические команды выполняют операции сложения, вычитания, умножения, деления, увеличения на единицу (инкрементирования), уменьшения на единицу (декрементирования) и т.д. Этим командам требуется один или два входных операнда. Формируют команды один выходной операнд.

    Логические команды производят над операндами логические операции, например, логическое И, логическое ИЛИ, исключающее ИЛИ, очистку, инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим, требуется один или два входных операнда, и формируют они один выходной операнд.

    Наконец, команды переходов предназначены для изменения обычного порядка последовательного выполнения команд. С их помощью организуются переходы на подпрограммы и возвраты из них, всевозможные циклы, ветвления программ, пропуски фрагментов программ и т.д. Команды переходов всегда меняют содержимое счетчика команд. Переходы могут быть условными и безусловными. Именно эти команды позволяют строить сложные алгоритмы обработки информации.

    В соответствии с результатом каждой выполненной команды устанавливаются или очищаются биты регистра состояния процессора (PSW). Но надо помнить, что не все команды изменяют все имеющиеся в PSW флаги. Это определяется особенностями каждого конкретного процессора.

    У разных процессоров системы команд существенно различаются, но в основе своей они очень похожи. Количество команд у процессоров также различно. Например, у упоминавшегося уже процессора МС68000 всего 61 команда, а у процессора 8086 — 133 команды. У современных мощных процессоров количество команд достигает нескольких сотен. В то же время существуют процессоры с сокращенным набором команд (так называемые RISC-процессоры), в которых за счет максимального сокращения количества команд достигается увеличение эффективности и скорости их выполнения.

    Рассмотрим теперь особенности четырех выделенных групп команд процессора более подробно.

    3.3.1. Команды пересылки данных

    Команды пересылки данных занимают очень важное место в системе команд любого процессора. Они выполняют следующие важнейшие функции:

    • загрузка (запись) содержимого во внутренние регистры процессора;
    • сохранение в памяти содержимого внутренних регистров процессора;
    • копирование содержимого из одной области памяти в другую;
    • запись в устройства ввода/вывода и чтение из устройств ввода/вывода.

    В некоторых процессорах (например, Т-11) все эти функции выполняются одной единственной командой MOV (для байтовых пересылок — MOVB) но с различными методами адресации операндов.

    В других процессорах помимо команды MOV имеется еще несколько команд для выполнения перечисленных функций. Например, для загрузки регистров могут использоваться команды загрузки, причем для разных регистров — разные команды (их обозначения обычно строятся с использованием слова LOAD — загрузка). Часто выделяются специальные команды для сохранения в стеке и для извлечения из стека (PUSH — сохранить в стеке, POP — извлечь из стека). Эти команды выполняют пересылку с автоинкрементной и с автодекрементной адресацией (даже если эти режимы адресации не предусмотрены в процессоре в явном виде).

    Иногда в систему команд вводится специальная команда MOVS для строчной (или цепочечной) пересылки данных (например, в процессоре 8086). Эта команда пересылает не одно слово или байт, а заданное количество слов или байтов (MOVSB), то есть инициирует не один цикл обмена по магистрали, а несколько. При этом адрес памяти, с которым происходит взаимодействие, увеличивается на 1 или на 2 после каждого обращения или же уменьшается на 1 или на 2 после каждого обращения. То есть в неявном виде применяется автоинкрементная или автодекрементная адресация.

    Читайте также  Схема управления насосом - дозатором

    В некоторых процессорах (например, в процессоре 8086) специально выделяются функции обмена с устройствами ввода/вывода. Команда IN используется для ввода (чтения) информации из устройства ввода/вывода, а команда OUT используется для вывода (записи) в устройство ввода/вывода. Обмен информацией в этом случае производится между регистром-аккумулятором и устройством ввода/вывода. В более продвинутых процессорах этого же семейства (начиная с процессора 80286) добавлены команды строчного (цепочечного) ввода (команда INS) и строчного вывода (команда OUTS). Эти команды позволяют пересылать целый массив (строку) данных из памяти в устройство ввода/вывода (OUTS) или из устройства ввода/вывода в память (INS). Адрес памяти после каждого обращения увеличивается или уменьшается (как и в случае с командой MOVS).

    Также к командам пересылки данных относятся команды обмена информацией (их обозначение строится на основе слова Exchange). Может быть предусмотрен обмен информацией между внутренними регистрами, между двумя половинами одного регистра (SWAP) или между регистром и ячейкой памяти.

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

    Арифметические команды рассматривают коды операндов как числовые двоичные или двоично-десятичные коды. Эти команды могут быть разделены на пять основных групп:

    • команды операций с фиксированной запятой (сложение, вычитание, умножение, деление);
    • команды операций с плавающей запятой (сложение, вычитание, умножение, деление);
    • команды очистки;
    • команды инкремента и декремента;
    • команда сравнения.

    Команды операций с фиксированной запятой работают с кодами в регистрах процессора или в памяти как с обычными двоичными кодами. Команда сложения (ADD) вычисляет сумму двух кодов. Команда вычитания (SUB) вычисляет разность двух кодов. Команда умножения (MUL) вычисляет произведение двух кодов (разрядность результата вдвое больше разрядности сомножителей). Команда деления (DIV) вычисляет частное от деления одного кода на другой. Причем все эти команды могут работать как с числами со знаком, так и с числами без знака.

    Команды операций с плавающей запятой (точкой) используют формат представления чисел с порядком и мантиссой (обычно эти числа занимают две последовательные ячейки памяти). В современных мощных процессорах набор команд с плавающей запятой не ограничивается только четырьмя арифметическими действиями, а содержит и множество других более сложных команд, например, вычисление тригонометрических функций, логарифмических функций, а также сложных функций, необходимых при обработке звука и изображения.

    Команды очистки (CLR) предназначены для записи нулевого кода в регистр или ячейку памяти. Эти команды могут быть заменены командами пересылки нулевого кода, но специальные команды очистки обычно выполняются быстрее, чем команды пересылки. Команды очистки иногда относят к группе логических команд, но суть их от этого не меняется.

    Команды инкремента (увеличения на единицу, INC) и декремента (уменьшения на единицу, DEC) также бывают очень удобны. Их можно в принципе заменить командами суммирования с единицей или вычитания единицы, но инкремент и декремент выполняются быстрее, чем суммирование и вычитание. Эти команды требуют одного входного операнда, который одновременно является и выходным операндом.

    Наконец, команда сравнения (обозначается CMP) предназначена для сравнения двух входных операндов. По сути, она вычисляет разность этих двух операндов, но выходного операнда не формирует, а всего лишь изменяет биты в регистре состояния процессора (PSW) по результату этого вычитания. Следующая за командой сравнения команда (обычно это команда перехода) будет анализировать биты в регистре состояния процессора и выполнять действия в зависимости от их значений (о командах перехода речь идет в разделе 3.3.4). В некоторых процессорах предусмотрены команды цепочечного сравнения двух последовательностей операндов, находящихся в памяти (например, в процессоре 8086 и совместимых с ним).

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

    Назначение команд этой группы вытекает из названия — прибавить число или содержимое регистра (пары) или содержимое индексированного адреса к содержимому регистра (пары). Это первая из групп арифметических команд, с которыми мы еще столкнемся. Сразу отметим, что команды этой группы работают в абсолютной двоичной арифметике.

    5.5.1. Простое сложение.

    Все команды этой подгруппы влияют на флаг переноса (С-флаг). В зависимости от того, превосходит ли результат сложения FF (255) для однобайтного сложения или FFFF (65535) для двухбайтного сложения содержимого двух регистровых пар, С-флаг либо включается, либо выключается.

    Например: 2D + C0 = ED (45+192=237) -> C=0;

    5D + C0 = 1D (93+192=29) -> C=1.

    ADD A, n

    5.5.2. Приращение.

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

    Поскольку назначение команд «инкремент» состоит не в выполнении операций сложения, а в организации счетчиков, они не влияют на флаг переноса.

    Обратите внимание на разницу команд INC HL и INC (HL).

    INC HL — прямая команда для регистра HL, она гласит «увеличить на единицу содержимое регистровой пары HL».

    INC (HL) — пример применения косвенной адресации; эта команда означает «увеличить на единицу содержимое ячейки памяти, адрес которой находится в регистре HL».

    5.5.3. Сложение с учетом переноса.

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

    После окончания операции флаг переноса устанавливается в соответствии с результатом (есть перенос — включен, нет — выключен).

    Применяются они при сложении многобайтных чисел. Так, например, при сложении двухбайтных чисел 035D и A0C0:

    возникает ситуация, когда сумма младших байтов дает число, большее 255 (FF). В этот момент и устанавливается флаг переноса. При сложении же старших байтов эта единица будет к ним прибавлена, если сложение производится командой ADC.

    ADC A, n

    5.6. Команды вычитания

    Команды этой группы прямо противоположны командам предыдущей группы. Они также работают в абсолютной двоичной арифметике. Их тоже можно разбить на три подгруппы.

    5.6.1. Простое вычитание.

    Команды этой подгруппы начинаются с мнемоники SUB и влияют на флаг переноса, но здесь в отличие от команд ADD флаг переноса устанавливается не когда байт переполняется, а когда при вычитании производится заем, т.е. когда вычитаемое больше уменьшаемого.

    SUB (IY+ s )

    Обратите внимание на то, что действие всех этих команд относится к регистру А (аккумулятору), поэтому в мнемониках на него нет указаний, это принимается по умолчанию.

    Так, SUB (HL) означает SUB A,(HL) – «вычесть из содержимого аккумулятора то число, которое находится в ячейке памяти, адрес которой находится в регистровой паре HL».

    5.6.2. Уменьшение (декремент).

    Декремент — уменьшение содержимого регистра или ячейки памяти на единицу. Операция прямо противоположна инкременту. Так же, как и последняя, она служит не столько для вычитания, сколько для организации каких-либо счетчиков, а потому она тоже не влияет на флаг переноса.

    5.6.3. Вычитание с учетом «займа».

    Команды этой подгруппы начинаются с мнемоник SBC. По своему смыслу они противоположны командам ADC. Отличие от команд SUB состоит в том, что если флаг переноса включен, то значит, при вычитании младшего разряда был сделан заем из старшего и поэтому при операции со старшим разрядом надо еще вычесть единицу.

    Эти команды применяются при вычитании многобайтных (двухбайтных и более) чисел.

    5.7. Команды сравнения

    Мнемоники команд этой группы начинаются с CP от слова compare (сравнивать).

    Применяются эти команды чрезвычайно часто. С их помощью можно сравнивать содержимое аккумулятора с числом, с содержимым регистра или с байтом оперативной памяти и по результатам сравнения предпринимать те или иные действия. Поскольку эти команды однозначно относятся к регистру А, то в мнемониках он не указывается, это подразумевается по умолчанию.

    В результате операции сравнения значение регистра А не изменяется. Результат операции сказывается только на флагах регистра F.

    Если содержимое аккумулятора больше или равно сравниваемому числу, то флаг переноса С выключен (равен 0). Если же оно меньше — включен (равен 1).

    CP A, n

    5.8. Команды логики

    Система команд процессора Z-80 позволяет выполнять три вида логических операций — логическое «И» (AND), логическое «ИЛИ» (OR) и «ИСКЛЮЧАЮЩЕЕ ИЛИ» (XOR). В соответствии с ними мы можем выделить три подгруппы в этой группе команд.

    Эти операции похожи на команды сравнения. В них также участвуют два операнда, один из которых находится в аккумуляторе.

    5.8.1. Команды «И» (AND).

    Данная команда двоичной логики дает результат, равный одному из операндов, если оба операнда равны, а если нет, то нули. Таким образом, результат может быть равен единице, только если оба операнда равны единице.

    Пример: Первый операнд 1010 1010 (AA)

    Второй операнд 1100 0000 (CO)

    Читайте также  Простой измеритель электромагнитного поля

    Результат AND 1000 0000 (B0)

    Как видите, операция производится побитно, т.е. нулевой бит первого числа сравнивается с нулевым битом второго, первый с первым, второй со вторым и т.д.

    В этой подгруппе существуют 11 операций:

    С помощью команды AND можно довольно эффектно сбрасывать биты аккумулятора. Например, если Вам нужно его обнулить, дайте команду:

    AND 0 (E6 0)

    В программах очень часто бывает нужно проверить состояние некоторых битов, при этом остальные желательно обнулить. Например, если в игровой программе управление ведется от Кемпстон-джойстика, то сигнал от кнопки «огонь» подается по 4-му биту порта 31.

    Можно было бы проверить, не включена ли эта кнопка командой CP 10 (десятичное 16), но из этого ничего не получится, т.к. часто кнопка «огонь» включается одновременно с движением объекта. Например, если объект движется вправо — вверх и при этом «стреляет», то включены биты 1,2 и 4 и код равен 2 + 4 + 10 =16. Такая «проверка» показала бы, что кнопка якобы не включена. Поэтому перед проверкой все остальные биты надо погасить. Это легко сделает команда AND 10, а потом можно давать и CP 10. Процесс гашения ненужных битов называется маскированием.

    5.8.2. Команда «ИЛИ» (OR).

    Эта команда также исполняется побитным сравнением двух двоичных чисел. Ее результат равен единице, если данный бит включен в первом или во втором операнде или в обоих вместе. Таким образом, в результате может быть 0 только если в обоих операндах 0, а в противном случае — 1.

    Пример: Первый операнд 1010 1010 (AA)

    Второй операнд 1100 0000 (C0)

    Результат OR 1110 1010 (EA)

    Эта команда позволяет Вам столь же эффективно включать нужные биты в аккумуляторе (или проверять их включение), как команда AND позволяла их выключать. Например, если Вам надо, чтобы в аккумуляторе были гарантированно включены биты 5, 3, 2 — дайте команду OR 2С (20 + 8 + 4 = 2C).

    Система команд центрального процессора

    Любая компьютерная программа представляет собой последовательность отдельных команд.

    Команда — это описание операции, которую должен выполнить компьютер. Как правило, у команды есть свой двоичный код, исходные данные [операнды] и результат.

    Например, у команды «сложить два числа» операндами являются слагаемые, а результатом — их сумма. А у команды «стоп» операндов нет, а результатом является прекращение работы программы.

    Для записи команды вместо двоичных кодов можно использовать восьмеричные или шестнадцатеричные коды, а также мнемоническое кодирование. В последнем случае каждая команда представляется последовательностью из двух, трех или четырех мнемонических символов. Большинство мнемонических кодов — это сокращения английских названий команд:

    LOD от Load [загрузить]
    STO от Store [сохранить]
    ADD от Add [сложить]
    SUB от Subtract [вычесть]
    JMP от Jump [перейти]
    JZ от Jump if zero [перейти если ноль]
    ROL от Rotate left [сдвинуть циклически влево]
    ROR от Rotate right [сдвинуть циклически вправо]
    HLT от Halt [остановить]

    Совокупность команд, выполняемых конкретным компьютером, называется системой команд этого компьютера. При изучении системы машинных команд полезно будет разделить их на три категории: команды передачи данных, арифметические и логические команды, а также команды управления.

    Команды передачи данных

    К этой категории относятся те команды, при выполнении которых происходит перемещение данных из одного места в другое. Процедура выполнения команд передачи данных больше напоминает копирование информации с одного места в другое, а не обычное их перемещение. Для передачи данных между ЦП и основной памятью существуют специальные термины. Запрос на заполнение регистра содержимым ячейки памяти обычно называют командой загрузки [LOAD], а запрос на передачу содержимого регистра в ячейку основной памяти — командой сохранения [STORE].

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

    Арифметические и логические команды указывают блоку управления на необходимость запросить выполнение определенных действий арифметико-логического блока. Как следует из самого названия арифметико-логического блока, он также предусматривает выполнение группы операций, отличающихся от основных арифметических действий. К ним относятся обычные логические операции AND [И], OR [ИЛИ] и XOR [Исключающее ИЛИ]. В основном они используются для манипуляции отдельными битами некоторого регистра; при этом состояние остальных регистров остается неизменным. Другая группа операций, реализованная в большинстве типов арифметико-логических блоков, состоит из команд, позволяющих перемещать содержимое регистров влево или вправо в пределах самих этих регистров. Такие операции называются операциями сдвига [SHIFT] или вращения [ROTATE], в зависимости от того, что происходит с битами, выходящими при перемещении содержимого регистра за его пределы. При операции сдвига эти биты просто отбрасываются, а при операции вращения — биты, покидающие пределы регистра с одного конца, помещаются во вновь вставляемые позиции на другом конце регистра. Последняя операция называется также циклическим сдвигом.

    Команды управления

    Команды управления предназначены для управления ходом выполнения программы, а не обработки каких-либо данных. Данная категория включает много интересных команд, например группа команд перехода [JUMP] или ветвления [BRANCH]. Они используются для перенаправления управляющего блока на выполнение команды, отличной от той, которая является очередной в выполняемой последовательности. Команды перехода реализуются в двух вариантах: команды безусловного перехода и команды условного перехода. К первому варианту относится команда типа «Пропустите все команды до этапа 5», а ко второму — команда типа «Если полученное число равно 0, то перейдите к этапу 5». Разница между ними состоит в том, что при выполнении команды условного перехода изменение последовательности произойдет только при выполнении указанного условия.

    Пример описания системы команд

    Рассматриваемая гипотетическая машина имеет регистр команд, регистр адреса и аккумулятор. Длина регистра команд и регистра адреса равна одному байту, а длинна аккумулятора — двум байтам.

    Память рассматриваемой машины состоит из 256 ячеек. Длина каждой ячейки равна двум байтам. Адрес любой ячейки памяти может быть представлен восьмибитовыми числами от 00000000 до 11111111 [в шестнадцатеричном представлении от 00 до FF].

    Длина каждой машинной команды равна двум байтам. Первый байт содержит код операции, последний байт образует поле операндов. В приведенной ниже таблице перечислены и кратко описаны команды, показанные в шестнадцатеричном представлении. Буквы ХХ используются для указания в поле операндов длины шестнадцатеричных чисел, являющихся адресами ячеек памяти.

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

    7.1. Сложение и вычитание.

    7.1.1. ADD – команда для сложения двух чисел. Она работает как с числами со знаком, так и без знака.

    ADD Приемник , Источник

    Логика работы команды:

    Возможные сочетания операндов для этой команды аналогичны команде MOV .

    По сути дела, это – команда сложения с присвоением, аналогичная принятой в языке C / C ++:

    Приемник += Источник;

    Операнды должны иметь одинаковый размер. Результат помещается на место первого операнда.

    После выполнения команды изменяются флаги, по которым можно определить характеристики результата:

    1. Флаг CF устанавливается, если при сложении произошёл перенос из старшего разряда. Для беззнаковых чисел это будет означать, что произошло переполнение и результат получился некорректным.
    2. Флаг OF обозначает переполнение для чисел со знаком.
    3. Флаг SF равен знаковому биту результата (естественно, для чисел со знаком, а для беззнаковых он равен старшему биту и особо смысла не имеет).
    4. Флаг ZF устанавливается, если результат равен 0.
    5. Флаг PF — признак чётности, равен 1, если результат содержит нечётное число единиц.

    add ax ,5 ; AX = AX + 5

    add dx,cx ;DX = DX + CX

    add dx,cl ;Ошибка: разный размер операндов.

    7.1.2. SUB — команда для вычитания одного числа из другого. Она работает как с числами со знаком, так и без знака.

    SUB Приемник , Источник

    Логика работы команды:

    Возможные сочетания операндов для этой команды аналогичны команде MOV .

    По сути дела, это – команда вычитания с присвоением, аналогичная принятой в языке C / C ++:

    Приемник -= Источник;

    Операнды должны иметь одинаковый размер. Результат помещается на место первого операнда.

    На самом деле вычитание в процессоре реализовано с помощью сложения. Процессор меняет знак второго операнда на противоположный, а затем складывает два числа.

    sub ax ,13 ; AX = AX — 13

    sub ax , bx ; AX = AX + BX

    sub b x,cl ;Ошибка: разный размер операндов.

    7.1.3. Инкремент и декремент. Очень часто в программах используется операция прибавления или вычитания единицы. Прибавление единицы называется инкрементом, а вычитание — декрементом. Для этих операций существуют специальные команды процессора: INC и DEC. Эти команды не изменяют значение флага CF.

    Эти команды содержит один операнд и имеет следующий синтаксис:

    INC Операнд

    DEC Операнд

    Логика работы команд:

    В качестве инкремента допустимы регистры и память: reg , mem .

    inc ax ; AX = AX + 1

    dec ax ; AX = AX — 1

    7.1.4. NEG – команда для изменения знака операнда.

    NEG Операнд

    Логика работы команды:

    В качестве декремента допустимы регистры и память: reg , mem .

    7.2. Сложение и вычитание с переносом.

    Читайте также  Сигнализация с сиреной и оповещением через сотовый телефон

    В системе команд процессоров x86 имеются специальные команды сложения и вычитания с учётом флага переноса (CF). Для сложения с учётом переноса предназначена команда ADC, а для вычитания — SBB. В общем, эти команды работают почти так же, как ADD и SUB, единственное отличие в том, что к младшему разряду первого операнда прибавляется или вычитается дополнительно значение флага CF.

    Они позволяют выполнять сложение и вычитание многобайтных целых чисел, длина которых больше, чем разрядность регистров процессора (в нашем случае 16 бит). Принцип программирования таких операций очень прост — длинные числа складываются (вычитаются) по частям. Младшие разряды складываются(вычитаются) с помощью обычных команд ADD и SUB, а затем последовательно складываются(вычитаются) более старшие части с помощью команд ADC и SBB. Так как эти команды учитывают перенос из старшего разряда, то мы можем быть уверены, что ни один бит не потеряется. Этот способ похож на сложение(вычитание) десятичных чисел в столбик.

    На следующем рисунке показано сложение двух двоичных чисел командой ADD:

    При сложении происходит перенос из 7-го разряда в 8-й, как раз на границе между байтами. Если мы будем складывать эти числа по частям командой ADD, то перенесённый бит потеряется и в результате мы получим ошибку. К счастью, перенос из старшего разряда всегда сохраняется в флаге CF. Чтобы прибавить этот перенесённый бит, достаточно применить команду ADC:

    //Сложение двух чисел с учетом переноса: FFFFFFAA + FFFF

    Система команд процессора

    3.3. Система команд процессора

    В общем случае система команд процессора включает в себя следующие четыре основные группы команд:

    • команды пересылки данных;
    • арифметические команды ;
    • логические команды ;
    • команды переходов .

    Команды пересылки данных не требуют выполнения никаких операций над операндами. Операнды просто пересылаются (точнее, копируются) из источника (Source) в приемник ( Destination ). Источником и приемником могут быть внутренние регистры процессора, ячейки памяти или устройства ввода/вывода. АЛУ в данном случае не используется.

    Арифметические команды выполняют операции сложения, вычитания, умножения, деления, увеличения на единицу (инкрементирования), уменьшения на единицу (декрементирования) и т.д. Этим командам требуется один или два входных операнда. Формируют команды один выходной операнд .

    Логические команды производят над операндами логические операции, например, логическое И, логическое ИЛИ , исключающее ИЛИ, очистку, инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим , требуется один или два входных операнда, и формируют они один выходной операнд .

    Наконец, команды переходов предназначены для изменения обычного порядка последовательного выполнения команд. С их помощью организуются переходы на подпрограммы и возвраты из них, всевозможные циклы, ветвления программ, пропуски фрагментов программ и т.д. Команды переходов всегда меняют содержимое счетчика команд. Переходы могут быть условными и безусловными. Именно эти команды позволяют строить сложные алгоритмы обработки информации.

    В соответствии с результатом каждой выполненной команды устанавливаются или очищаются биты регистра состояния процессора ( PSW ). Но надо помнить, что не все команды изменяют все имеющиеся в PSW флаги. Это определяется особенностями каждого конкретного процессора.

    У разных процессоров системы команд существенно различаются, но в основе своей они очень похожи. Количество команд у процессоров также различно. Например, у упоминавшегося уже процессора МС68000 всего 61 команда , а у процессора 8086 — 133 команды. У современных мощных процессоров количество команд достигает нескольких сотен. В то же время существуют процессоры с сокращенным набором команд (так называемые RISC-процессоры), в которых за счет максимального сокращения количества команд достигается увеличение эффективности и скорости их выполнения.

    Рассмотрим теперь особенности четырех выделенных групп команд процессора более подробно.

    3.3.1. Команды пересылки данных

    Команды пересылки данных занимают очень важное место в системе команд любого процессора. Они выполняют следующие важнейшие функции:

    • загрузка (запись) содержимого во внутренние регистры процессора;
    • сохранение в памяти содержимого внутренних регистров процессора;
    • копирование содержимого из одной области памяти в другую;
    • запись в устройства ввода/вывода и чтение из устройств ввода/вывода.

    В некоторых процессорах (например, Т-11) все эти функции выполняются одной единственной командой MOV (для байтовых пересылок — MOVB ) но с различными методами адресации операндов.

    В других процессорах помимо команды MOV имеется еще несколько команд для выполнения перечисленных функций. Например, для загрузки регистров могут использоваться команды загрузки, причем для разных регистров — разные команды (их обозначения обычно строятся с использованием слова LOAD — загрузка). Часто выделяются специальные команды для сохранения в стеке и для извлечения из стека ( PUSH — сохранить в стеке, POP — извлечь из стека). Эти команды выполняют пересылку с автоинкрементной и с автодекрементной адресацией (даже если эти режимы адресации не предусмотрены в процессоре в явном виде).

    Иногда в систему команд вводится специальная команда MOVS для строчной (или цепочечной) пересылки данных (например, в процессоре 8086). Эта команда пересылает не одно слово или байт, а заданное количество слов или байтов ( MOVSB ), то есть инициирует не один цикл обмена по магистрали, а несколько. При этом адрес памяти, с которым происходит взаимодействие, увеличивается на 1 или на 2 после каждого обращения или же уменьшается на 1 или на 2 после каждого обращения. То есть в неявном виде применяется автоинкрементная или автодекрементная адресация.

    В некоторых процессорах (например, в процессоре 8086) специально выделяются функции обмена с устройствами ввода/вывода. Команда IN используется для ввода (чтения) информации из устройства ввода/вывода, а команда OUT используется для вывода (записи) в устройство ввода/вывода. Обмен информацией в этом случае производится между регистром-аккумулятором и устройством ввода/вывода. В более продвинутых процессорах этого же семейства (начиная с процессора 80286) добавлены команды строчного (цепочечного) ввода (команда INS ) и строчного вывода (команда OUTS ). Эти команды позволяют пересылать целый массив (строку) данных из памяти в устройство ввода/вывода ( OUTS ) или из устройства ввода/вывода в память ( INS ). Адрес памяти после каждого обращения увеличивается или уменьшается (как и в случае с командой MOVS ).

    Также к командам пересылки данных относятся команды обмена информацией (их обозначение строится на основе слова Exchange ). Может быть предусмотрен обмен информацией между внутренними регистрами, между двумя половинами одного регистра ( SWAP ) или между регистром и ячейкой памяти.

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

    Арифметические команды рассматривают коды операндов как числовые двоичные или двоично-десятичные коды. Эти команды могут быть разделены на пять основных групп:

    • команды операций с фиксированной запятой (сложение, вычитание, умножение, деление);
    • команды операций с плавающей запятой (сложение, вычитание, умножение, деление);
    • команды очистки;
    • команды инкремента и декремента;
    • команда сравнения.

    Команды операций с фиксированной запятой работают с кодами в регистрах процессора или в памяти как с обычными двоичными кодами. Команда сложения ( ADD ) вычисляет сумму двух кодов. Команда вычитания ( SUB ) вычисляет разность двух кодов. Команда умножения ( MUL ) вычисляет произведение двух кодов (разрядность результата вдвое больше разрядности сомножителей). Команда деления ( DIV ) вычисляет частное от деления одного кода на другой. Причем все эти команды могут работать как с числами со знаком, так и с числами без знака.

    Команды операций с плавающей запятой (точкой) используют формат представления чисел с порядком и мантиссой (обычно эти числа занимают две последовательные ячейки памяти). В современных мощных процессорах набор команд с плавающей запятой не ограничивается только четырьмя арифметическими действиями, а содержит и множество других более сложных команд, например, вычисление тригонометрических функций, логарифмических функций, а также сложных функций, необходимых при обработке звука и изображения.

    Команды очистки ( CLR ) предназначены для записи нулевого кода в регистр или ячейку памяти. Эти команды могут быть заменены командами пересылки нулевого кода, но специальные команды очистки обычно выполняются быстрее, чем команды пересылки . Команды очистки иногда относят к группе логических команд , но суть их от этого не меняется.

    Команды инкремента (увеличения на единицу, INC ) и декремента (уменьшения на единицу, DEC ) также бывают очень удобны. Их можно в принципе заменить командами суммирования с единицей или вычитания единицы, но инкремент и декремент выполняются быстрее, чем суммирование и вычитание. Эти команды требуют одного входного операнда, который одновременно является и выходным операндом.

    Наконец, команда сравнения (обозначается CMP ) предназначена для сравнения двух входных операндов. По сути, она вычисляет разность этих двух операндов, но выходного операнда не формирует, а всего лишь изменяет биты в регистре состояния процессора ( PSW ) по результату этого вычитания. Следующая за командой сравнения команда (обычно это команда перехода ) будет анализировать биты в регистре состояния процессора и выполнять действия в зависимости от их значений (о командах перехода речь идет в разделе 3.3.4). В некоторых процессорах предусмотрены команды цепочечного сравнения двух последовательностей операндов, находящихся в памяти (например, в процессоре 8086 и совместимых с ним).