Здавалка
Главная | Обратная связь

Теоретические указания



INC операнд - увеличить операнд в памяти или регистре на 1

Алгоритм работы: команда увеличивает операнд на единицу.

DEC операнд - уменьшение операнда в памяти или регистре на 1

Алгоритм работы: команда вычитает 1 из операнда.

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

Алгоритм работы:

- сложить операнды источник и приемник;

- записать результат сложения в приемник;

установить флаги.

ADC приемник, источник - сложение двух операндов с учетом переноса из младшего разряда.

Алгоритм работы:

- сложить два операнда;

- поместить результат в первый операнд: приемник=приемник + источник;

- в зависимости от результата установить флаги.

SUB операнд_1, операнд_2 - целочисленное вычитание.

Алгоритм работы:

выполнить вычитание операнд_1=операнд_2-операнд_1;

установить флаги.

Применение: команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.

SBB операнд-1, операнд_2 - целочисленное вычитание с учетом результата предыдущего вычитания командами sbb и sub (по состоянию флага переноса cf).

Алгоритм работы:

выполнить сложение операнд_2=операнд_2+(cf);

выполнить вычитание операнд_1=операнд_1-операнд_2;

Применение: команда sbb используется для выполнения вычитания старших частей значений многобайтных операндов с учетом возможного предыдущего заема при вычитании младших частей значений этих операндов.

IMUL множ_1 / IMUL множ_1, множ_2 / IMUL рез, множ_1, множ_2 - операция умножения двух целочисленных двоичных значений со знаком.

Алгоритм работы: работа команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

если операнд, указанный в команде, — байт, то второй сомножитель располагается в al;

если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax;

если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax.

Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:

- при умножении байтов результат помещается в ax;

- при умножении слов результат помещается в пару dx:ax;

- при умножении двойных слов результат помещается в пару edx:eax.

Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:

в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;

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

Команда imul устанавливает в ноль флаги of и cf, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения.

Применение: команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Для выполнения этой операции необходимо наличие двух сомножителей. Размещение и задание их местоположения в команде зависит от формы применяемой команды умножения, которая, в свою очередь, определяется моделью микропроцессора.

MUL множ_1 - операция умножения двух целых чисел без учета знака.

Алгоритм работы: команда выполняет умножение двух операндов без учета знаков.

Применение: команда mul выполняет целочисленное умножение операндов без учета их знаковых разрядов. Для этой операции необходимо наличие двух операндов-сомножителей, размещение одного из которых фиксировано, а другого задается операндом в команде. Контролировать размер результата удобно используя флаги cf и of.

IDIV делитель - операция деления двух двоичных значений со знаком.

Алгоритм работы: для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде:

- если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;

- если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;

- если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx;

Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов (старших разрядов) делимого и делителя.

Применение: команда выполняет целочисленное деление операндов с учетом их знаковых разрядов. Результатом деления являются частное и остаток от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

DIV делитель - выполнение операции деления двух двоичных беззнаковых значений.

Алгоритм работы: для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя.

AAA -ASCII-коррекция неупакованного результата сложения двух одноразрядных неупакованных BCD-чисел.

Алгоритм работы:

- проанализировать значение младшего полубайта регистра al и значение флага af;

- если (значение младшего полубайта регистра al >9) или (AF=1), то выполнить следующие действия: увеличить значение al на 6; очистить старший полубайт регистра al; увеличить значение ah на 1; установить флаги: af = 1, cf = 1, иначе сбросить флаги af = 0 и cf = 0.

DAA - Десятичная коррекция упакованного результата сложения двух BCD-чисел в упакованном формате.

Алгоритм работы: команда работает только с регистром al и анализирует наличие следующих ситуаций:

- Ситуация 1. В результате предыдущей команды сложения флаг af=1 или значение младшей тетрады регистра al>9. Напомним, что флаг af устанавливается в 1 в случае переноса двоичной единицы из бита 3 младшей тетрады в старшую тетраду регистра al (если значение превысило 0fh). Наличие одного из этих двух признаков говорит о том, что значение младшей тетрады превысило 9h.

- Ситуация 2. В результате предыдущей команды сложения флаг сf=1 или значение регистра al>9fh. Напомним, что флаг cf устанавливается в 1 в случае переноса двоичной единицы в старший бит операнда (если значение превысило 0ffh в случае регистра al). Наличие одного из этих двух признаков говорит о том, что значение в регистре al превысило 9fh.

Если имеет место одна из этих двух ситуаций, то регистр al корректируется следующим образом:

для ситуации 1 содержимое регистра al увеличивается на 6;

для ситуации 2 содержимое регистра al увеличивается на 60h;

если имеют место обе ситуации, то корректировка начинается с младшей тетрады.

AAS - ASCII-коррекция результата вычитания двух неупакованных одноразрядных BCD-чисел.

Алгоритм работы: если (младший полубайт регистра al меньше 9) или (флаг af=1), то выполнить следующие действия:

- уменьшить значение младшего полубайта регистра al на 6;

- обнулить значение старшего полубайта регистра al;

- установить флаги af и cf в 1; иначе установить флаги af и cf в 1.

DAS - Десятичная коррекция упакованного результата вычитания двух BCD-чисел в упакованном формате.

Алгоритм работы: команда das работает только с регистром al и анализирует наличие следующих ситуаций (см. команду DAA).

AAM - ASCII-коррекция после умножения

Назначение:

корректировка результата умножения двух неупакованных BCD-чисел;

преобразование двоичного числа меньшего 63h (9910) в его неупакованный BCD-эквивалент.

Алгоритм работы:

- разделить значение регистра al на 10;

- записать частное в регистр ah, остаток — в регистр al.

AAD - ASCII-коррекция перед делением

Назначение:

подготовкa двух неупакованных BCD-чисел для операции деления;

преобразование двузначного неупакованного ВCD-числа меньшего 63h (9910) в двоичное представление.

Алгоритм работы:

- умножить значение регистра ah на 10 и сложить полученное значение с содержимым регистра al: (ah*10)+al;

- присвоить регистру al значение (ah*10)+al;

- обнулить регистр ah.

Задания

Написать программу, выполняющую арифметические действия: сложение, умножение, вычитание и деление. Числа запрашиваются с клавиатуры. Осуществить вывод всех результатов на экран.

 

Вопросы для самоконтроля

1. Назовите операнд, служащий для увеличения операнда в памяти или регистре на 1.

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

3. Команда сложения двух операндов с учетом переноса из младшего разряда.

4. Алгоритм работы DEC операнда.

5. Алгоритм работы ADC источник, приемник.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.