Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_лаб1_2_Полн.doc
Скачиваний:
9
Добавлен:
06.05.2019
Размер:
262.66 Кб
Скачать

2.2.3. Арифметические операции

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

Основными командами сложения и вычитания являются следующие:

ADD op1, op2 ;сложение

SUB op1, op2 ;вычитание

В этих командах допустимы следующие комбинации операндов (табл. 4).

Таблица 4

Допустимые комбинации операндов команд ADD и SUB

Операнд 1

Операнд 2

Регистр 8 бит

– Регистр 8 бит

– Константа или непосредственный операнд 8 бит

– Переменная или адрес памяти 8 бит

Переменная или адрес памяти 8 бит

– Регистр 8 бит

– Константа или непосредственный операнд 8 бит

Регистр 16 бит

– Регистр 16 бит

– Константа или непосредственный операнд 16 бит

– Переменная или адрес памяти 16 бит

Переменная или адрес памяти 16 бит

– Регистр 16 бит

– Константа или непосредственный операнд 16 бит

Команды ADD и SUB работают как с числами размером байт, так и с числами размером слово. При этом числа могут быть как знаковыми, так и беззнаковыми. В данных командах меняются флаги переноса CF, знака SF, переполнения OF, и нуля ZF (а также флаги AF и PF).

Существуют также отдельные команды для увеличения/уменьшения числа на единицу.

INC op ;увеличение на 1

DEC op ;уменьшение на 1

Умножение и деление

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

Для умножения используются следующие команды:

MUL op ;Умножение целых чисел без знака

IMUL op ;Умножение целых чисел со знаком

Оператор op, указываемый в команде, – это один из сомножителей; он находится в регистре или в памяти, но не может быть непосредственным операндом. Местонахождение другого сомножителя фиксировано и потому в команде не указывается явно: при умножении байтов он берется из регистра AL, а при умножении слов – из регистра AX.

Местонахождение результата также заранее известно и потому в команде явно не указывается. При этом под результат отводится в раза больше места, чем под сомножители. При умножении байтов результат имеет размер слова и записывается в регистр AX, а при умножении слов результат имеет размер двойного слова и записывается в два регистра – в регистр DX заносятся старшие цифры произведения, а в регистр AX – младшие цифры.

Примеры

N DB 10

MOV AL, 2

MUL N ; AX=2*10=20=0014h: AH=00h, AL=14h

MOV AL, 26

MUL N ; AX=26*10=260=0104h: AH=01h, AL=04h

MOV AX, 8

MOV BX, -1

IMUL BX ; (DX, AX)=-8=0FFFFFFFh: DX=0FFFFh, AX=0FFF8h

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

CF=OF=1 – если произведение занимает двойной формат

CF=OF=0 – если произведению достаточен формат сомножителей

Деление чисел без знака и со знаком также реализуется двумя командами:

DIV op ; Деление целых чисел без знака

IDIV op ; Деление целых чисел со знаком

В данном случае под операцией деления подразумевается т.н. «целочисленное деление», при котором получается не одна, а две величины – неполное частное (div) и остаток (mod). Обе этих величины помещаются на место делимого: его старшая часть заменяется на остаток, а младшая – на неполное частное. Оба этих числа имеют одинаковый размер, совпадающий с размером второго операнда (делителя).

При делении слова на байт делимое обязано находится в регистре AX, а делитель должен быть байтом. При делении двойного слова на слово делимое обязано находиться в двух регистрах – в DX (старшая часть делимого) и в AX (младшая часть), а делитель должен иметь размер слова.