Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л.р.1-12.СПРГ-1(40, укр).doc
Скачиваний:
5
Добавлен:
27.08.2019
Размер:
2.33 Mб
Скачать

9. Література

1. Голуб Н. Г. Искусство программирования на Ассемблере. Лекции и упражнения.- СПб.: ООО ”ДиаСофтЮП”, 2002. – 656 с.

2. Магда Ю. С. M12 Ассемблер для процессоров Intel Pentium. – СПб.: Питер, 2006. – 410с.

3. Ирвин Кип. Язык ассемблера для процессоров Intel, 4-е издание.: Пер с англ. – М.: Издательский дом ”Вильямс”, 2005. – 912с.

Лабораторна робота 4.

Тема: Арифметичні команди у програмах на асемблері.

Мета: Вивчити систему арифметичних команд мови асемблера. Ознайомитися з поданням інформації в ЕОМ.

1. Підготовка до роботи.

Ознайомитися із основними арифметичними командами мови асемблера. [1, стор. 81-103], [2, стор. 172-189], [3, стор. 169-177].

2. Питання для самоконтролю.

Як у пам’яті представлені цілі числа?

У чому різниця між знаковими та беззнаковими числами?

У чому особливість команд INC, DEC?

У чому особливість команд ділення, множення?

Як підготовити операнди до ділення?

Як відбувається зміна типів даних?

Як проводяться операції додавання і вирахування для багатобайтних чисел?

3. Короткі теоретичні відомості

Ця група команд дозволить нам розібратися, яким образом процесор Intel виконує найпростіші арифметичні операції над даними довжиною 8, 16 або 32 біта. Усі ці команди сигналізують про результат процесу обчислення, заносячи певні значення у відповідні біти регістра flags.

3.1. Математичні операції.

3.1.1 Команди додавання

add destination, source

заміняє операнд-адресат сумою операнда-джерела й адресата і встановлює прапор CF, якщо був перенос. Операндами можуть байти, слова або подвійні слова. Адресатом може бути регістр загального призначення або пам'ять, джерелом регістр загального призначення або безпосереднє значення. Також це може бути пам'ять, якщо адресат - це регістр.

add ax, bx ; додає регістр до регістра

add eax, [esi] ; додає пам'ять до регістра

add [di], al ; додає регістр до пам'яті

add al, 48 ; додає безпосереднє значення до регістра

add [mem16],48 ; додає безпосереднє значення до пам'яті

adc destination, source

підсумовує операнди, додає одиницю, якщо встановлено прапор CF і заміняє адресат результатом. Правила для операндів такі ж, як з інструкцією “add”. “add” з наступними за нею кількома інструкціями “adc” може бути використана для додавання чисел більше, ніж 32 біта.

movax, word ptr a ; ax <= мол. частина а

movbx, word ptr a+2 ; bx <= ст. частина а

movcx, word ptr b ; сx <= мол. частина b

movdx, word ptr b+2 ; dx <= ст. частина b

addax, cx ; <ax>:=<ax>+<cx>, мол. частина

adcbx, dx ; <bx>:=<bx>+<dx>+<cf>, ст. частина

movword ptr x, ax ; мол. частина х <== <ax>

mov word ptr x+2, bx ; ст. частина х <== <bx>

xadd destination, source

змінює місцями операнд-адресат і операнд-джерело, потім завантажує суму двох значень в операнд-адресат. Правила для операндів такі ж, як з інструкцією “add”.

inc destination

додає до операнда одиницю, він не може змінити CF. Операндом може бути регістр загального призначення або пам'ять, розміром він може бути в байт, слово або подвійне слово.

inc ax; додає одиницю до регістра

inc byte [bx]; збільшує одиницю до пам'яті

Усі перераховані вище інструкції змінюють прапори SF, ZF, PF і OF:

- SF завжди приймає значення, рівне битку знака результату;

- ZF установлюється, якщо результат дорівнює нулеві;

- PF установлюється, якщо вісім бітів молодшого розряду містять парне число одиниць;

- OF установлюється, якщо результат занадто великої для позитивного числа або занадто маленький для негативного (крім біта знака) для того, щоб уміститися в операнді-адресаті.

3.1.2 Команди вирахування є зворотними стосовно команд додавання, при їхньому виконанні діють ті ж правила, що і при виконанні команд додавання, аналогічно змінюються і прапори мікропроцесора.

sub destination, source

віднімає операнд-джерело від операнда адресата і заміняє адресат результатом. Якщо потрібен негативний перенос, установлюється прапор CF. Правила для операндів такі ж, як з інструкцією “add”.

sbb destination, source

віднімає джерело з адресата, віднімає одиницю, якщо встановлено прапор CF заміняє адресат результатом. Правила для операндів такі ж, як з інструкцією “add”. “sub” з наступними за нею декількома інструкціями “sbb” може бути використана для вирахування чисел більш, ніж 32 біта.

dec destination

віднімає з операнда одиницю, не може змінити CF. Правила для операнда такі ж, як з інструкцією “inc”.

cmp destination, source

віднімає операнд-джерело з оператора-адресата. Ця інструкція може встановлювати прапори, як і “sub”, але не вносить зміни в операнди. Правила для операндів такі ж, як з інструкцією “sub”.

neg destination

віднімає від нуля цілий операнд зі знаком. Ефект від цієї інструкції - це зміна знака операнда з позитивного на негативний або з негативного на позитивний. Правила для операндів такі ж, як з інструкцією “inc”.

3.1.3 Команди множення відрізняються тим, що під результат завжди резервують у 2 рази більше місця, чим розмір операндів, що беруть участь в операції, відповідно при цьому використовуються пари регістрів - <ah: al>, <dx: ax>, <edx: eax>.

mul (accumulator,) source

виконує беззнакове перемножування операнда – регістра загального призначення, – і акумулятора. Якщо операнд - байт, процесор множить його на вміст AL і повертає 16-бітний результат у AH і AL. Якщо операнд - слово, процесор множить його на вміст AX і повертає 32-бітний результат у DX і AX. Якщо ж операнд - це подвійне слово, процесор множить його на вміст EAX і повертає 64-бітний результат у EDX і EAX. “mul” установлює CF і OF, якщо верхня половина результату ненульова, інакше вони очищаються. Правила для операндів такі ж, як з інструкцією “inc”.

imul (accumulator,) source

imul destination, source

imul destination, source, imm

виконує знакове перемножування операндів. У цієї інструкції є три варіації. Перша має один операнд і працює так само, як інструкція “mul”. Друга має два операнди, і тут операнд-адресат збільшується на операнд-джерело і результат заміняє операнд-адресат. Цим операндом може бути регістр загального призначення, пам'ять або безпосереднє значення. Третя форма інструкції має три операнди, операндом-адресатом повинний бути регістр загального призначення, довжиною в слово або в подвійне слово, операндом-джерелом може бути регістр загального призначення або пам'ять, третім операндом повинне бути безпосереднє значення. Джерело збільшується на безпосереднє значення і результат поміщається в регістр-адресат. Усі три форми обчислюють результат розміром у два рази більше розміру операндів і ставлять CF і OF, якщо верхня частина результату ненульова, але друга і третя форми усікають результат до розміру операндів. Їх можна використовувати для беззнакових операндів, тому що нижня половина результату та сама для знакових і беззнакових операндів. Нижче ви бачите приклади всіх трьох форм:

imul bl ; множення акумулятора на регістр

imul word [si] ; множення акумулятора на пам'ять

imul bx, cx ; множення регістра на регістр

imul bx,[si] ; множення регістра на пам'ять

imul bx,10 ; множення регістра на безпосереднє значення

imul ax, bx,10 ; регістр, помножений на безпосереднє значення, у регістр

imul ax,[si],10 ; пам'ять, помножена на безпосереднє значення, у регістр

3.1.4 Команди ділення відрізняються тим, що ділене (джерело) завжди виділяється в 2 рази більше місця, чим під дільник, відповідно при цьому використовуються пари регістрів - <AH: AL>, <DX: AX>, <EDX: EAX>. Результат завжди зберігається в ці ж регістрові пари – частка в регістри AL, AX, EAX, залишок у регістри AH, DX, EDX.

div (accumulator,) source

робить беззнакове ділення акумулятора на операнд. Ділене (акумулятор) розміром у два рази більше дільника (операнда), частка і залишок такого ж розміру, як і дільник. Якщо дільник - байт, ділене береться з регістра AX, частка зберігається в AL, а залишок - у AH. Якщо дільник - слово, верхня половина діленого береться з DX, а нижня - з AX, частка зберігається в AX, а залишок - у DX. Якщо дільник - подвійне слово, верхня половина діленого береться з EDX, а нижня - з EAX, частка зберігається в EAX, а залишок - у EDX. Правила для операндів такі ж, як з інструкцією “mul”.

При діленні доречно згадати про внутрішнє представлення цілих чисел. Беззнакові числа займають усю комірку пам'яті, поняття знак для них не існує — вони вважаються позитивними. Тому при діленні беззнакових чисел у старшу частину діленого треба занести нуль (mov ax,0, але краще xor ax, ax, призначення xor буде розглянуто в наступній роботі). При роботі зі знаковими числами використовуються спеціальні команди розповсюдження знака, що будуть розглянуті нижче.

idiv (accumulator,) source

виконує знакове ділення акумулятора на операнд. Інструкція використовує ті ж регістри, що і “div”, правила для операнда теж такі - же.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]