Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




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

 

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

 

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.

 






Поделиться с друзьями:


Дата добавления: 2015-10-19; Мы поможем в написании ваших работ!; просмотров: 589 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

В моем словаре нет слова «невозможно». © Наполеон Бонапарт
==> читать все изречения...

2172 - | 2117 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.008 с.