Команди додавання, віднімання і порівняння 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Команди додавання, віднімання і порівняння



Результати виконання арифметичних операцій фіксуються в шести прапорцях of, cf, sf, pf, af, cf регістра eflags. Стан прапорців можна проаналізувати за допомогою команд умовного переходу. Передбачена також команда into – переривання при переповненні (прапорець of=1).

Команди додавання. Дві основні команди додавання add і adc додавання з перенесенням. Вони мають узагальнений вигляд (після крапки з комою вказано алгоритм виконання):

add dst, src; dst=(dst)+(src) і формуються прапорці

adc dst, src; dst=(dst)+(src)+(cf) і формуються прапорці.

Форми команди add:

add reg/mem, imm; Розміри 8/16/32

add reg, reg/mem; Розміри 8/16/32

add reg/mem, reg; Розміри 8/16/32

add reg/mem16, imm8; Приймач 16, джерело 8 бітів

add reg/mem32, imm8; Приймач 32, джерело 8 бітів

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

Якщо додаються операнди як без знакові числа, то значення прапорця cf=1 означає, що відбулося переповнення. Якщо ж додаються знакові числа, то переповнення тут фіксує прапорець of, а значення прапорця cf не несе корисної інформації.

До команд додавання відносять також команду

inc dst; dst=(dst)+1.

Операндом команди може бути регістр або комірка пам’яті

inc reg/mem; Розмір 8/16/32.

Ця команда еквівалентна команді add dst,1, однак вона не впливає на прапорець cf.

Команди віднімання. Дві основні команди віднімання sub і sbb віднімання з перенесенням. Вони мають узагальнений вигляд (після крапки з комою вказано алгоритм виконання):

sub dst, src; dst=(dst) – (src) і формуються прапорці

sbb dst, src; dst=(dst) –(src) –(cf) і формуються прапорці.

Відзначимо, що в операції віднімання прапорець cf перетворюється у прапорець позичання.

Форми команди sub:

sub reg/mem, imm; Розміри 8/16/32

sub reg, reg/mem; Розміри 8/16/32

sub reg/mem, reg; Розміри 8/16/32

sub reg/mem16, imm8; Приймач 16, джерело 8 бітів

sub reg/mem32, imm8; Приймач 32, джерело 8 бітів

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

До команд віднімання відносять також команду

dec dst; dst=(dst) – 1.

Операндом команди може бути регістр або комірка пам’яті

dec reg/mem; Розмір 8/16/32.

Ця команда еквівалентна команді sub dst,1 за винятком, що вона не впливає на прапорець перенесення cf.

До команд віднімання відноситься команда neg

neg reg/mem; Розмір 8/16/32.

Її операнд може знаходитися в регістрі або в пам’яті. Команда neg замінює значення регістра або операнда в пам’яті його точним доповненням у двійковій системі числення, тобто числом, яке при додаванні до початкового операнда дає суму рівну нулеві в усіх розрядах і перенесення зі старшого розряду.

Прапорець cf=1, якщо початковий операнд відмінний від 0, інакше – cf=0. Операнд віднімається від 0, результат записується на місце початкового операнда, прапорці of, sf, zf і pf формуються за результатом операції.

Увага. Якщо початковий операнд є мінімальне від’ємне число, то його величина не змінюється, а прапорці cf і of стають рівними 1.

Команда порівняння cmp. Має таке зображення: cmp dst, src; (dst) – (src) і формуються прапорці.

Відношення Знакові числа Числа без знаку
і або і або

Таблиця 15.1 Стан прапорців після команди порівняння


Команди множення і ділення

Множення знакових чисел – команда mul. Загальний вигляд команди

mul src; ext:acc=(acc)*(src).

Форма команди

mul reg/mem; Розміри 8/16/32 біти.

Множення байтів: акумулятор – регістр al, 16-бітовий добуток в парі регістрів ah:al. Регістр ah називається розширенням ext (extention) акумулятора al. Якщо src – слово, то акумулятор – регістр ax, розширення акумулятора – регістр dx, тобто 32-бітовий добуток записується в пару регістрів dx:ax. Нарешті, якщо src – 32-бітовий множник, то другий співмножник (або множене) знаходиться в акумуляторі eax, а 64-бітовий добуток записується в пару регістрів edx:eax. Якщо старша половина добутку, тобто вміст розширення акумулятора відмінний від нуля, то прапорці of і cf установлюються в 1, показуючи наявність значущих цифр у старшій половині добутку. Інакше, of=0 і cf=0. Стан інших прапорців не визначений.

Команда множення знакових чисел imul (Integer Multiply) має більше можливостей, ніж команда mul, допускаючи задання одного, двох або трьох операндів. Однооперандна imul (з урахуванням подання операндів і добутку в доповняльному коді) еквівалентна команді mul

imul src; ext:acc=(acc)*(src).

Якщо старша половина добутку не дорівнює розширенню знака молодшої половини, то of=1 cf=1.

Двооперандна imul має вигляд

imul reg, src; reg= (reg)*(src).

Множиться вміст загального регістра на джерело, яким може бути (reg), (mem), а також безпосередній операнд.

Форми цієї команди:

imul reg16, imm8; imul reg32, imm32;

imul reg16, imm16; imul reg16, reg/mem16;

imul reg32, imm8; imul reg32, reg/mem32.

Добуток записується в регістр – приймач, старша частина добутку втрачається. Якщо вона містить значущі цифри – of=1 і cf=1.

У триоперандній команді imul dst, src, imm; dst=(src)*imm приймачем може бути тільки загальний регістр, а джерелом – загальний регістр або комірка оперативної пам’яті.

Припустимі форми цієї команди:

imul reg16, reg/mem16, imm8/16; добуток 16 бітів,

imul reg32, reg/mem32, imm8/32; добуток 32 біти.

При множенні стала байт розширюється зі знаком, добуток записується на місце першого операнда, старша частина добутку втрачається (якщо вона значуща, то of=1 cf=1).

Команди ділення. Команда ділення div (divide) без знакових цілих чисел має такий вигляд:

div src; acc= частка((ext:acc)/(src)) – частка від ділення в акумулятор,

ext=остача((ext:acc)/(src)) – остача – в розширення акумулятора.

Ділиться ділене подвійної довжини – розширення акумулятора:акумулятор (ah:al, dx:ax, edx:eax) на вміст джерела src, яке може бути вмістом регістра або комірки оперативної пам’яті (розміри 8/16/32 біти). Стан всіх прапорців не визначений. Якщо частка перевищує розмір акумулятора acc або дільник дорівнює нулеві, то генерується особливий випадок типу 0 (ділення на нуль), а частка і остача тоді не визначені.

Команда ділення знакових чисел idiv виконує такі ж дії як і div над операндами (і результатом) в доповняльному коді. Неціла частка урізається до нуля. Знак остачі дорівнює знакові частки.

До групи команд ділення відносять команди перетворення, які можна використовувати для підготовки діленого. Команда cbw (convert byte to word) розширює (копіює) знаковий біт регістра al в усі біти регістра ah. Команда cwd (convert word to double word) копіює знаковий розряд регістра ax в усі біти регістра dx. Команда cwde (extended) передає вміст знакового біта регістра ax в усі біти старшої половини регістра eax. Нарешті, команда перетворення подвійного слова в почетверене cdq (convert dword to qword) копіює знаковий біт регістра eax в усі біти регістра edx. Усі ці команди не впливають на стан прапорців.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 505; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.42.168 (0.011 с.)