команда mul

команда mul

Як вивчити англійську

У наш час будь-яка людина має знати англійську мову. А тим більше програміст. Тому що досить велика частина документації існує тільки англійською. А професіонал не може чекати, поки хтось переведе йому документацію. Він повинен вміти швидко отримувати потрібну інфорамцію і використовувати її, незалежно від того, на якому вона мовою - англійською або російською. Посилання на курси з англійської.

Інструкція MUL в Асемблері виконує множення без знака. Зрозуміти роботу команди MUL дещо складніше, ніж це було для команд. розглянутих раніше. Але, сподіваюся, що я допоможу вам у цьому розібратися.

Отже, синтаксис команди MUL такий:

Виглядає все дуже просто. Однак ця простота оманлива.

Перш ніж розібратися в подробицях роботи цієї інструкції, давайте подивимося, що може бути ЧИСЛОМ.

ЧИСЛОМ може бути один з наступних:

  • Область пам'яті (MEM)
  • Регістр загального призначення (REG)

Ця команда не працює з сегментними регістрами, а також не працює безпосередньо з числами. Тобто ось так

MUL 200; неправильно

А тепер алгоритм роботи команди MUL:

  • Якщо ЧИСЛО - це БАЙТ, то AX = AL * ЧИСЛО
  • Якщо ЧИСЛО - це СЛОВО, то (DX AX) = AX * ЧИСЛО

Ось така трохи важкувато команда. Хоча складно це з незвички. Зараз ми розберемо все "по кісточках" і все стане ясно.

Для початку зверніть увагу, що інструкція MUL працює або з регістром АХ, або з регістром AL. Тобто перед виконанням цієї команди нам треба записати в регістр АХ або в регістр AL значення, яке буде брати участь в множенні. Зробити це можна, наприклад, за допомогою вже відомої нам команди MOV.

Потім ми виконуємо множення, і отримуємо результат або в регістр АХ (якщо ЧИСЛО - це байт), або в пару регістрів DX і AX (якщо ЧИСЛО - це слово). Причому в останньому випадку в регістрі DX буде старше слово, а в регістрі AX - молодше.

А тепер, щоб зовсім все стало зрозуміло, розберемо кілька прикладів - з байтом і словом.

Приклад множення в Асемблері

Отже, наприклад, нам треба помножити 150 на 250. Тоді ми робимо так:

Зверніть увагу, що нам доводиться два рази використовувати команду MOV, так як команда MUL не працює безпосередньо з числами, а тільки з регістрами загального призначення або з пам'яттю.

Після виконання цього коду в регістрі АХ буде результат множення чисел 150 і 250, тобто число 37500 (927С в шістнадцятковій системі).

Тепер спробуємо помножити 10000 на 5000.

В результаті ми отримали досить велике число, яке, звичайно, не поміститься в слово. Тому для результату використовуються два регістри - DX і AX. У нашому прикладі в регістрі DX, буде число 762 (02FA - в шістнадцятковій системі), а в регістрі АХ - число 61568 (F080 - в шістнадцятковій системі). А якщо розглядати їх як одне число (подвійне слово), де в старшому слові 762, а в молодшому - 61568, то це і буде 50000000 (2FAF080 - в шістнадцятковій системі).

Якщо не вірите - може перевести все це в двійкове число і перевірити.

Після виконання команди MUL стану прапорів ZF, SF, PF, AF не визначені і можуть бути будь-якими.

А якщо старша секція результату (реєстр AH при множенні байтів або регістр DX при множенні слів) дорівнює нулю, то

Інакше ці прапори або не рівні, або рівні 1.

В кінці як завжди розповім, чому ця команда асемблера називається MUL. Це скорочення від англійського слова MUL TIPLY, яке можна перевести як "помножити, множити".

Схожі статті