Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Умножение двоичных чисел без знака ; ;




Для ум ни оженимя чисел без знака предназначена команда mul

сомножмтель_1

Как видите, В команде указан всего лишь один операнд-сомножитель. Второй операнд-сомнножшитель_2 задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Так как в общем случае результат умножения боль­ше, чем любой из его сомножителей, то его размер и местоположение должны быть тоже определены однозначно. Варианты размеров сомножителей и разме­щения второго операнда и результата приведены в табл. 8.2. Из таблицы видно, что Произведение состоит из двух частей и в зависимости от размера операндов размещается в двух местах — на месте сомножитель_2 (млад­шая часть) и в дополнительных регистрах ah, dx, edx (старшая часть). Как же ди­намически (то есть во время выполнения программы) узнать, что результат до­статочно мал и уместился в одном регистре, или что он превысил размерность

региоегнстра, и старшая масть оказалась в другом регистре? Для этого привлекаются уже известные нам по предыдущему обсуждению флаги переноса cf и перепол­нения of:

- О если старшая часть результата нулевая, то после операции произведения фла­ги cf = 0 и of= * 0;

- О если же эти флаги ненулевые, то это означает, что результат вышел за преде­лы младшей части произведения и состоит из двух частей, что и нужно учи­тывать при дальнейшей работе.

Таблица 8.2. Расположение операндов и результата при умножении

сомножитель_1 сомножитель_2 Результат
Байт al 16 бит в ах: al - младшая часть результата; ah —старшая часть результата
Слово ах 32 бит в паре dx:ax: ах -- младшая часть результата; dx -- старшая часть результата
Двойное слово eах 64 бит ь парс edx:eax: eax — младшая часть результата; edx — старшая часть результата

 

сомножитель_1 сомножитель_2 Результат

Байт al. 16 бит в ах: al - младшая часть результата; ah —

старшая часть результата

Слово ' ах, ' ',',;./; 32 бит в паре dx:ax: ах -- младшая часть резуль­
тата; dx -- старшая часть результата

Двойное слово сах '' ' ' 64 бит ь парс edx:cax: eax — младшая часть ре­
зультата; edx — старшая часть результата

Рассмотрим следующий пример программы (листинг 8.5). ' ",

'.,.,;..• '' : Листинг 8.5,;Умножение

<1>;prg_8Ji.asm '•, -^;',.•."':',...У "••';•. "•;•/ У '

<2> masm : "" •. !'' У \ '". 'У.'..'„".'..

<3> model small ''""','"' ": "' •...•' '•' "' '' •'',,.<'"'' ''У У У ' •

<4> stack 256 : '''••' ' •"/*' •";' ' ';""'''^'-:- ". ' ""' ' :'': >*'

<5>.data ;:'У.:' '••;Сегйёкт Данный;••••:• ;; •/•"' •••="

<6> rrez label word >-.. >'• '••'•• ' ' " •'• • •<'•''.•'' •''•'•''.• • ' •/

<7> rez_l db 45.,','.;,', /,У-. •;--; '.• \ '....- •-..•' '.• '

<&> rez_hji db 0, •'-.-,-'.•; '•...;...>•.;." •••,-'..'-г.'... •.

<9^.code -;•'•..•,.;саг,ией;Т KOftft ";:•••!•..';• •.>/'•-..-•'.

<10> main: • -;точкЭ' входа1 ^.ЬрограОД'.*-' •,- •'• ••

<П>... ' " "У:.

<12> хогr ах,ах -. '.

<13> mov al,.25 <..; j:,--:,,^S?v V;-^ !,-,?;•.-. *'••,:

*14> mul rez_1j

<15> jnc ml;если нет переполнения ^^дто, на m1.н!

<1б> mov rez_h,ah;старшую часть результата в rez_h

<^!> ml:

<18> mov rez_l,. al.;-.'.'••.

 

<19> exit:

•... •...
<20> mov ax,4cOO00h стандартный выход. (;м:.-.:

 

^^ int 21h.•" '. --';. -

 

<22> end main;конец программы

В этой программе в строке 14 производится умножение значения в rezj на чис­ло в регистре al. Согласно информации в табл. 8.2, результат умножения будет располагаться в регистре al (младшая часть) и в регистре ah (старшая часть), Для выяснения размера результата в строке 15 командой условного перехода jnc анализируется состояние флага cf, и если оно пне равно 1, то результат остается в рамках регистра al. Если же cf -= 1, то выполняется команда в строке 16, кото рая формирует в поле rez_h старшее слово результата. Команда в строке 18 фор. мирует младшую часть результата. ТВ еперь обратите внимание на сегменте дан­ных, а именно на строку 6, Б этой строке содержится директива label. Мы еще не раз будем сталкиваться с этой директивой. В данном случае она назначает еще одно символическое имя rez адресу, на который уже указывает другой иден­тификатор rez_l. Отличие заключается в типах этих идентификаторов — имя re*z имеет тип слова, который ему назначается директивой label (имя типа указано в качестве операнда label). Введя эту директиву в программе, мы подготовились к тому, что, возможно, результат операции умножения будет занимать слово в памяти. Обратите внимание, что мы не нарушили принципа: младший байт по младшему адресу. Далее, используя имя rez, можно обращаться к значению в этой области как к слову.

В заключение вам осталось исследовать в отладчике программу на разных набо­рах сомножителей.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных