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