Команди двійкової арифметики
До групи арифметичних команд над двійковими числами входять команди: додавання, віднімання, множення, ділення і зміни знака.
Команди додаванняпредставлені трьома командами:
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, що показує наявність розрядів результату у регістрах АН і DХ. В іншому випадку їх значення дорівнює 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 установлюються залежно від розміщення знакових розрядів: якщо старша половина добутку, яка знаходиться у регістрах АН або DХ, не містить поширення знаку молодшої частини результату, то прапорці OF і CF установлюються в 1, що показує наявність у старшій половині результату значущих цифр. В іншому випадку – установлюються у 0. Стан інших прапорців є невизначеним.
Команди діленняу системі команд представлено двома командами: для цілих беззнакових чисел і для цілих чисел зі знаком.
DIV (DIVide unsigned)– команда ділення цілих беззнакових чисел. Узагальнена форма цієї команди має вигляд:
DIV src.
Для виконання команди необхідно задавати лише один операнд – src (джерело), розмір якого може становити байт, слово і подвійне слово, розміщення другого операнду є фіксоване і залежить від розміру дільника, який визначено у команді:
– якщо дільник це байт, то ділене повинне бути розміщене у регістрі АХ. Частку буде розташовано у регістрі AL, а залишок – у регістрі АН;
– якщо дільник це слово, то ділене розміщується у регістрах DХ:АХ і старша частина діленого розміщується у DХ. Частка розміщується в АХ, а залишок у регістрі DХ;
– якщо дільник це подвійне слово, то ділене розміщується у регістрах Е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.