Команди двійкової арифметики

До групи арифметичних команд над двійковими числами входять команди: додавання, віднімання, множення, ділення і зміни знака.

 

Команди додаванняпредставлені трьома командами:

 

ADD (ADDition) –команда додавання операндів. Команда має вид

 

ADD dst,src

 

і виконує додавання операндів src (джерело) і dst (приймач), які можуть бути байтами, словами, подвійними словами. Результат операції розміщується в операнді dst (приймач), при цьому втрачається один із доданків. Як операнд dst (приймач) можуть використовуватися усі регістри загального призначення, крім сегментних, і комірки пам’яті, які можливо адресувати будь-яким способом адресування. У будь-якому випадку адресується лише одна комірка, що відповідає молодшому байту результату, адреси інших для розміщення старших байтів формуються автоматично. В разі використання як операнд dst (приймач) акумулятора, довжина команди стає меншою і виконується вона швидше.

Операнд src (джерело) може розміщуватись у регістрах загального призначення, комірках пам’яті і бути безпосереднім числом. Розмір обох операндів обов’язково повинен співпадати.

Команда установлює прапорці OF, SF, ZF, AF, PF, CF регістра ознак (FLAGS), які можливо аналізувати у подальших командах.

 

ADC (Addition with Carry)– команда додавання операндів з урахуванням вхідного перенесення з біта CF регістра ознак, значення якого додається до результату.

Вид і виконання команди повністю співпадає з командою ADD.

Використовується при додаванні двійкових 64-розрядних чисел.

Приклади використання команд додавання:

 

ADD АХ,SI ; Додавання вмісту регістра АХ до вмісту SI і

; збереження результату у регістрі АХ

ADD [1234],BX ; Додавання вмісту комірок пам’яті з адресами

; 1234Н і 1235Н у поточному сегменті даних до

; вмісту регістра BX і завантаження результату до

; тих самих комірок. Наприклад, вміст регістра

; (ВХ) = 1111Н; у комірках пам’яті з адресами

; 1234Н і 1235Н зберігаються відповідно числа 22Н

; і 33Н. Додавання буде виконуватися таким чином

;

;

;

;

; Результат буде розташовано у тих самих комірках –

; молодший байт у комірці з адресою 1234Н, а

; старший – у комірці 1235Н

ADC AL,DH ; Додавання до вмісту регістра DH вмісту AL і

; поточного значення біту CF, завантаження

; результату до регістра AL

;

;

;

;

 

INC (INCrement operand by 1)– команда додавання 1 до значення операнда. Синтаксис команди:

 

INC dst.

 

Операндом dst (приймач) може бути будь-який регістр загального призначення (8- , 16- або 32-розрядний) або операнд (8- , 16- або 32-розрядний), розташований у пам’яті. При виконанні команди операнд вважається беззнаковим числом.

Команда установлює прапорці OF, SF, ZF, AF, PF регістра ознак.

 


Команди відніманнятакож представлені трьома командами:

SUB (SUBtract)– команда віднімання цілих чисел. Команда має вид

 

SUB dst,src

 

і виконує віднімання від вмісту операнда dst (приймач) вмісту операнда src (джерело). Результат зберігається в операнді dst (приймач), при цьому втрачається попередній вміст цього операнда. Як операнди dst (приймач) можуть використовуватися усі регістри загального призначення, крім сегментних, і комірки пам’яті, які можливо адресувати будь-яким способом адресування. У будь-якому випадку адресується лише одна комірка, що відповідає молодшому байту результату, адреси інших для розміщення старших байтів формуються автоматично. В разі використання як операнд dst (приймач) акумулятора, довжина команди стає меншою і виконується вона швидше.

Операнд src (джерело) може розміщуватись у регістрах загального призначення, комірках пам’яті і бути безпосереднім числом. Розмір обох операндів обов’язково повинен співпадати.

Команда змінює прапорці OF, SF, ZF, AF, PF, CF регістра ознак, які можливо аналізувати у подальших командах.

 

SBB (SuBtract with Borrow)– віднімання з урахуванням позики зі старшого розряду. Використовується для виконання віднімання старших частин значень багатобайтових операндів з урахуванням можливої попередньої позики під час віднімання молодших частин операндів.

При її виконанні, від значення операнда dst (приймач) віднімається сума значення операнда src (джерело) і значення біта CF; результат завантажується на місце операнда dst (приймач). Вид команди збігається з командою SUB.

Команда змінює прапорці OF, SF, ZF, AF, PF, CF регістра ознак.

Приклад використання цієї команди покажемо за допомогою наступної програми:

 

STC ; Установлення біта CF в 1

MOV AX,4567H ; Завантаження до регістра АХ числа 4567Н

MOV BX,1111H ; Завантаження до регістра BX числа 1111Н

SBB AX,BX ; Виконання цієї команди відбувається у два етапи:

; – до вмісту регістра BX додається 1

; 1111Н + 0001Н = 1112Н;

; – із вмісту регістра АХ віднімається число, яке

; отримано на попередньому етапі:

; 4567Н

; 1112Н

; 3455Н

; при виконанні прапорець CF скидається в 0

; (позики немає)

MOV CX,1234H ; Завантаження до регістра CХ числа 1234Н

MOV DX,9111H ; Завантаження до регістра DХ числа 9111Н

SBB CX,DX ; Виконання команди відбувається аналогічно

; описаному вище:

; 9111Н + 0000Н = 9111Н (прапорець CF

; скинуто);

; 1234Н

; 9111Н

; 8123Н (з урахуванням позики зі

; старшого розряду; прапорець CF

; установлюється в 1)

 

DEC (DECrement operand by 1)– віднімання від значення операнда 1. Синтаксис команди:

 

DEC dst.

 

Операндом dst (приймач) може бути будь-який регістр загального призначення (8-, 16- або 32-розрядний) або операнд (8-, 16- або 32-розрядний), розташований у пам’яті. При виконанні команди операнд вважається беззнаковим числом.

Команда змінює прапорці OF, SF, ZF, AF, PF регістра ознак.

 

Команди множенняу системі команд представлені двома командами: для цілих беззнакових чисел і для цілих чисел зі знаком.

 

MUL (MULtiply) – команда множення двох цілих беззнакових чисел. Команда має узагальнений вид

 

MUL src.

 

Алгоритм виконання залежить від формату операнда у команді і потребує визначити лише операнд src (джерело), розмір якого байт, слово або подвійне слово і який може розміщатися у пам’яті або у регістрі. Розміщення другого операнда фіксовано і залежить від розміру операнда src (джерело):

– якщо операнд src (джерело) – байт, то другий операнд повинен розміщуватися у регістрі AL;

– якщо операнд src (джерело) – слово, то другий операнд повинен розміщуватися у регістрі АХ;

– якщо операнд src (джерело) – подвійне слово, то другий операнд повинен розміщуватися у регістрі ЕАХ.

Розміщення результату також є фіксованим і визначається розмірами співмножників:

- якщо перемножуються байти, то результат розміщується у регістрі АХ;

- якщо перемножуються слова, то результат розміщується у регістрах DХ:АХ;

- якщо перемножуються подвійні слова, то результат розміщується у регістрах ЕDХ:ЕАХ.

У результаті виконання цієї команди формуються лише прапорці OF і CF. Їх значення, якщо старша половина добутку не дорівнює нулю, становить 1, що показує наявність розрядів результату у регістрах АН і . В іншому випадку їх значення дорівнює 0. На стан інших прапорців виконання команди MUL не впливає.

Приклад використання команди:

 

MOV AL,02H ; Завантаження першого співмножника (02Н = 02D)

; до регістра AL

MOV BL,80H ; Завантаження другого співмножника (80Н = 128D)

; до регістра BL

MUL BL ; Множення операндів, результат розташовано у

; регістрі АХ (0100Н = 256D)

 

IMUL (Integer MULtiply) – команда множення двох цілих чисел зі знаком. Команда має узагальнений вид

 

IMUL src.

 

Команда виконується майже так само, як і команда MUL, проте у цій команді операнди подаються як числа зі знаком у доповнювальному коді.

Прапорці OF і CF установлюються залежно від розміщення знакових розрядів: якщо старша половина добутку, яка знаходиться у регістрах АН або , не містить поширення знаку молодшої частини результату, то прапорці OF і CF установлюються в 1, що показує наявність у старшій половині результату значущих цифр. В іншому випадку – установлюються у 0. Стан інших прапорців є невизначеним.

 

Команди діленняу системі команд представлено двома командами: для цілих беззнакових чисел і для цілих чисел зі знаком.

 

DIV (DIVide unsigned)– команда ділення цілих беззнакових чисел. Узагальнена форма цієї команди має вигляд:

 

DIV src.

 

Для виконання команди необхідно задавати лише один операнд – src (джерело), розмір якого може становити байт, слово і подвійне слово, розміщення другого операнду є фіксоване і залежить від розміру дільника, який визначено у команді:

– якщо дільник це байт, то ділене повинне бути розміщене у регістрі АХ. Частку буде розташовано у регістрі AL, а залишок – у регістрі АН;

– якщо дільник це слово, то ділене розміщується у регістрах DХ:АХ і старша частина діленого розміщується у . Частка розміщується в АХ, а залишок у регістрі ;

– якщо дільник це подвійне слово, то ділене розміщується у регістрах ЕDХ:ЕАХ і старша частина діленого розміщується у . Частка розміщується в ЕАХ, а залишок – у регістрі ЕDХ.

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

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

Якщо частка за розміром більша за акумулятор або дільник дорівнює 0, то генерується переривання типу 0 і програма виконує підпрограму переривання.

Приклад виконання такої команди:

 

MOV AX,1111Н ; Завантаження діленого (1111Н = 4369D) до

; регістра AX

MOV BХ,20H ; Завантаження дільника (20Н = 32D) до регістра BL

CWD ; Формування необхідного розміру діленого

DIV BХ ; Ділення, частка у регістрі AХ дорівнює 0088Н,

; залишок у регістрі DХ дорівнює 0011Н

 

IDIV (Integer DIVide)– команда ділення цілих чисел зі знаком. Узагальнена форма цієї команди має вигляд:

 

ІDIV src.

 

Команда виконується майже так само як і команда DIV, проте у цій команді операнди подаються як числа зі знаком у доповнювальному коді.

Стан прапорців у регістрі ознак є невизначеним.

 

NEG (NEGate operand)– команда, яка змінює знак операнда. Команда має вигляд:

 

NEG src.

 

Команда змінює знак операнда, який може бути вмістом регістра загального призначення (8-, 16- або 32-розрядним) або вмістом комірок пам’яті (8, 16 або 32 розряди). Операція двійкового доповнення виконується як інвертування всіх розрядів операнда і додавання до результату 1. Команда змінює лише прапорець CF.