Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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
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
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; просмотров: 493; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.169 (0.01 с.) |