Лек2Арифметичні команди. Формат, типи даних, особливості використання


Тема: Арифметичні команди. Формат, типи даних, особливості використання.
мета: Ознайомити студентів з основними арифметичними командами і особливостями їх використання.
План.
Команди простого і циклічного зрушень.
1.1. Логічні і арифметичні зрушення.
1.2. Команда SHL.
1.3. Команда SHR.
1.4. Команди SAL і SAR.
1.5. Команда ROL.
1.6. Команда ROR.
1.7. Команди SHLD і SHRD.
Команда MUL.
Команда IMUL.
Команда DIV.
Розподіл цілих чисел зі знаком.
5.1. Команди CBW, CWD, CDQ.
5.2. Команда IDIV.
5.3. Переповнення при діленні.
Реалізація арифметичних виразів.
Хід лекції.
Команди простого і циклічного зрушень.
Однією з відмінних рис мови асемблера є підтримка засобів роботи з окремими бітами, включаючи побітові логічні команди і команди зсуву. Операція зсуву означає переміщення всіх бітів операнда вправо або вліво на одну або кілька позицій. У табл. 1 перераховані всі команди зсуву; при їх виконанні змінюється стан прапорів переповнення OF і перенесення СF.
Таблиця 1. Команди зсуву.

1.1. Логічні і арифметичні зрушення.
Операція зсуву бітів цілого числа може виконуватися двома способами. Перший називається логічним зрушенням, при якому "висунута" позиція бітового розряду заповнюється нулем. На рис. 1 продемонстрована операція логічного зсуву байта на один розряд вправо. Зверніть увагу, що в результаті біту 7 присвоєно нульове значення.

1
Малюнок 1. Ілюстрація операції логічного зсуву байта вправо на один розряд.
Наприклад, при виконанні логічного зсуву вправо на один розряд байта, значення якого дорівнює 11001111, отримаємо число 01100111.
Другий тип зсуву називається арифметичним. Під час його виконання "висунута" позиція бітового розряду заповнюється початковим значенням знакового розряду, як показано на рис. 2.

Малюнок 2. Ілюстрація операції арифметичного зсуву байта вправо на один розряд.
Наприклад, байт, значення якого дорівнює 11001111, має одиницю в знаковому розряді. При виконанні арифметичного зсуву його вправо на один розряд отримаємо число 11100111.
1.2. Команда SHL.
Команда SHL (SHift Left) виконує логічний зсув вліво операнда одержувача даних на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому молодші "висунуті" розряди заповнюються нулями. Старший розряд числа збожеволіє у прапор переносу CF, а біт, який до цього перебував у прапорі перенесення, втрачається (рис. 3).

Малюнок 3. Ілюстрація операції логічного зсуву байта вліво на один розряд (Команда SHL).
Перший операнд команди SHL визначає зсувається число, а другий-кількість розрядів, на які проводиться зрушення:
SHL операнд, лічильник
формати операндів команди SHL:
SHLreg, imm8
SHLmem, imm8
SHLreg, CL
SHLmem, CL
На місці imm8 можна вказувати будь-який 8-розрядний ціле число. Останні два формати операндів команд зсуву, в яких лічильник зсуваються розрядів вказується в регістрі CL, працюють на будь-яких моделях процесорів фірми Intel (як старих, так і нових). Наведені вище формати операндів справедливі також і для інших команд зсуву, таких як SHR, SAL, SAR, ROR, ROL, RCR
RCL.
Приклад. У наведеному нижче фрагменті коду вміст регістра BL зсувається вліво на один розряд. При цьому старший біт поміщається у прапор CF, а наймолодший біт обнуляється:

Швидке множення. Найчастіше команда SHL використовується для виконання швидкого множення деякого числа на число, кратне 2n. Справді, зрушення двійкового числа вліво на п розрядів означає його множення на 2n. Наприклад, в результаті зсуву числа 5 на один розряд вліво виходить число 10, тобто твір 5x2 (рис. 4):

2
Малюнок 4. Ілюстрація швидкого виконання операції множення.
Якщо ми зрушимо число 10 вліво на 2-й розряд, то отримаємо число 40, тобто твір 10х22:

1.3. Команда SHR.
Команда SHR (SHift Right) виконує логічний зрушення вправо операнда одержувача даних на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому старші "висунуті" розряди заповнюються нулями. Молодший розряд числа поміщається у прапор переносу CF, а біт, який до цього перебував у прапорі перенесення, втрачається (рис. 5).

Малюнок 5. Ілюстрація операції логічного зсуву байта вправо на один розряд (Команда SHR).
У команді SHR використовуються такі ж формати операндів, як і в команді SHL. У наведеному нижче фрагменті коду значення молодшого біта регістра AL, рівне нулю, поміщається у прапор переносу CF, а старший біт регістра AL обнуляється:

Швидке поділ. Як ви вже знаєте, зрушення двійкового числа вліво на n розрядів призводить до його множенню на 2n. Отже, зрушення числа вправо на n розрядів повинен призводити до його поділу на 2n. Наприклад, в результаті зсуву вправо числа 32 на один розряд (тобто на 21) Виходить число 16 (рис.
.6):

Малюнок 6. Ілюстрація швидкого виконання операції ділення.
У наступному прикладі число 64 ділиться на 8 (тобто 23):

(Розподіл чисел зі знаком шляхом зсуву вправо виконується командою SAR, оскільки вона зберігає значення знакового розряду).
1.4. Команди SAL і SAR.
Команда SAL (Shift Arithmetic Left, або арифметичний зрушення вліво) повністю еквівалента команді SHL, оскільки при зсуві вліво значення знакового розряду не зберігається. Команда SAR (Shift Arithmetic Right) виконує арифметичний зрушення вправо операнда одержувача даних на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому старші "висунуті" розряди заповнюються колишнім значенням знакового розряду. Молодший розряд числа поміщається у прапор переносу CF, а біт, який до цього перебував у прапорі перенесення, втрачається (рис. 7).

Малюнок 7. Ілюстрація операції математичного зсуву байта вправо на один розряд (Команда SАR).
3
командах SAL і SAR використовуються такі ж формати операндів, як і в командах SHL і SHR. Перший операнд визначає зсувається число, а другий - кількість розрядів, на які проводиться зрушення:
Наступний приклад показує, як в результаті арифметичного зсуву регістра AL вправо на один розряд виконується дублювання знакового біта. Тому до і після виконання операції зсуву в регістрі AL залишається негативне число:

Швидке поділ чисел зі знаком. Команда SAR використовується для виконання швидкої операції ділення деякого числа на число, кратне 2n. У наведеному нижче прикладі число-128 ділиться на 8 (тобто 23). Приватне одно-16:

1.5. Команда ROL.
Команда ROL (ROtate Left) циклічно зсуває кожен біт операнда одержувача даних вліво на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому старший біт числа копіюється в молодший біт, а також у прапор переносу CF (рис. 8). У команді ROL використовуються такі ж формати операндів, як і в команді SHL.

Малюнок 8. Ілюстрація операції циклічного зсуву байта вліво на один розряд (Команда ROL).
Циклічний зсув відрізняється від простого зсуву тим, що в результаті його виконання значення бітів числа не втрачаються, а просто переміщаються по колу: старший біт поміщається на місце молодшого, молодший - на місце біта 1, потім біт 1 - на місце біта 2 і т. д. У наведеному нижче прикладі значення старшого біта копіюється в молодший біт і під прапор переносу CF:

Команду ROL можна використовувати для обміну старшого (біти 4-7) і молодшого (біти 0-3)
напівбайтів числа. Наприклад, в результаті циклічного зсуву вліво числа 26h отримаємо число 62h:

1.6. Команда ROR.
Команда ROR (ROtate Right) циклічно зсуває кожен біт операнда одержувача даних вправо на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому молодший біт числа копіюється в старший біт, а також у прапор переносу CF (рис. 9). У команді ROR використовуються такі ж формати операндів, як і в команді SHR.

Малюнок 9. Ілюстрація операції циклічного зсуву байта вправо на один розряд (Команда ROR).
4
наведеному нижче прикладі значення молодшого біта числа копіюється в старший біт і під прапор переносу CF.

1.7. Команди RCL і RCR.
Команда RCL (Rotate Carry Left) циклічно зсуває через прапор перенесення кожен біт операнда одержувача даних вліво на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому значення прапора перенесення CF поміщається на місце наймолодшого біта, а найстарший (знаковий) біт числа поміщається у прапор переносу CF (рис. 10).

Малюнок 10. Ілюстрація операції циклічного зсуву байта вліво через прапор перенесення на один розряд (Команда RCL).
Якщо вважати прапор перенесення СF додатковим розрядом числа, розташованим перед знаковим розрядом, то тоді команда RCL нічим не відрізняється від команди циклічного зсуву вліво ROL, за винятком того, що вона виконується над 9-розрядних операндом.
наведеному нижче прикладі команда CLC скидає значення прапора перенесення CF. За допомогою першої команди RCL старший біт регістра BL копіюється в прапор переносу CF, після чого всі біти цього регістра циклічно зсуваються вліво на один розряд. Друга команда RCL переміщує прапор CF
молодший розряд регістра BL і циклічно зсуває всі біти цього регістра на один розряд вліво:

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

Команда RCR. Команда RCR (Rotate Carry Right) циклічно зсуває через прапор перенесення кожен біт операнда одержувача даних вправо на кількість розрядів, зазначених у вихідному (тобто другому) операнде. При цьому значення прапора перенесення CF поміщається на місце найстаршого (тобто знакового) біта, а наймолодший біт числа поміщається у прапор переносу CF (рис. 11).

Малюнок 11. Ілюстрація операції циклічного зсуву байта вправо через прапор перенесення на один розряд (Команда RCL).
Як і у випадку з командою RCL, ми представили операнд у вигляді 9-розрядної довічного цілого числа, в якому прапор переносу CF розташовується правіше наймолодшого розряду.
наведеному нижче прикладі спочатку за допомогою команди STC встановлюється прапор переносу CF. Потім за допомогою команди RCR він поміщається в самий старший біт регістра АН, а значення його молодшого біта переноситься у прапор СF:
5

1.8. Команди SHLD і SHRD.
Команди SHLD і SHRD з'явилися тільки в процесорі Intel386. На відміну від розглянутих вище команд зсуву, у цих команд не два, а три операнда. Команда SHLD (SHift Left Double, або зсув вліво подвоєний) виконує логічний зсув вліво операнда одержувача даних на кількість розрядів, зазначених в третьому операнде. Вивільнені в результаті зсуву розряди операнда одержувача даних заповнюються старшими бітами вихідного (тобто другого) операнда. При цьому значення вихідного операнда не змінюється, але змінюється стан прапорів знака SF, нуля ZF, службового перенесення AF, парності PF і перенесення CF. Синтаксис команди SHLD наступний:
SHLD одержувач, джерело, лічильник
Команда SHRD (SHift Right Double, або зсув вправо подвоєний) виконує логічний зрушення вправо операнда одержувача даних на кількість розрядів, зазначених в третьому операнде. Вивільнені в результаті зсуву розряди операнда одержувача даних заповнюються молодшими бітами вихідного (тобто другого) операнда. Синтаксис команди SHLD наступний:
SHRD одержувач, джерело, лічильник
Команди SHLD і SHRD мають однаковий формат операндів, описаний нижче. Операнд-одержувач даних може розташовуватися або в пам'яті, або в регістрі. Вихідний операнд може перебувати тільки в регістрі. В якості лічильника може бути заданий або регістр CL, або 8-розрядна константа:

Приклад 1. У наведеному нижче фрагменті коду 16-розрядної змінна wval зсувається на 4 біта вліво. Вивільнені молодші чотири розряду змінної wval заповнюються чотирма старшими розрядами регістра АХ (рис. 12):

Малюнок 12. Схема виконання подвоєного зсуву вліво.
Приклад 2. У наведеному нижче фрагменті коду 16-розрядний регістр АХ зсувається на 4 біта вправо. Вивільнені старші чотири розряду регістра АХ заповнюються чотирма молодшими розрядами регістра DX (рис. 13):

Малюнок 13. Схема виконання подвоєного зсуву вправо.
6
Команди SHLD і SHRD часто використовуються для виконання різних операцій з растровими зображеннями, коли необхідно зрушити вліво або вправо групу бітів для перепозиціонування картинки на екрані. Крім того, дані команди можна з успіхом застосовувати в додатках для шифрування даних, алгоритм роботи яких побудований на операціях зсуву групи бітів. Нарешті, ці дві команди можуть використовуватися при виконанні операцій швидкого множення або ділення цілих чисел з дуже великою розрядністю.
Команда MUL.
Команда MUL служить для множення 8-, 16- і 32-розрядних беззнакових цілих чисел, що знаходяться в одному з регістрів загального призначення або в пам'яті, з операндом, розміщеним в регістрі AL, АХ або ЕАХ:

Команда MUL має всього один операнд, який є множником. У табл. 2 зазначено, в яких регістрах розміщується множимое і твір в залежності від розміру множника.
Таблиця 2. Розташування множимо і твори в залежності від розміру множника.

Щоб при виконанні операції множення не виникло переповнення, розмір твору повинен в два рази перевищувати розміри множимо і множника. На рис. 14 показаний процес множення регістра ЕАХ на 32-розрядний множник.

Малюнок 14. Виконання операції множення.
Внаслідок виконання команди MUL встановлюються два прапори: перенесення CF і пе-реполненія OF, якщо значення старшої половини твори не дорівнює нулю. Я спеціально роблю акцент на прапорі CF, оскільки зазвичай він використовується при аналізі результатів виконання арифметичних команд з цілими числами без знака. Наприклад, при множенні регістра АХ на 16-розрядний операнд, твір зберігається в парі регістрів DX: АХ. При цьому, якщо регістр DX не дорівнює нулю, буде встановлено прапор переносу СF.
Приклад 1. У наведеному нижче фрагменті програми виконується множення 8-розрядних цілих чисел без знака (5 х 10h), в результаті чого виходить 16-розрядне число 0050h, яке розміщується в регістрі АХ:
даному випадку прапор переносу CF не встановлюється, оскільки регістр АН (старша половина твори) дорівнює нулю.
Приклад 2. У наведеному нижче фрагменті програми виконується множення 16-розрядних цілих чисел без знака (0l00h x 2000h), в результаті чого виходить 32-розрядне число 00200000h, яке розміщується в регістрах DX: АХ:

7

В даному випадку прапор СF встановлюється, оскільки регістр DX не дорівнює нулю.
Приклад 3. У наведеному нижче фрагменті програми виконується множення! 32-розрядних цілих чисел без знака (12345h x 1000h), в результаті чого виходить 64-розрядне число 0000000012345000h, яке розміщується в регістрах ЕDX: Еах:

Команда IMUL.
Ця команда призначена для множення цілих чисел зі знаком. Вона має такий же синтаксис і формат операнда, що і команда MUL. Різниця полягає лише в тому, що при множенні за допомогою цієї команди зберігається знак твори.
Внаслідок виконання команди IMUL встановлюються два прапори: перенесення СF і переповнення OF, якщо значення старшої половини твори не є розширенням знакового розряду, узятим з молодшою ​​половини твори. Я спеціально тут роблю акцент на прапорі OF, оскільки зазвичай він використовується при аналізі результатів виконання арифметичних команд з цілими числами зі знаком. Наведені нижче приклади допоможуть прояснити ситуацію.
Приклад 1. У наведеному нижче фрагменті програми виконується множення 8-розрядних цілих чисел зі знаком (48 х 4), в результаті чого виходить 16-розрядне число 00C0h (+192), яке розміщується в регістрі АХ:
даному випадку вміст регістра АН не є знаковим розширенням регістра AL, тому прапор переповнення OF встановлюється.
Приклад 2. У наведеному нижче фрагменті програми виконується множення 8-розрядних цілих чисел зі знаком (-4 х 4), в результаті чого виходить 16-розрядне число FFF0h (-16), яке розміщується в регістрі АХ:

Оскільки вміст регістра АН є знаковим розширенням регістра AL, прапор переповнення OF не встановлюється.
Приклад 3. У наведеному нижче фрагменті програми виконується множення 16-розрядних цілих чисел зі знаком (48 х 4), в результаті чого виходить 32-розрядне число 000000С0h (+192), яке розміщується в регістрах DX: АХ:

даному випадку вміст регістра DX є знаковим розширенням регістра АХ, тому прапор переповнення OF не встановлюється.
Приклад 4. У наведеному нижче фрагменті програми виконується множення 32-розрядних цілих чисел зі знаком (4823424х-423), в результаті чого виходить 64-розрядне число FFFFFFFF86635D80h (-2 040 308 352), яке розміщується в регістрах EDX: EАХ:

8
Вміст регістра EDX є знаковим розширенням регістра EAX, тому прапор переповнення OF не встановлюється.
Команда DIV.
Команда DIV служить для поділу на 8-, 16- і 32-розрядний беззнаковое ціле число, що знаходиться в одному з регістрів загального призначення або в пам'яті операнда, розташованого в регістрах АХ, DX: АХ або EDX: Еах:

Команда DIV має всього один операнд, який є дільником. У табл. 3 зазначено, в яких регістрах розміщується ділене, дільник, приватне і залишок в залежності від розміру множника.
Таблиця 2. Розташування операндів команди DIV.

На рис. 15 показаний процес ділення 64-розрядного числа, що знаходиться в регістрах EDX: Еах, на 32-розрядний дільник.

Малюнок 15. Виконання операції ділення на 32-розрядне число.
Приклад 1. У наведеному нижче фрагменті програми виконується розподіл на 8-розрядне ціле число без знака (83h / 2), в результаті чого виходить 8-розрядний приватне 4lh і залишок 1, які розміщуються в регістрах AL і АН:

Приклад 2. У наведеному нижче фрагменті програми виконується розподіл на 16-розрядний ціле число без знака (8003h / l00h), в результаті чого виходить 16-розрядний приватне 80h і залишок 3, які розміщуються в регістрах АХ і DX. Оскільки в регістрі DX міститься старша частина діленого, перед виконанням команди DIV потрібно його обнулити:

Приклад 3. У наведеному нижче фрагменті програми виконується розподіл на 32-розрядний ціле число без знака. При цьому ділене розміщується в пам'яті у вигляді 64-розрядного числа типу
QWORD:

9
Розподіл цілих чисел зі знаком.
5.1. Команди CBW, CWD, CDQ.
Перш ніж розглянути команди ділення цілих чисел зі знаком, ми повинні познайомитися з трьома командами, за допомогою яких можна розширити довжину цілого числа зі знаком (тобто поширити знаковий розряд на його старшу половину). Команда CBW (Convert Byte to Word, або перетворити байт в слово) дозволяє розширити знаковий розряд з регістра AL в регістр АН. В результаті знак вихідного числа зберігається:

Як видно з цього прикладу, числа 9Bh і FF9Bh рівні -101. Різниця полягає лише в кількості займаних ними розрядів. (Про розширення знакового розряду цілого числа ми вже говорили в раніше, коли розглядали команду MOVSX.)
командаCWD (ConvertWordtoDoubleword,іліпреобразоватьслововдвойноеслово)
розширює знаковий біт з регістра АХ в регістр DX:

Команда CDQ (Convert Doubleword to Quadword, або перетворити подвійне слово в учетверенное слово) розширює знаковий біт з регістра ЕАХ в регістр EDX:

5.2. Команда IDIV.
Команда IDIV дозволяє виконати поділ цілих чисел зі знаком. Вона має ті ж формати операнда, що і команда DIV. При розподілі на 8-розрядне число, перед виконанням команди IDIV потрібно розширити знак діленого в регістр АН за допомогою команди CBW. У наведеному нижче прикладі виконується розподіл числа -48 на 5. Після виконання команди IDIV в регістрі AL буде знаходитися приватне, рівне -9, а в регістрі АН - залишок, що дорівнює -3:

За аналогією, при виконанні ділення на 16-розрядне число, необхідно спочатку розширити знак регістра АХ в регістр DX. У наведеному нижче прикладі ділиться число -5000 на 256.

10
Аналогічно, при виконанні ділення на 32-розрядне число, необхідно спочатку розширити знак регістра ЕАХ в регістр EDX. У наведеному нижче прикладі ділиться число -50000 на 256:

5.3. Переповнення при діленні.
Якщо при виконанні команди ділення виходить приватне, розмір якого перевищує розмір виділяється для його розміщення операнда, виникає ситуація переповнення при діленні. Це призводить до переривання роботи процесора і завершення роботи поточної програми. Наприклад, при виконанні наведеної нижче послідовності команд виникає ситуація переповнення при діленні, оскільки приватне (100h) не може бути розміщено в регістрі AL:

Якщо запустити дану програму в системі MS Windows, з'явиться діалогове вікно з описом помилки.
Аналогічне діалогове вікно з'явиться і при виконанні наведених нижче команд, що викликають поділ на нуль:

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

Уникнути ситуації ділення на нуль ще простіше. Перед виконанням команди ділення потрібно перевірити дільник на рівність нулю і передати управління іншій гілці програми, якщо прапор нуля встановлений:

Реалізація арифметичних виразів.
Раніше вже було продемонстровано, як можна реалізувати на мові асемблера обчислення значень простих арифметичних виразів, що містять тільки операції додавання і віднімання. Тепер ми можемо ускладнити структуру виразів, додавши в них операції множення і ділення. В
11
більшості компіляторів з мов високого рівня при виконанні команд множення двох 32-розрядних операндів, значення старших 32-розрядів твори просто ігнорується. У мові асемблера ви можете після виконання команди множення проаналізувати значення прапорів переносу CF і переповнення OF, щоб зрозуміти, чи поміститься твір в виділені для нього 32 розряду змінної. Вплив команд множення на ці прапори було описано вище.
Приклад 1. Реалізуємо наведений нижче оператор мови C ++ у вигляді ассемблерной програми, використовуючи 32-розрядні цілочисельні змінні:
var4 = (varl + var2) * var3;
Це завдання має дуже просте і очевидне рішення, оскільки всі операції можна виконувати зліва направо (тобто спочатку складання, а потім множення). Після виконання другої команди, в регістрі ЕАХ буде знаходитися сума двох змінних varl і var2. У третій групі вміст регістра ЕАХ множиться на значення змінної var3, а отримане твір буде знаходитися в регістрі ЕАХ:

Якщо в результаті виконання команди MUL значення твору буде займати більше, ніж 32 розряду, встановлюється прапор CF. Тоді наступна за командою MUL команда JC передасть управління ділянці програми, в якому виконується обробка помилковою ситуації.
Приклад 2. Реалізуємо наведений нижче оператор мови C ++ у вигляді ассемблерной програми, використовуючи 32-розрядні цілочисельні змінні:
var4 = (varl * 5) / (var2-3);
Цей вираз складається з двох подвираженій, укладених в дужки. Значення лівого вираження varl * 5 можна розмістити в парі регістрів EDX: Еах. В результаті виникнення ситуації переповнення неможливо, тому код стає непотрібним. Значення правого вираження var2 - 3 розмістимо в регістрі ЕВХ. Останньою командою нашої програми буде команда ділення:

Приклад 3. Реалізуємо наведений нижче оператор мови C ++ у вигляді ассемблерной програми, використовуючи 32-розрядні цілочисельні змінні:
var4 = (varl * -5) / (-var2 / var3);
Цей приклад трохи складніше, ніж два попередніх. Обчислення цього виразу почнемо з правого вираження і збережемо його значення в регістрі ЕВХ. Оскільки в ньому використовуються операнди зі знаком, важливо не забути перед виконанням команди ділення розширити знаковий розряд діленого в регістр EDX і скористатися командою IDIV:

Далеевичіслімзначеніелевоговираженіяісохранімпроізведеніевпаререгістров
EDX: EAX:

І, нарешті, поділимо значення лівого вираження (EDX: Еах) на значення правого вираження
(ЕВХ):
12

Контрольні питання:
Які прапори змінюються при використанні команд зрушень?
Чим відрізняється логічний і арифметичний зрушення?
Які команди виконують логічний і арифметичний зрушення?
Для чого найчастіше використовують оператор логічного зсуву вправо?
Як зробити множення регістра AX на 8, використовуючи оператор логічного зсуву?
Для чого найчастіше використовують оператор логічного зсуву вліво?
Чи можна за допомогою оператора SHR робити поділ чисел сл знаком?
Як зробити розподіл регістра AX на 64, використовуючи оператор логічного зсуву якщо врахувати що в AX ціле беззнаковое число?
Для чого зазвичай використовується команда SAR?
Опишіть дії команди SAR.
Для чого можна використовувати команду ROL?
Опишіть дію команди RCL.
Наведіть приклад використання команди RCL.
Опишіть дію команди RCR.
Наведіть приклад використання команди RCR.
Які дії виконують команди SHLD і SHRD?
Наведіть приклад застосування SHLD і SHRD команд.
Для вирішення яких завдань можуть використовуватися команди SHLD і SHRD?
Яка команда виконує множення без знака?
Який синтаксис команди множення без знака?
Для чого використовується прапор CF в команді множення без знака?
Яка команда виконує множення чисел зі знаком?
Для чого використовується прапор OF в команді множення чисел зі знаком?
Який синтаксис команди множення чисел зі знаком?
Яку команду використовують для ділення чисел без знака?
Який синтаксис команди ділення чисел без знака?
Які команди використовуються для розширення цілого числа зі знаком?
Який синтаксис мають команди розширення цілого числа зі знаком?
Яка команда використовуються для розподілу цілого числа зі знаком?
Який синтаксис має команда ділення цілого числа зі знаком?
Які помилки можуть виникнути при використанні команд ділення?
Реалізуйте вираз var4 = (varl + var2) * var3 у вигляді ассемблерной програми.
Домашнє завдання:
Підготується до письмового опитування.
Список використаної літератури:
Кіп Р. Ірвін. Мова Асемблера для процесорів Intel, 4-е видання .: Пер. з англ. - М .:
Видавничий дім «Вільямс», 2005. - 912 с.: Ил.
13

Приложенные файлы

  • docx 8475807
    Размер файла: 707 kB Загрузок: 0

Добавить комментарий