Вычитание беззнаковых величин

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

Задание. Проверим результат, полученный при выполнении сложения. Вычтем из числа CD1h одно из ранее использованных слагаемых (для определенности 92Ah). Каков результат операции?

Если в выражении вычитаемое больше уменьшаемого, результат вычитания беззнаковых (неотрицательных) величин становится отрицательным.

Задание. Проверим, как микропроцессор использует форму двоичного дополнения для представления отрицательных результатов. Выполните вычитание из нуля единицы (т.е., 0 – 1). Какой результат получен и почему?

Существует еще одна пара команд увеличения и уменьшения на 1 – Inc (increment) и Dec (decrement).Команда INC аналогична команде:

ADD ор,1

т.е. увеличивает свой операнд на 1: op1:=ор1+1, а команда DEC аналогична команде:

SUB op,1

т.е. уменьшает операнд на 1: op1:=op1-1(единственное отличие: команды INC и DEC не меняют флаг переноса CF).Например, если регистр BX содержал число 0001, то после выполнения команды Inc BX регистр будет содержать 0002. Выгода от команд INC и DEC в том, что они занимают меньше места в памяти и выполняются быстрее, чем соответствующие команды ADD и SUB.

Операции с байтами

В микропроцессорах Intel используются двухбайтовые машинные слова. Каждый регистр общего назначения (AX, BX, CX и DX) может хранить одно машинное слово. Однако имеется возможность оперировать с отдельными байтами этих регистров. В этом случае каждый регистр рассматривается состоящим из старшего (High) и младшего (Low) байтов. Обозначения отдельных байтов из регистров состоят из двух букв. Первая задает имя регистра (A, B, C или D), а вторая указывает, какой это байт регистра. Для обозначения старшего байта используется буква H, а младшего — L. Таким образом, регистр AX можно рассматривать, состоящим из двух однобайтовых регистров AH и AL.

Микропроцессор может выполнять арифметические операции над отдельными байтами.

Задание.

Введите в регистр AX число 0102h (два байта) и выполните инструкцию

ADD AH, AL

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

Умножение беззнаковых величин

Умножение двух 16-битных чисел может дать 32-разрядный результат, поэтому инструкция умножения MUL (multiply — умножить) размещает результат в двух регистрах DX и AX. Старшие 16 бит помещаются в регистр DX, а младшие в AX.

Замечание.

При выполнении операции умножения одним из множителей всегда является значение из регистра AX.

Задание.

Выполните умножение чисел 7C4Bh (в регистр AX) и 100h (BX).

Каков результат операции и почему?

Деление беззнаковых величин

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

Делимое всегда помещается в пару регистров AX, DX, поэтому в инструкции деления DIV (divide — делить) необходимо указать только регистр с делителем. После выполнения деления регистр AX будет содержать частное, а регистр DX — остаток.

Задание.

Выполните деление числа 7C4B12h (DX=007Ch, AX=4B12h) на 0100h (BX).

Каков результат выполнения операции и почему?

Пересылка (копирование) данных

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

Задание.

С помощью команды MOV поместите числа 1234h и ABCDh, соответственно, в регистры AX и DX. Соответствующие инструкции поместите по адресам 0100h и 0102h.

Далее с помощью команды MOV поместите содержимое младшего байта регистра DX в старший байт регистра AX.

Понятие переполнения

Как и в случае умножения, при выполнении сложения результат может выходить за 16-разрядную сетку (четыре шестнадцатеричных числа). Например, результатом сложения четырехзначных чисел FFFFh и 1h будет пятизначное число 10000h, для записи которого слова (двух байт) недостаточно.

Если результат выполнения операции (над беззнаковыми величинами!) не может быть полностью размещен в регистре, то говорят о возникновении переполнения.

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

Задание.

Выполните сложение чисел FFFFh (AX) и 1h (BX). Каков результат операции?

Регистр флагов.

Флаг - это бит, принимающий значение 1 ("флаг установлен"), если выполнено некоторое условие, и значение 0 ("флаг сброшен") в противном случае. В ПК используется 9 флагов, причем конструктивно они собраны в один 16-разрядный регистр, называемый регистром флагов и обозначаемый как Flags. Эти биты обозначаются буквами C, P, A, Z, S, T, I, D, O. Например, в текстовый редактор загружен текст. Как только вы внесли в текст первое изменение, можно установить в 1 флаг изменений. После сохранения текста значение флага сбрасывается (0). Тогда при выходе из редактора легко проверить, сохранены ли изменения.

Флаг переноса

Если при сложении беззнаковых чисел происходит переполнение (возникает единица переноса за пределы разрядной сетки регистра), то единичка переноса записывается в Carry Flag. В правой половине окна регистров и флагов (Registers) данный флаг обозначается буквой С. Флаг переноса переустанавливается в каждой операции сложения.

Задание.

Проследите за изменением состояния флага переноса при последовательном выполнении следующих операций

1. FFFF + 1

2. FF00 + 1

Наши рекомендации