- •1. Предварительные сведения
- •1.1 Что потребуется для работы с ассемблером
- •2. Процессоры Intel в реальном режиме
- •2.1 Регистры процессора
- •2.1.1 Регистры общего назначения
- •2.1.2. Сегментные регистры
- •2.1.3. Стек
- •2.1.4. Регистр флагов
- •2.2. Способы адресации
- •2.2.1. Регистровая адресация
- •2.2.2. Непосредственная адресация
- •2.2.3. Прямая адресация
- •2.2.4. Косвенная адресация
- •2.2.5. Адресация по базе со сдвигом
- •2.2.6. Косвенная адресация с масштабированием
- •2.2.7. Адресация по базе с индексированием
- •2.2.8. Адресация по базе с индексированием и масштабированием
- •2.3 Основные непривилегированные команды
- •2.3.1. Пересылка данных
- •2.3.2. Двоичная арифметика
- •2.3.3. Десятичная арифметика
- •2.3.4. Логические операции
- •2.3.5. Сдвиговые операции
- •2.3.6. Операции над битами и байтами
- •2.3.7. Команды передачи управления
- •2.3.8. Строковые операции
- •2.3.9. Управление флагами
- •2.3.10. Загрузка сегментных регистров
- •2.3.11. Другие команды
- •2.4. Числа с плавающей запятой
- •2.5. Расширение iа ммх
- •3.1 Программа debug
- •Индивидуальное задание.
- •Краткие теоретические сведения.
- •Индивидуальное задание.
- •Краткие теоретические сведения.
- •Краткие теоретические сведения.
Краткие теоретические сведения.
Команды умножения
Команды деления
Команды умножения чисел без знака MUL и целого умножения чисел со знаком IMUL.
Если Вам когда-либо приходилось терпеть муки составления программы умножения для микропроцессоров Z80, 6502 или для каких-либо других распространенных 8-битовых микропроцессоров, то Вы будете рады узнать, что микропроцессор 8x86 имеет встроенные команды умножения. Команда MUL (multiply – умножить) умножает числа без знака, a IMUL (integer multiply – умножить целые числа) – числа со знаком. Обе команды могут умножать как байты, так и слова.
Эти команды имеют формат:
MUL источник
IMUL источник
где источник - регистр общего назначения или ячейка памяти размером в байт или слово. В качестве второго операнда команды MUL и IMUL используют содержимое регистра AL (при операциях над байтами) или регистра АХ (при операциях над словами). Произведение имеет двойной размер и возвращается следующим образом:
Умножение байтов возвращает 16-битовое произведение в регистрах АН (старший байт) и AL (младший байт).
Умножение слов возвращает 32-битовое произведение в регистрах DX (старшее слово) и АХ (младшее слово).
По завершении исполнения этих команд флаги переноса CF и переполнения OF показывают, какая часть произведения существенна для последующих операций. После исполнения команды MUL флаги CF и OF равны 0, если старшая половина произведения равна 0; в противном случае оба этих флага равны 1. После исполнения команды IMUL флаги CF и OF равны 0, если старшая половина произведения представляет собой лишь расширение знака младшей половины. В противном случае они равны 1.
Приведем несколько примеров умножения:
MUL ВХ ;Умножить ВХ на АХ без знака
MUL MEM_BYTE. ;Умножить содержимое ячейки памяти на AL без знака
IMUL DL ;Умножить DL на AL со знаком
IMUL MEM WORD ;Умножить содержимое ячейки памяти на АХ со знакам
Команды MUL и IMUL не ^позволяют в качестве операнда использовать непосредственное значение. Такое значение-перед умножением надо. загрузить в регистр или в ячейку памяти. Например, в результате исполнения команд
MOV DX,10
MUL DX
содержимое регистра АХ будет умножено на 10.
Коррекция результатов умножения для представления в кодах ASCII (команда AAM)
Команда ААМ (ASCII adjust for multiplication - скорректировать умножение для представления в кодах ASCII) преобразует результат предшествующего умножения байтов в два правильных неупакованных десятичных операнда. Она считает, что произведение двойного размера находится в регистрах АН и AL, и возвращает неупакованные операнды в регистрах АН и AL. Чтобы команда ААМ работала правильно, исходные множимое и множитель должны быть правильными неупакованными байтами.
Для выполнения преобразования команда ААМ делит значение регистра AL на 10 и запоминает частное и остаток в регистрах АН и AL соответственно. Кроме того, она модифицирует флаг четности. PF, флаг нуля ZF и флаг знака SF в зависимости от полученного значения регистра AL. Состояние флага переноса CF, вспомогательного флага AF и флага переполнения становятся неопределенными.
Рассмотрим действие команды 'ААМ на примере. Пусть регистр AL содержит 9 (0000 1001В), а регистр BL — 7 (0000 0111В). Команда
MUL BL
умножит значение регистра AL на значение регистра BL и возвратит 16-битовый результат в регистрах АН и AL. В нашем случае она возвратит 0 в регистре АН и 00111111В (десятичное 63) в регистре AL. Следующая за ней команда
AAM
поделит значение регистра AL на 10 и возвратит частное 0000 0110В в регистре АН, а остаток 0000 0011В в регистре AL. Тем самым мы получаем правильный результат: BCD-число 63 в неупакованном формате. У микропроцессора 8x86 нет команды умножения упакованных десятичных чисел. Для выполнения этой операции сначала распакуйте эти числа, перемножьте их и воспользуйтесь командой ААМ, а затем упакуйте результат.
Команда деления числа без знака DIV и деления числа со знаком IDIV
Имея две отдельные команды умножения, микропроцессор 8x86 имеет и две отдельные команды деления. Команда DIV (divide - разделить) выполняет деление чисел без знака, а команда IDIV (integer divide - разделить целые числа) выполняет деление чисел со знаком. Эти команды имеют формат
DIV источник
IDIV источник
где источник - делитель размером в байт или слово, находящийся в регистре общего назначения или в ячейке памяти. Делимое должно иметь двойной размер; оно извлекается из регистров АН и AL (при делении на 8-битовое число) или из регистров DX и АХ (при делении на 16-битовое число). Результаты возвращаются следующим образом:
Если операнд-источник представляет собой байт, то частное возвращается в регистре AL, а остаток в регистре АН.
Если операнд-источник представляет собой слово, то частное возвращается в регистре АХ, а остаток - в регистре DX.
Обе команды оставляют состояние флагов неопределенными, но если частное не помещается в регистре-приемнике (AL или АХ), то микропроцессор 8x86 сообщает Вам об этом весьма драматическим образом: он генерирует прерывание типа 0 (деление на 0).
Переполнение результата деления возникает при следующих условиях:
1. Делитель равен 0.
2. При делении байтов без знака делимое по меньшей мере в 256 раз превышает делитель.
3. При делении слов без знака делимое по меньшей мере в 65 536 раз превышает делитель.
4. При делении байтов со знаком частное лежит вне диапазона от -128 до +127.
5. При делении слов со знаком частное лежит вне диапазона от -32768 до 32767. Приведем несколько типичных примеров операций деления:
DIV BX ;Разделить DX:AX на ВХ , без знака
DIV MEM_BYTE ;Разделить AH:AL на байт памяти, без знака
IDIV DL ;Разделить АН:AL на DL со знаком
IDIV MEM_WORD ;Разделить DX:AX на слово памяти, со знаком
Команды DIV и IDIV не позволяют прямо разделить на непосредственное значение; его надо предварительно загрузить в регистр или ячейку памяти. Например, команды
MOV ВХ,20
DIV ВХ
разделят объединенное содержимое регистров DX и АХ на 20.
Команда коррекции деления для представления в кодах ASCII (команда AAO )
Все ранее описанные команды десятичной коррекции (ААА, DAA, AAS, DAS и ААМ) выполняли действия над результатом операции. В противоположность им команда AAD (ASCII adjust for division - скорректировать деление для представления в кодах ASCII) должна исполняться непосредственно перед операцией деления.
Команда ADD преобразует неупакованное делимое в двоичное значение и загружает его в регистр AL. Для этого она умножает старшую цифру делимого (содержимое регистра АН) на 10 и добавляет полученный результат к младшей цифре, находящейся в регистре AL. Затем она обнуляет содержимое регистра АН.
Приведем типичный пример применения команды AAD:
AAD ; Скорректировать неупакованное делимое в АН:АL,
DIV BL ; а затем выполнить деление
Индивидуальное задание.
Каждому студенту выдается 4-х значный вариант. Согласно этого варианта вычислить следующее выражение:
F = (КОН1 оп1 КОН2) оп2 Х оп3 (Y оп4 КОН3)
где
КОН1, КОН2, КОН3 – числовые константы, согласно табл. 1
оп1, оп2, оп3, оп4 – операции сложения, вычитания, умножения и деления согласно табл. 2
X, Y – переменные, тип которых определяется согласно табл. 3
Числовые константы из табл. 1 берутся согласно первой цифре варианта, операции сложения и вычитания из табл. 2 – согласно второй цифре варианта, а размер и тип переменных – из табл. 3 согласно третьей цифре варианта.
Ввод значений переменных с клавиатуры производится на языке Си, вычисление выражения производится на Ассемблере, вывод результат — на языке Си.
Таблица 1.
|
Первая цифра варианта | |||||||||
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
КОН1 |
12 |
12569 |
8735 |
12 |
78 |
4596 |
12563 |
4589 |
369 |
458 |
КОН2
|
1369 |
12 |
588 |
96385 |
47 |
589 |
78 |
29 |
3856 |
481 |
КОН3 |
3699 |
4589 |
12 |
3698 |
4862 |
2385 |
2852 |
5625 |
336 |
36 |
Таблица 2.
|
Вторая цифра варианта | |||||||||
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
оп1
|
/ |
* |
—
|
+ |
* |
+ |
— |
— |
/ |
— |
оп2
|
* |
/ |
*
|
/ |
— |
+ |
/ |
* |
+ |
+ |
оп3
|
+ |
+ |
/
|
* |
+ |
* |
+ |
/ |
— |
/ |
оп4
|
— |
+ |
—
|
— |
/ |
/ |
* |
+ |
* |
* |
Таблица 3.
|
Третья цифра варианта | |||||||||
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
X
|
char |
un char |
int |
un int |
int
|
un char |
int |
char |
char
|
un int |
Y
|
int |
un int |
char |
un char |
int
|
un int |
int |
int |
char
|
un char |
Примечания: – char – 8 битн. со знаком
– un. char – 8 битн. без знака
– int – 16 битн. со знаком
– un. int – 16 битн. без знака
Пример. У студента индивидуальный вариант 990. Строим индивидуальное выражение для вычисления:
F=(458 – 481) + X / (Y * 36)
Согласно варианту переменные X, Y и Z должны быть описаны следующим образом
char x;
int y;
Ассемблерный фрагмент выглядит следующим образом:
mov bx, 458h // Пересылаем константу в регистр AX
sub bx, 481h // Вычитаем константу
mov ax,y
mov cx,36h
imul cx // Пренебрегаем старшей частью 32-б рез-та
mov cx,ax
mov al,x
cbw // Расширяем число X до 16 бит
cwd // расширяем x до 32 бит
idiv cx // результат в ax
add bx,ax
mov f,cx
Содержание отчета:
Название работы
Цель работы
Приборы и оборудование
Краткие теоретические сведения
Индивидуальное задание
Распечатанный текст программы
Выводы.
Вопросы к защите лабораторной работы.
Форматы арифметических данных.
Формат и правила применения команд MUL и IMUL.
Воздействие на флаги команд MUL и IMUL.
Формат и правила применения команд DIV и IDIV.
Воздействие на флаги команд DIV и IDIV.
Правила применения команд AAO и AAM.
Лабораторная работа №5
«Изучение команд манипулирования битами»
Цель работы: изучить форматы и правила работы с командами манипулирования битами микропроцессора i8086.
Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной системы, совместимой с MS-DOS®.
Программное обеспечение: Программа DEBUG.