Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички по ассемблеру / Методичка_часть1 Архитектура Вычислительных Систем-Новиков.doc
Скачиваний:
88
Добавлен:
02.05.2014
Размер:
1.31 Mб
Скачать

Краткие теоретические сведения.

  1. Команды умножения

  2. Команды деления

Команды умножения чисел без знака 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

Содержание отчета:

  1. Название работы

  2. Цель работы

  3. Приборы и оборудование

  4. Краткие теоретические сведения

  5. Индивидуальное задание

  6. Распечатанный текст программы

  7. Выводы.

Вопросы к защите лабораторной работы.

  1. Форматы арифметических данных.

  2. Формат и правила применения команд MUL и IMUL.

  3. Воздействие на флаги команд MUL и IMUL.

  4. Формат и правила применения команд DIV и IDIV.

  5. Воздействие на флаги команд DIV и IDIV.

  6. Правила применения команд AAO и AAM.

Лабораторная работа №5

«Изучение команд манипулирования битами»

Цель работы: изучить форматы и правила работы с командами манипулирования битами микропроцессора i8086.

Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной системы, совместимой с MS-DOS®.

Программное обеспечение: Программа DEBUG.