Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

3. Цілі числа зі знаком

Ці числа також представляються у вигляді байта, слова й подвійного слова. У вигляді байта записуються числа від -128 до 127, у вигляді слова - числа від -32768 до 32767, а у вигляді подвійного слова - числа від -2147483648 до 2147483647. При цьому числа записуються в додатковому коді негативне число записується так само, як і без знакове число (тобто в прямому коді), а негативне число -x (x>0) представляється беззнаковим числом 2^8-x (для байтів), 2^16-x (для слів) або 2^32-x (для подвійних слів). Наприклад, додатковим кодом числа -6 являється байт FAh (=256-6), слово FFFAh або подвійне слово FFFFFFFAh. При цьому байт 10000000b (=80h) трактується як -128, а не як +128 (слово8000h розуміється як -32678), тому лівий біт додаткового коду завжди відіграє роль знакового: для ненегативних чисел він дорівнює 0, для негативних - 1.

Знакові числа розміром у слово й подвійне слово записуються в пам’яті в "переверненому" виді (при цьому знаковий біт виявляється в останнім байте осередку). Але в MASM ці числа, як і беззнакові, записуються в нормальній формі.

Іноді число-байт необхідно розширити до слова, тобто потрібно отримати таке ж по величині число, але розміром у слово. Існує два способу такого розширення - без знака й зі знаком. У кожному разі вихідне число-байт попадає в другий (до "перекидання") байт слова, а от перший байт заповнюється по-різному: при розширенні без знака у нього записуються нульові біти (12h -> 0012h), а при розширенні з знаком у перший байт записуються нулі, якщо число-байт було невід’ємним , і записується вісім двійкових одиниць у противному випадку (81h -> FF81h). Інакше кажучи, при розширенні зі знаком у першому байті слова копіюється знаковий розряд числа-байта.

Аналогічно відбувається розширення числа-слова до подвійного слова.

4. Особливості виконання арифметичних операцій

У ПК є команди додавання й вирахування цілих чисел розміром в слово й байт. Спеціальних команд для додавання й вирахування подвійних слів ні, ці операції реалізуються через команди додавання й вирахування слів.

Додавання й вирахування беззнакових чисел виробляється по модулі 2^8 для байтів й 2^16 для слів. Це означає, що якщо в результаті суми з'явилася одиниця переносу, що не вміщається в розрядну сітку, то вона відкидається. Наприклад, при додаванні байтів 128 й 130 виходить число 258 = 100000010b, тому ліва двійкова одиниця відкидається й залишається число 2 = 10b, що й оголошується результатом додавання.

Помилка тут не фіксується, але в прапор переносу CF записується 1 ."Піймати" таке перекручування суми можна тільки наступним аналізом прапора CF.

Перекручування результату відбувається й при вирахування з меншого числа більшого. І тут не фіксується помилка, однак першому числу дається "позика одиниці" (у випадку байтів це число збільшується на 256, для слів - на 2^16), після чого й виробляється вирахування. Наприклад, віднімання байтів 2 й 3 зводиться до вирахування чисел 256+2=258 й 3, у результаті чого виходить неправильна різниця 255 (а не -1). Для того щоб можна було виявити таку ситуацію, у прапор переносу CF залишиться 1 (якщо займу не було, в CF записується 0).

Додавання й вирахування знакових цілих чисел виробляється по тим ж алгоритмам, що й для беззнакових чисел (у цьому одне з достоїнств додаткового коду): знакові числа розглядаються як відповідающі беззнакові числа, проводиться операція над цими беззнаковими числами й отриманий результат інтерпретується як знакове число. Наприклад, додавання байтових чисел 1 й -2 відбувається так: беруться їх додаткові коди 1 й (256-2)=254, обчислюється сума цих величин 1+254=255 і вона трактується як знакове число -1 (255=256-1). Якщо при такому додаванні виникла одиниця переносу, то вона, як звичайно, відкидається, а прапор CF одержує значення 1. Однак у цьому випадку ця відсіч не становить інтерес - результат операції буде правильним, наприклад: 3+(-2) => 3+254(mod 256) = 257(mod 256) = 1. Зате тут можлива інша неприємність: модуль суми (її мантиса) може перевершити припустиму границю й "залізти" у знаковий розряд, зіпсувавши його. Наприклад, при додаванні байтовых чисел 127 й 2 виходить величина 129 = 100001001b, що представляє додатковий код числа -127 (=256-129).

Хоча результат тут вийшов і неправильним, процесор не фіксує помилку, але зате заносить 1 у прапор переповнення OF (якщо "переповнення мантиси" не було, в OF записується 0). Аналізуючи потім цей прапор, можна "піймати" таку помилку.

Таким чином, додавання (вирахування) знакових і беззнакових чисел виробляється по тому самому алгоритму. При цьому ПК не "знає", які числа (зі знаком або без) він складає; у кожному разі він складає їх як беззнакові числа й у кожному разі формує прапори CF й OF. А от як інтерпретувати доданки й суму, на який із цих прапорів звертати увагу - це особиста справа автора програми.

Що стосується множення й розподілу знакових і беззнакових чисел, то вони виконуються по різних алгоритмах, різними машинними командами. Однак й у цих операцій є ряд особливостей. При множенні байтів(слів) перший співмножник зобов'язаний перебувати в регістрі AL (AX), результатом множення є слово (подвійне слово), що залишиться в регістр AX (регістри DX й AX). Тим самим при множенні зберігаються всі цифри добутку. При розподілі байтів (слів) перший операнд (ділене) повинен бути словом (подвійним словом) і зобов'язаний перебувати у регістрі AX (регістрах DX й AX). Результатом розподілу є дві величини розміром у байт (слово) - неповна частка (div) і залишок від розподілу (mod); неповна частка записується в регістр AL (AX), а залишок - у регістр AH (DX).