Теоретические указания
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 Все права принадлежат авторам размещенных материалов.
|