Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТ МП.doc
Скачиваний:
211
Добавлен:
10.02.2016
Размер:
5 Мб
Скачать
☆

9.3.3 Команди перетворення даних мови Асемблер-86

Вхідний контроль:

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

  2. Який цифровий пристрій виконує математичні та логічні операції?

  3. Які ознаки результату формуються пристроєм АЛП при виконанні математичних та логічних операцій?

  1. У яких системах числення можуть бути подані дані, які оброблюються МПС?

  2. Як подаються десяткові числа у двійково-десятковій кодованій системі числення?

  3. Як формуються ознаки результатів при виконанні арифметичних і логічних операцій?

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

Арифметичні команди мови Асемблер-86 виконуються над цілими числами чотирьох типів: двійкові числа без знака; двійкові числа зі знаком; розпаковані двійково-десяткові числа й упаковані двійково-десяткові числа. Числа зі знаком подаються у МП у вигляді доповнювального коду. Для виконання арифметичних операцій над числами з плаваючою точкою використовується математичний співпроцесор, команди якого становлять окрему групу команд.

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

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

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

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.

Команди десяткової арифметики

До цієї групи входять команди, що дозволяють працювати з десятковими числами, які можуть бути поданими у двох формах: як упаковані двійково-десяткові числа (BCD-формат), і як розпаковані двійково-десяткові числа (ASCII-формат). У кожному з форматів багаторозрядні десяткові числа представлено послідовностями байтів, з якими і працює МП. Основним робочим регістром в усіх командах десяткової арифметики є регістрAL. Слід зазначити, що команд, спеціально налаштованих на виконання операцій складання, віднімання, множення і ділення десяткових чисел немає, тому що розмірність таких чисел може бути довільною, крім того, виконання множення і ділення десяткових чисел є можливе лише в розпакованому форматі. Тому виконання арифметичних операцій виконується за допомогою команд двійкової арифметики, а потім проводиться корекція результату.

Корекція результату додавання десяткових чисел виконується після виконання командиADDабоADC. Як було показано раніше, неправильний результат може бути обумовлений двома причинами:

  • у результаті додавання отримали тетраду, двійковий еквівалент якої є більший ніж 9;

  • отримано перенесення до старшої тетради з вагою 16.

Корекція результату проводиться за результатами аналізу прапорців AFіCFрегістра ознак, які визначаються вмістом регістраAL, в якому розміщено суму.

DАА (Decimal Adjust for Addition) – команда десяткової корекції додавання BCD-чисел, які подано в упакованому виді.

Операндів у команди немає, тому що вона працює лише з регістром AL. Алгоритм корекції результату виконання попередньої команди додавання виконується за таким алгоритмом:

  • якщо прапорець AF= 1 або молодша тетрада регістраALмає значення, більше ніж 9, то до вмістуALдодається число 06;

  • якщо прапорець CF= 1 або старша тетрада регістраALмає значення, більше ніж 9, то до вмістуALдодається число 60;

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

Після виконання команди DААнеобхідно перевіряти значення прапорцяCFдля його урахування при роботі зі старшими розрядами десяткових цифр числа.

AAA (Ascii Adjust for Addition) – команда десяткової корекції додаванняBCD-чисел, які подано у розпакованому виді. Команда також працює лише з регістромAL. Алгоритм роботи:

  • якщо молодша тетрада регістра ALє припустима і значенняAF= 0, то необхідно обнулити старшу тетрадуAL;

  • якщо молодша тетрада регістра ALбільша 9 або значенняAF= 1, то необхідно додати 06 до вмісту регістраALі додати 1 до вмісту регістраAН;

  • обнулити старшу тетраду регістра AL;

  • установити прапорець CFу такий стан, в якому знаходитьсяAF.

Корекція результату віднімання десяткових чисел виконується після виконання командиSUBабоSBB. Корекція результату проводиться за результатами аналізу прапорцівAFіCFрегістра ознак, які визначаються вмістом регістраAL, в якому розміщено віднімання.

DAS (Decimal Adjust for Subtraction) – команда десяткової корекції після віднімання. Алгоритм роботи команди:

  • якщо прапорець AF= 1 або молодша тетрадаALмає вміст, більший ніж 9, то з вмістуALвіднімається 06;

  • якщо CF= 1 або старша тетрадаALмає вміст, більший ніж 9, то з вмістуALвіднімається 60.

AAS (Ascii Adjust after Subtraction) – команда десяткової корекції після віднімання BCD-чисел, які подано у розпакованому виді. Алгоритм роботи команди:

  • якщо молодша тетрада регістра ALприпустима іAF= 0, то обнулити старшу тетраду регістраAL;

  • якщо вміст молодшої тетради регістра ALне є припустимий абоAF= 1, то необхідно відняти число 06 із вмістуAL;

  • обнулити старшу тетраду регістра AL;

  • надати CFтакий же самий стан як іCF.

Корекція результатів множення виконується командою

AAM (Ascii Adjust after Multiply) – команда корекції результату множення двох розпакованихBCD-чисел і перетворення результату у вигляді двійкового числа, меншого 63Н(99D), у його розпакованийBCD-еквівалент.

Команда здійснює ділення вмісту регістра ALна десять (0АН) і завантажує частку у регістрАН, а залишок – у регістрAL. Стан прапорцівSF,ZF, PFвизначається вмістомAL, а стан прапорцівOF AF CFне є визначений.

Корекція результатів ділення проводиться до виконання ділення командою

AAD (Ascii Adjust before Division) – команда підготовки двох розпакованихBCD-чисел для ділення і перетворення двозначного розпакованого числа, меншого 63Н(99D), у двійковий еквівалент. Алгоритм роботи команди:

  • вміст регістра АНмножиться на 10Dі додається до вмісту регістраAL;

  • регістр АНобнулюється.

Виконується ділення числа у регістрі АХ за допомогою команди DIV.

До групи арифметичних команд також входять такі команди:

BSWAP (Byte SWAP) – команда перестановки байтів. Синтаксис команди

BSWAP src.

Операндом src(джерело) може бути лише 32-розрядний регістр загального призначення. Команда використовується для зміни порядку слідування байтів і переходу від однієї форми адресування до іншої (від форми «молодший байт за молодшою адресою» на звернену). Команда не змінює вміст регістра прапорців. Алгоритм роботи можливо пояснити за допомогою рис. 9.11.

Рисунок 9.11 – Алгоритм виконання команди BSWAP

XADD (eXchange and ADD) – обмін і додавання значень двох операндів. Команда має вигляд

XADD dst,src.

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

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

  • вміст операнда dst (приймач) копіюється в операндsrc(джерело);

  • виконується додавання вмісту операнда dst (приймач) до вмісту операндаsrc(джерело);

  • сума завантажується в операнд dst (приймач). Команда змінює усі прапорці результату.

CMP (CoMPare operands) – команда для порівняння двох операндів. Команда має вигляд

CMP dst,src.

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

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

Порівняння елементів рядків байтів, слів, подвійних слів відбувається в залежності від довжини елемента рядків за допомогою команд:

CMPS (CoMPare String) – команда для порівняння елементів двох рядків;

CMPSB (CoMPare String Byte) – команда для порівняння двох рядків байтів;

CMPSW (CoMPare String Word) – команда для порівняння двох рядків слів;

CMPSD (CoMPare String Double word operands) – команда для порівняння двох рядків подвійних слів.

Команда порівняння рядків має узагальнений вид

CMPS dst,src.

Команди CMPSB, CMPSW, CMPSDопереандів не мають.

Ці команди порівнюють елементи рядка-джерела довжиною байт, слово або подвійне слово, що знаходиться за адресою DS:SIз елементами рядка-приймача, адреса яких визначаються вмістом регістраES:DI.Зміна регістрів, які визначають адреси оперендів не дозволена.

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

Після віднімання вміст регістрів SIіDIавтоматично змінюється відповідно значення прапорцяDF. Якщо прапорецьDFдорівнює 0 (була виконана командаCLD), то вміст регістрівSIіDIзбільшується, якщоDFмає значення 1 (була виконана командаSTD), то вміст регістрівSIіDIзменшується. Збільшення/зменшення відбувається на 1, якщо пересилається байт, на 2, якщо пересилається слово, і на 4, якщо пересилається подвійне слово.

Команді може передувати префікс REP, який примушує виконувати порівняння, до поки вміст регістраСХне стане дорівнювати 0.

CMPXCHG (CoMPare and eXCHanGe) – команда для порівняння двох операндів і обміну даними між ними. Синтаксис команди

CMPXCHG dst,src.

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

Команда порівнює значення операндів, установлює значення прапорця ZF= 1, якщо операнди рівні абоZF= 0 в іншому випадку, після чого обмінює вміст операндів між собою.

SETcc (byte SET on condition) – команда установлення вмісту байта при виконанні певної умови. Команда має вигляд

SETcc src.

Операнд у цій команді 8-розрядний регістр або комірка пам’яті.

Команда виконує установлення вмісту операнда 01Н, якщо умова виконується, або у 00Н, якщо не виконується.

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

Сканування елементів рядка байтів, слів, подвійних слів відбувається в залежності від довжини елемента рядка за допомогою команд:

SCAS (SCAn String) – команда для сканування елементів рядка;

SCASB (SCAn String Byte) – команда для сканування елементів рядка байтів;

SCASW (SCAn String Word) – команда для сканування елементів рядка слів;

SCASD (SCAn String Double word) – команда для сканування елементів рядка подвійних слів;

Команда сканування елементів рядка має узагальнений вид

SCAS dst.

Команди CMPSB, CMPSW, CMPSDопереандів не мають.

Алгоритм виконання команди полягає у відніманні елемента рядка –операнда dst (приймач), який адресується тільки регістромES:DI, від вмісту акумулятораAL(байт),AX(слово),EAX(подвійне слово). Результат не формується, лише установлюються ознаки результату, які можливо аналізувати і робити висновки про співвідношення операндів між собою.

Після віднімання вміст регістра DIавтоматично змінюється відповідно значення прапорцяDF. Якщо прапорецьDFдорівнює 0 (була виконана командаCLD), то вміст регіструDIзбільшується, якщоDFмає значення 1 (була виконана командаSTD), то зменшується. Збільшення/зменшення відбувається на 1, якщо пересилається байт, на 2, якщо пересилається слово, і на 4, якщо пересилається подвійне слово.

Команді може передувати префікс REP, який примушує виконувати порівняння поки вміст регістраСХне стане дорівнювати 0.