- •1. Лабораторная работа № 1
- •1.1. Общие методические указания по выполнению лабораторной работы
- •1.2. Теоретические сведения
- •1.2.1. Работа с данными на битовом уровне
- •1.2.2. Упакованные данные
- •1.2.3.Разработка менеджера памяти на основе битовой карты
- •1.3.Задание на лабораторную работу
- •1.4. Отчет по лабораторной работе
- •2. Лабораторная работа №2
- •2.1. Общие методические указания по выполнению лабораторной работы
- •2.2. Теоретические сведения
- •2.2.1. Определение данных
- •2.2.2. Команды пересылки
- •2.2.3. Арифметические операции
- •2.3. Примеры программ на ассемблере
- •2.4. Порядок выполнения работы
- •2.5. Задание на лабораторную работу
- •2.6. Отчет по лабораторной работе
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 (младшая часть), а делитель должен иметь размер слова.