Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Умножение двоичных чисел со знакомСодержание книги
Поиск на нашем сайте
– IMUL <операнд_1>[, операнд_2, операнд_3]; умножение чисел со знаком. Эта команда имеет три формы, различающиеся числом операндов: 1) IMUL <операнд_1>: операнд_1 (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX:AX или EDX:EAX соответственно. 2) IMUL <операнд_1>,<операнд_2>: операнд_2 (число, регистр или переменная) умножается на операнд_1 (регистр), и результат заносится в операнд_1. 3) IMUL <операнд_1>,<операнд_2>,<операнд_3>: операнд_2 (регистр или переменная) умножается на операнд_3 (число), и результат заносится в операнд_1 (регистр). Произведение имеет двойной размер В первом случае приемник (регистры АХ, DX:AX или EDX:EAX) всегда больше операнд_1. Если результат мал и умещается в одном регистре (то есть если cf=of=0), то содержимое другого регистра (старшей части) является расширением знака – все его биты равны старшему биту (знаковому разряду) младшей части результата. В противном случае (если cf=of=1) знаком результата является знаковый бит старшей части результата, а знаковый бит младшей части является значащим битом двоичного кода результата.
Пример: mul bl;al*bl, результат в Ах. Пример: mul bx;ax*bx, результат Dx:Ax.
Деление двоичных чисел без знака. Для деления чисел без знака предназначена команда: – DIV <делитель>; Команда выполняет целочисленное деление без знака АХ, DX:AX или EDX:ЕАХ (в зависимости от размера делителя) на делитель (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток — в АН, DX или EDX соответственно.
Расположение операндов и результата при делении
Пример: div bl;ax/bl, результат в Al,Ah. Пример: div bx; Dx:Ax/Bx, результат Ax,Dx. Источник может быть: 7. 8-бит регистр (al, ah, cl,...) 8. 16-бит регистр (ax, dx,...) 9. 32-бит регистр (eax, edx, ecx...) 10. 8-бит значение из памяти (byte ptr [xxxx]) 11. 16-бит значение из памяти (word ptr [xxxx]) 12. 32-бит значение памяти (dword ptr [xxxx]) Прерывание 0 – «деление на 0» – при выполнении команды div может возникнуть по одной из следующих причин: 3) делитель равен 0; 4) частное не входит в отведённую под него разрядную сетку, что может случиться в следующих случаях: – при делении слова на байт значение делимого в более чем 256 раз больше значения делителя; – при делении двойного слова на слово делимое в более чем 65536 раз больше значения делителя; – при делении учетверённое слова на двойное слово делимое в более чем 4 294 967 296 раз больше значения делителя. Пример: DIV BX; Dx:Ax/Bx, результат Ax,Dx. DIV MEM_BYTE; AX/MEM_byte, результат Al,Ah
Пример1: необходимо выполнить деление 514/2, D=2d=2h, C=514d=202h. .data C dw 514 D db 2 .code
mov bl,D div bl; Ax/Bl; 10 0000 0010/10; 2d*256d=512d<=514d
2*256=512<514
Пример2: необходимо выполнить деление 2 293 830/35, D=35d=23h, C=2293830d=0023 0046h. .data C dd 2 293 830; 00230046h D dw 35; 0023h .code
mov bx,D div bx; Dx:Ax/Bx=00230046h/0023h; 35d*65536d=2 293 760d<2 293 830d
35*65536=2 293 760<2 293 830
Деление двоичных чисел со знаком Для деления чисел со знаком предназначена команда: – IDIV <делитель>;
Команда выполняет целочисленное деление со знаком АХ, DX:AX или EDX:ЕАХ (в зависимости от размера делителя) на делитель (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток — в АН, DX или EDX соответственно.
Для этой команды верно всё то же, что и для команды DIV.
Лекция №4. Арифметические операции над двоично-десятичными числами ********************** В приложениях, в которых числа должны быть большими и точными необходимо использовать BCD –числа. Отдельных команд сложения, вычитания, умножения и деления BCD-чисел нет. Складывать и вычитать можно BCD-числа как в упакованном формате, так и в неупакованном, а вот делить и умножать можно только неупакованные BCD-числа. Неупакованные BCD-числа Пример1: Результат сложения не больше 9. 6+3 6=0000 0110 + 3=0000 0011 = 9=0000 1001 – результат правильный. Пример2: Результат сложения больше 9. 06=0000 0110 + 07=0000 0111 = 13=0000 1101 – результат неправильный. Правильный результат в неупакованном BCD-формате должен быть таким 0000 0001 0000 0011. В десятичном представлении это 13. Специальных команд для работы с BCD-числами нет, но есть корректировочные команды. Для коррекции операции сложения двух однозначных неупакованных BCD-чисел в системе команд микропроцессора существует специальная команда: ААА; ASCII-коррекция после сложения для представления в символьном виде. Команда работает с регистром AL и анализирует значение его младшей тетрады. Если это значение меньше 9, то флаг cf сбрасывается в 0, и осуществляется переход к следующей команде. Если это значение больше 9, то выполняются следующие действия: 3) к содержимому младшей тетрады al прибавляется 6, тем самым значение десятичного результата корректируется в правильную сторону; 4) флаг cf устанавливается в 1, тем самым фиксируется перенос в старший разряд для того, чтобы его можно было учесть в последующих действиях. Например при суммировании 06+07 в al находится 0000 1101. После команды ааа в регистре будет 1101+0110=0011, то есть двоичное 0000 00112 =310, а флаг cf установится в 1, то есть запомнится перенос в старший разряд. Далее необходимо использовать команду сложения adc, которая учтёт перенос из предыдущего разряда. Пример: сложим два неупакованных BCD-числа 71+54
Строки 14 и 15 складывают цифры в очередных разрядах BCD-чисел, при этом учитывается возможный перенос из младшего разряда. Команда ааа корректирует результат сложения, формируя в аl BCD-число и, при необходимости, устанавливая в 1 флаг cf. Строка 20 учитывает возможность переноса при сложении цифр из самых старших разрядов чисел. Результат сложения формируется в поле sum.
|
||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-09-13; просмотров: 386; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.81.228 (0.008 с.) |