Програмне забезпечення автоматизованих систем

Обсяг оперативної пам'яті комп’ютера, поняття та групи регістрів. Структура процесору та типи даних у ньому, представлення цілих чисел, символів, рядків, адрес. Особливості виконання арифметичних операцій. Загальна модель безпеки в Microsoft Windows NT.

Рубрика Программирование, компьютеры и кибернетика
Вид курс лекций
Язык украинский
Дата добавления 17.06.2010
Размер файла 9,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Міністерство освіти і науки України

Херсонський національний технічний університет

Кафедра інформаційних технологій

Конспект лекцій

з дисципліни "Системне програмування та операційні системи"

для студентів 3 курсу денної форми навчання

спеціальності 6.080403 -

"Програмне забезпечення автоматизованих систем"

Херсон, 2008

Конспект лекцій з дисципліни "Системне програмування та операційні системи" для студентів спеціальності 6.080403 "Програмне забезпечення автоматизованих систем". / А.А. Григорова, к. т. н., доцент, О.М. Ляшенко, викладач-стажер. - Херсон: Херсонський національний технічний університет, 2008. - с. 102.

Рецензентк.т.н., доцент. В.Й. Гнатюк

Затверджено

на засіданні кафедри

інформаційних технологій

Зав.каф Ходаков В.Є.

Відповідальний за випуск В.Є. Ходаков, д.т.н., професор, завідувач кафедри ІТ

Зміст

Лекція 1 Оперативна пам'ять, регістри, прапори

Лекція 2 Безумовні переходи. Умовні переходи. Команди керування циклом

Лекція 3-4 Типи даних у процесорі. Представлення цілих чисел. Знакові та беззнакові числа. Представлення символів та рядків. Кодування чисел. Арифметичні операції. Особливості виконання арифметичних операцій. Двоїчні арифметики. Представлення адрес. Директиви визначення даних

Лекція 5 Структура команд. Виконавчі адреси

Лекція 6 Сегментування

Лекція 7 Операції з рядками

Лекція 8 Стек

Лекція 9 Процедури

Лекція 10 Процеси і потоки

Лекція 11 Архітектура пам'яті в Win32 API

Лекція 12 Вікна

Лекція 13 Взаємодія процесів. Обмін даними між процесами. Синхронізація потоків

Лекція 14 Структурна обробка виключень

Лекція 15 Системний реєстр

Лекція 16 Робота з файлами

Лекція 17 Файлова структура NTFS

Лекція 18 Загальна модель безпеки в Microsoft Windows NT

Література

Лекція 1

Тема: Оперативна пам'ять, регістри, прапори

1. Оперативна пам'ять

Обсяг оперативної пам'яті ПК - 2^20 байтів (1 Мб). Байти нумеруються починаючи з 0, номер байта називається його адресою. Для посилань на байти пам'яті використаються 20 розрядні адреси: від 00000 до FFFFF (в 16-рич-ной системі).

Байт містить 8 розрядів (бітів), кожний з яких може приймати значення 1 або 0. Розряди нумеруються праворуч ліворуч від 0 до 7:

-і-і-і-і-і-і-і-і-

| | | | | | | | |

-і-і-і-і-і-і-і-і-

7 6 5 4 3 2 1 0

Байт - це найменша комірка пам'яті, що адресується. У ПК використаються й більші осередки - слова й подвійні слова. Слово - це два сусідніх байти, розмір слова - 16 бітів (вони нумеруються праворуч ліворуч від 0 до 15). Адресою слова вважається адреса його першого байта (з меншою адресою); ця адреса може бути парним і непарним. Подвійне слово - це будь-які чотири сусідніх байти (два сусідніх слова), розмір такого осередку 32 біта; адресою подвійного слова вважається адреса його першого байта.

Байти використаються для зберігання невеликих цілих чисел і символів, слова - для зберігання цілих чисел й адрес, подвійні слова - для зберігання "довгих" цілих чисел і т.зв. адресних пар (сегмент: зсув).

2. Регістри

Крім осередків оперативної пам'яті для зберігання даних (правда, короткочасного) можна використати й регістри - осередку, що входять до складу процесора й доступні з машинної програми. Доступ до регістрів здійснюється значно швидше, ніж до комірок пам'яті, тому використання регістрів помітно зменшує час виконання програм.

Всі регістри мають розмір слова (16 бітів), за кожним з них закріплене певне ім'я (AX, SP і т.п.). По призначенню й способу використання регістри можна розбити на наступні групи:

- регістри загального призначення (AX, BX, CX, DX, BP, SI, DI, SP);

- сегментні регістри (CS, DS, SS, ES);

- лічильник команд (IP);

- регістр прапорів (Flags).

(Розшифровка цих назв: A - accumulator, акумулятор; B - base, база; C - counter, лічильник; D - data, дані; BP - base pointer, покажчик бази; SI - source index, індекс джерела; DI - destination index, індекс приймача; SP - stack pointer, покажчик стека; CS - code segment, сегмент команд; DS - data segment, сегмент даних; SS - stack segment, сегмент стека; ES - extra segment, додатковий сегмент, IP - instruction pointer, лічильник команд.)

Регістри загального призначення можна використати у всіх арифметичних і логічних командах. У той же час кожен з них має певну спеціалізацію (деякі команди "працюють" тільки з певними регістрами). Наприклад, команди множення й розподілу вимагають, щоб один з операндів перебував у регістрі AX або в регістрах AX й DX (залежно від розміру операнда), а команди керування циклом використають регістр CX як лічильник циклу. Регістри BX й BP дуже часто використаються як базові регістри, а SI й DI - як індексні. Регістр SP звичайно вказує на вершину стека, апаратно підтримуваного в ПК.

Регістри AX, BX, CX й DX конструктивно влаштовані так, що можливо незалежний доступ до їх старшої й молодшої половин; можна сказати, що кожний із цих регістрів складається із двох байтових регістрів, позначуваних AH, AL, BH і т.д. (H - high, старший; L - low, молодший):

-і-і-і-і-і- -і-і-і-і-і- -і-і-і-і-і- -і-і-і-і-і-

AX | AH | AL | BX | BH | BL | CX | CH | CL | DX | DH | DL |

-і-і-і-і-і- -і-і-і-і-і- -і-і-і-і-і- -і-і-і-і-і-

15 8 7 0

Таким чином, з кожним із цих регістрів можна працювати як з єдиним цілим, а можна працювати й з його "половинками". Наприклад, можна записати слово в AX, а потім уважати тільки частина слова з регістра AH або замінити тільки частина в регістрі AL і т.д. Такий пристрій регістрів дозволяє використати їх для роботи й із числами, і із символами.

Всі інші регістри не діляться на "половинки", тому вважати або записати їхній уміст (16 бітів) можна тільки цілком.

Сегментні регістри CS, DS, SS й ES не можуть бути операндами ніяких команд, крім команд пересилання й стекових команд. Ці регістри використаються тільки для сегментування адрес (див. 1.4).

Лічильник команд IP завжди містить адреса (зсув від початку програми) тієї команди, що повинна бути виконана наступної (початок програми зберігається в регістрі CS). Уміст регістра IP можна змінити тільки командами переходу.

3. Прапори

І, нарешті, у ПК є особливий регістр прапорів. Прапор - це біт, що приймає значення 1 ("прапор установлений"), якщо виконано деяку умову, і значення 0 ("прапор скинутий") у противному випадку. У ПК використовується 9 прапорів, кожному з них привласнене певне ім'я (ZF, CF і т.д.). Всі вони зібрані в регістрі прапорів (кожен прапор - це один з розрядів регістра, частина його розрядів не використається):

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

Flags | x| x| x| x|OF|DF|IF|TF|SF|ZF| x|AF| x|PF| x|CF|

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Деякі прапори прийнятий називати прапорами умов; вони автоматично міняються при виконанні команд і фіксують ті або інші властивості їхнього результату (наприклад, чи рівний він нулю). Інші прапори називаються прапорами станів; вони міняються із програми й впливають на подальше поводження процесора (наприклад, блокують переривання).

Прапори умов:

CF (carry flag) - прапор переносу. Приймає значення 1, якщо при додаванні цілих чисел з'явилася одиниця переносу, не "вміщаєма" у розрядну сітку, або якщо при вирахуванні чисел без знака перше з них було менше другого. У командах зрушення в CF заноситься біт, що вийшов за розрядну сітку. CF фіксує також особливості команди множення.

OF (overflow flag) - прапор переповнення. Установлюється в 1, якщо при додаванні або вирахуванні цілих чисел зі знаком вийшов результат, по модулі переважаючу припустиму величину (відбулося переповнення мантиси й вона "залізла" у знаковий розряд).

ZF (zero flag) - прапор нуля. Установлюється в 1, якщо результат команди виявився рівним 0.

SF (sign flag) - прапор знака. Установлюється в 1, якщо в операції над знаковими числами вийшов негативний результат.

PF (parity flag) - прапор парності. Дорівнює 1, якщо результат чергової команди містить парна кількість двійкових одиниць. Ураховується звичайно тільки при операціях вводу-висновку.

AF (auxiliary carry flag) - прапор додаткового переносу. Фіксує особливості виконання операцій над двоїчно-десятковими числами.

Прапори станів:

DF (direction flag) - прапор напрямку. Установлює напрямок перегляду рядків у строкових командах: при DF=0 рядки проглядаються "уперед" (від початку до кінця), при DF=1 - у зворотному напрямку.

IF (interrupt flag) - прапор переривань. При IF=0 процесор перестає реагувати на вступників до нього переривання, при IF=1 блокування переривань знімається.

TF (trap flag) - прапор трасування. При TF=1 після виконання кожної команди процесор робить переривання (з номером 1), чим можна скористатися при налагодженні програми для її трасування.

Лекція 2

Тема: Безумовні переходи. Умовні переходи. Команди керування циклом

1. Переходи

У систему команд ПК входить звичайний для ЕОМ набір команд переходу: безумовні й умовні переходи, переходи з поверненнями й ін.

Абсолютна адреса команди, що повинна бути виконана наступної, визначається парою CS:IP, тому виконання переходу означає зміну цих регістрів, обох або тільки одного (IP). Якщо змінюється тільки лічильник команд IP, те такий перехід називається всередині сегментним або близьким (керування залишається в тім же сегменті команд), а якщо міняються обидва регістри CS й IP, то це міжсегментний або далекий перехід (починають виконуватися команди з іншого сегмента команд). По способу зміни лічильника команд переходи діляться на абсолютні й відносні. Якщо в команді переходу зазначена адреса (зсув) тієї команди, якій потрібно передати керування, то це абсолютний перехід. Однак в команді може бути зазначена величина (зрушення), яку треба додати до поточного значення регістра IP, щоб вийшла адреса переходу, і тоді це буде відносний перехід; при цьому зрушення може бути додатковим і негативним, так що можливо перехід вперед та назад. По величині зрушення відносні переходи діляться на короткі (зрушення задається байтом) і довгі (зрушення - слово). Абсолютні ж переходи діляться на прямі й непрямі: при прямому переході адреса переходу задається в самій команді, а при непрямому - у команді вказується регістр або ділянка пам'яті, у якому (якої) перебуває адреса переходу.

2. Безумовні переходи

В MASM всі команди безумовного переходу позначаються однаково:

JMP op

але залежно від типу операнда, асемблер формує різні машинні команди.

1) Внутрісегментний відносний короткий перехід.

JMP i8 (IP:=IP+i8)

Тут i8 позначає безпосередній операнд розмірів у байт, що інтерпретується як знакове ціле від -128 до 127. Команда додає це число до поточного значення регістра IP, одержуючи в ньому адреса (зміщення) тієї команди, що повинна бути виконана наступної. Регістр CS при цьому не міняється.

Необхідно враховувати наступну особливість регістра IP. Виконання будь-якої команди починається з того, що в IP заноситься адреса наступної за їй команди, і тільки потім виконується властиво команда. Для команди відносного переходу це означає, що операнд i8 додається не до адреси цієї команди, а до адреси команди, що випливає за нею, тому, приміром, команда JMP 0 - це перехід на наступну команду програми.

При написанні машинної програми зрушення для відносних переходів доводиться обчислювати вручну, однак MASM рятує від цього неприємного заняття: в MASM у командах відносного переходу завжди указується мітка тієї команди, на яку треба передати керування, і асемблер сам обчислює зрушення, що він і записує в машинну команду. Звідси слідує, що в MASM команда переходу по мітці приймається не як абсолютний перехід, а як відносний.

По короткому переході можна передати керування тільки на ближчі команди програми - віддалені від команди, що випливає за командою переходу, до 128 байтів назад або до 127 байтів уперед. Для переходу на більше далекі команди використається

2) Внутрісегментний відносний довгий перехід.

JMP i16 (IP:=IP+i16)

Тут i16 позначає безпосередній операнд розміром у слово, який розглядається як знакове ціле від -32768 до 32767. Цей періхід аналогічний короткому переходу.

Відзначимо, що, зустрівши команду переходу з міткою, якою була помічена одна з попередніх (по тексту) команд програми, асемблер вираховує різницю між адресою цієї мітки й адресою команди переходу й по цьому зрушенню визначає, яку машинну команду відносного переходу - коротку або довгу - треба сформувати. Але якщо мітка ще не зустрічалася в тексті програми, тобто робиться перехід уперед, тоді асемблер, не знаючи ще адреси мітки, не може визначити, яку саме машинну команду відносного переходу формувати, тому він на усякий випадок вибирає команду довгого переходу. Однак ця машинна команда займає 3 байти, тоді як команда короткого переходу - 2 байта, і якщо автор програми на MASM прагне до економії пам'яті й знає заздалегідь, що перехід уперед буде на близьку мітку, то він повинен сповістити про це асемблеру, щоб той сформував команду короткого переходу. Така вказівка робиться за допомогою оператора SHORT:

JMP SHORT L

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

3) Внутрісегментний абсолютний непрямий перехід.

JMP r16 (IP:=[r]) або

JMP m16 (IP:=[m16])

Тут r16 позначає будь-який 16-бітовий регістр загального призначення, а m16 - адреса слова пам'яті. У цьому регістрі (слові пам'яті) повинен перебувати адреса, по якому й буде зроблений перехід. Наприклад, по команді JMP BX відбувається перехід за адресою, що перебуває в регістрі BX.

4) Міжсегментний абсолютний прямий перехід.

JMP seg:ofs (CS:=seg, IP:=ofs)

Тут seg - початок (перші 16 бітів початкової адреси) деякого сегмента пам'яті, а ofs - зсув у цьому сегменті. Пари seg:ofs визначають абсолютну адресу, по якій робиться перехід. В MASM ця пара завжди задається конструкцією FAR PTR <мітка>, що "говорить", що треба зробити перехід по зазначеній мітці, причому ця мітка - "далека", з іншого сегмента. Відзначимо, що асемблер сам визначає, який це

сегмент, і сам підставляє в машинну команду його початок, тобто seg.

5) Міжсегментний абсолютний непрямий перехід.

JMP m32 (CS:=[m32+2], IP:=[m32])

Тут під m32 розуміється адреса подвійного слова пам'яті, у якому знаходяться пари seg:ofs, що задає абсолютну адресу, по якому дана команда повинна виконати перехід. Нагадаємо, що в ПК величини розміром в подвійне слово зберігаються в "переверненому" виді, тому зсув ofs знаходиться в першому слові подвійного слова m32, а зсув seg - у другому слові (за адресою m32+2).

Команди міжсегментного переходу використаються тоді, коли команди програми розміщені не в одному сегменті пам'яті, а в декількох (наприклад, команд настільки багато, що в сукупності вони займають більше 64Кб, т.е. більше максимального розміру сегмента пам'яті). При переході з одного такого сегмента в інший необхідно міняти не тільки лічильник команд IP, але й уміст регістра CS, завантажуючи в останній початковий адреса другого сегмента. Така одночасна зміна обох цих регістрів і роблять команди міжсегментного переходу.

При записі в MASM команд переходу варто враховувати, що вони можуть сприйматися неоднозначно. Скажемо, як сприймати команду

JMP A

- як перехід по мітці A або як перехід за адресою, що зберігається в осередку з ім'ям A? Крім того, який це перехід - внутрісегментний або міжсегментний? Відповідь залежить від того, як описане ім'я A, і від того, коли описане ім'я A - до або після команди переходу. Нехай A описано до команди переходу ("посилання назад"). Якщо ім'ям а позначена деяка команда поточного сегмента команда (тобто A - позначка), тоді асемблер формує машинну команду внутрісегментного відносного переходу. Якщо ж A - ім'я змінної, тоді асемблер формує машинну команду непрямого переходу - внутрісегментного, якщо A описано в директиві DW, або міжсегментного, якщо A описано в директиві DD.

У випадку ж, якщо ім'я A описане після команди переходу ("посилання уперед"), асемблер завжди формує машинну команду внутрісегментного відносного довгого переходу. З обліком цього ім'я A обов'язково повинне мітити команду з поточного сегмента команд, інакше буде зафіксована помилка. Якщо таке трактування посилання вперед не задовольняє автора програми, тоді він зобов'язаний за допомогою оператора SHORT або PTR уточнити тип імені A:

JMP SHORT A ;внутрісегментний короткий перехід по мітці

JMP WORD PTR A ;внутрісегментний непрямий перехід

JMP DWORD PTE A ;міжсегментний непрямий перехід

Відзначимо, що перехід по мітці A з іншого сегмента команд завжди повинен указуватися за допомогою FAR PTR (незалежно від того, описана позначка A до або після команди переходу):

JMP FAR PTR A; міжсегментний перехід по мітці.

3. Умовні переходи

Практично у всіх командах умовного переходу перевіряється значення того або іншого прапора (наприклад, прапора нуля ZF) і, якщо він має певне значення, виконується перехід за адресою, зазначеному в команді. Значення прапора повинне бути встановлене попередньою командою, наприклад, командою порівняння

CMP op1,op2,

яка обчислює різницю op1-op2, однак результат нікуди не записує, а тільки міняє прапори, на які й буде реагувати команда умовного переходу.

В MASM команди умовного переходу мають наступну форму: Jxx op,

де xx - одна або кілька букв, у скороченому виді відображаюча провіряєма умова (звичайно в припущенні, що перед цією командою находиться команда порівняння). Приклади деяких мнемонік:

JE - перехід "по дорівнює" (jump if equal);

JL - перехід "по менше" (jump if less);

JNL - перехід "по неменше" (jump if not less).

Особливістю всіх машинних команд умовного переходу є те, що вони реалізують внутрісегментний відносний короткий перехід, т.е. додають до лічильника команд IP свій операнд, розглянутий як знакове число від -128 до 127. В MASM цей операнд завжди повинен записуватися як мітка, що асемблер замінить на відповідне зрушення.

Така особливість команд умовного переходу викликає незручність при переходах на "далекі" команди. Наприклад, якщо треба зробити перехід при A<B на команду, позначену міткою L і розташовану далеко від команди переходу, то доводиться використати команду довгого безумовного переходу:

MOV AX,A

CMP AX,B ;порівняння A й B

JNL M ;не менше -і> M (обхід команди JMP)

JMP L ;менше -і> L (довгий перехід)

M: ...

4. Команди керування циклом

У ПК є кілька команд, що спрощують програмування циклів з заздалегідь відомим числом повторень. Застосування цих команд вимагає, щоб до початку циклу в регістр CX було занесене число кроків циклу. Самі команди розміщаються наприкінці циклу, вони зменшують значення CX на 1 і, якщо CX ще не дорівнює 0, передають керування на початок циклу. Наприклад, знайти S - суму елементів масиву X з 10 чисел-слів можна так:

MOV AX,0; початкове значення суми (накопичується в AX)

MOV SI,0; початкове значення індексного регістра

MOV CX,10; число повторень циклу

L: ADD AX,X[SI] ;AX:=AX+X[i]

ADD SI,2; SI:=SI+2

LOOP L ; CX:=CX-1; if CX<>0 then goto L

MOV S,AX; S:=AX

Крім команди LOOP є ще дві "циклічні" команди - LOOPZ й LOOPNZ (вони мають синонимічні назви LOOPE й LOOPNE), яких крім регістра CX перевіряють ще й прапор нуля ZF; наприклад, команда LOOPZ "виходить" із циклу, якщо CX=0 або ZF=1. Цю команду можна, наприклад, використати при пошуку в масиві першого нульового елемента, де повинне бути передбачено дві умови виходу із циклу: або буде знайдений нулевий елемент (ZF=1, якщо перед LOOPZ поставити команду порівняння наступного елемента з 0), або буде вичерпаний весь масив (CX=0)

Відзначимо, що всі ці "циклічні" команди реалізують короткий відносний перехід, як і команди умовного переходу, тому їх можна використати тільки для циклів з невеликим числом команд.

В MASM є ще дві команди переходу - CALL (перехід з поверненням) і RET (повернення з підпрограми).

Лекція 3-4

Тема: Типи даних у процесорі. Представлення цілих чисел. Знакові та беззнакові числа. Представлення символів та рядків. Кодування чисел. Арифметичні операції. Особливості виконання арифметичних операцій. Двоїчні арифметики. Представлення адрес. Директиви визначення даних

1. Подання даних арифметичні операції

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

Шістнадцятирічні числа записуються з буквою h на кінці, двійкові числа - з буквою b (так прийняте в MASM).

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

У ПК робиться розходження між цілими числами без знака (невід'ємними) і зі знаком. Це порозумівається тим, що в осередках одного й того ж розміру можна представити більший діапазон без знакових чисел, чим ненегативних знакових чисел, і якщо відомо заздалегідь, що деяка числова величина є ненегативної, те вигідніше розглядувати її як беззнакову, чим як знакову.

2. Цілі числа без знака

Ці числа можуть бути представлені у вигляді байта, слова або подвійного слова - залежно від їхнього розміру. У вигляді байта представляються цілі від 0 до 255 (=2^8-1), у вигляді слова - цілі від 0 до 65535 (=2^16-1), в виді подвійного слова - цілі від 0 до 4 294 967 295 (=2^32-1). Числа записуються у двійковій системі числення, займаючи всі розряди осередку.

Наприклад, число 130 записується у вигляді байта 10000010b (82h).

Числа розміром у слово зберігаються в пам'яті в "переверненому" виді: молодші (праві) 8 бітів числа розміщаються в першому байті слова, а старші 8 бітів - у другому байті (в 16-ричной системі: дві праві цифри - у першому байті, дві ліві цифри - у другому байті).

Наприклад, число 130 (=0082h) у вигляді слова зберігається в пам'яті так:

-і-і-і-і-і-

| 82 | 00 |

-і-і-і-і-і-

(Відзначимо, однак, що в регістрах числа зберігаються в нормальному виді:

-і-і-і-і-і-

AX | 00 | 82 |

-і-і-і-і-і-

AH AL )

"Перевернене" подання використається й при зберіганні в пам'яті цілих чисел розміром у подвійне слово: у першому його байті розміщаються молодші 8 бітів числа, у другому байті - попередні 8 бітів і т.д. Наприклад, число 12345678h зберігається в пам'яті так:

-і-і-і-і-і-і-і-і-і-і-

| 78 | 56 | 34 | 12 |

-і-і-і-і-і-і-і-і-і-і-

Інакше кажучи, у першому слові подвійного слова розміщаються молодші(праві) 16 бітів числа, а в другому слові - старші 16 бітів, причому у кожному із цих двох слів у свою чергу використається "перевернене" подання.

Таке незвичайне подання чисел порозумівається тим, що в перших моделях ПК за раз можна було вважати з пам'яті тільки один байт і що всі арифметичні операції над багатозначними числами починаються з дій над молодшими цифрами, тому з пам'яті в першу чергу треба зчитувати молодші цифри, якщо відразу не можна вважати всі цифри. З огляду на це, у перших ПК і стали розміщати молодші цифри числа перед старшими цифрами, а заради наступності таке подання чисел зберегли в

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

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).

5. Подання символів і рядків

На символ приділяється один байт пам'яті, у який записується код символу - ціле від 0 до 255. У ПК використається система кодування ASCII(American Standard Code for Information Interchange). Вона, звичайно, не містить кодів російських букв, тому в нашій країні застосовується деякий варіант цієї системи з російськими буквами (звичайно це альтернативне кодування ГОСТа).

Деякі особливості цих систем кодування:

- код пробілу менше коду будь-якої букви, цифри й взагалі кожного графічно представлення символу;

- коди цифр упорядковані по величині цифр і не містять пропусків, т.е. з нерівності код ('0')<=код(c)<=код('9') треба, що c - цифра;

- коди більших латинських букв упорядковані відповідно до алфавіту й не мають пропусків; аналогічно з малими латинськими буквами;

- (в альтернативному кодуванні ГОСТа) коди російських букв (як більших, так і малих) упорядковані відповідно до алфавіту, але між ними є коди інших символів.

Рядок (послідовність символів) розміщається в сусідніх байтах пам'яті (у не переверненому виді): код першого символу рядка записується в першому байті, код другого символу - у другому байті й т.п. Адресою рядка вважається адреса її першого байта.

У ПК рядком уважається також і послідовність слів (звичайно це послідовність цілих чисел). Елементи таких рядків розташовуються в послідовних комірках пам'яті, але кожен елемент представлений в "перевернутому" виді.

6. Подання адрес

Адреса - це порядковий номер комірки пам'яті, тобто ненегативне ціле число, тому в загальному випадку адреси представляються так само, як і беззнакові числа. Однак у ПК є ряд особливостей у поданні адрес.

Справа в тому, що в ПК терміном "адресу" позначають різні речі. Часто під адресою розуміється 16-бітовий зсув (offset) адреса осередку, відлічений від початку сегмента (області) пам'яті, якому належить цей осередок. У цьому випадку під адресу приділяється слово пам'яті, причому адрес записується в "переверненому" виді (як і числа-слова взагалі).

В іншому випадку під "адресою" розуміється 20-бітове абсолютне адрес деякої комірки пам'яті. У силу ряду причин у ПК такий адрес задається не як 20-бітове число, а як пари "сегмент : зсув", де "сегмент" (segment) - це перші 16 бітів початкової адреси сегмента памя'ти, якому належить осередок, а "зсув" - 16-бітова адреса цього осередку, відлічений від початку даного сегмента пам'яті (величина 16*сегмент+зсув дає абсолютний адреса осередку). Такі пари записуються у вигляді подвійного слова, причому (як і для чисел) в "перевернутім" виді: у першому слові розміщається зсув, а в другому - сегмент, причому кожне із цих слів у свою чергу представлене в "перевернутім" виді. Наприклад, пари 1234h:5678h буде записана так:

-і-і-і-і-і-і-і-і-і-і-

| 78 | 56 | 34 | 12 |

-і-і-і-і-і-і-і-і-і-і-

зсув сегмент

7. Директиви визначення даних

Для того щоб у програмі на MASM зарезервувати комірки пам'яті під константи й змінні, необхідно скористатися директивами розпізнавання даних - з назвами DB (описує дані розміром у байт), DW (розміром у слово) і DD (розміром у подвійне слово). (Директиви, або команди асемблеру, - це пропозиції програми, якій її автор повідомляє якусь інформацію асемблеру або просить щось зробити додатково, крім перекладу символьних команд на машинну мову.)

У найпростішому випадку в директиві DB, DW або DD описується одна константа, який дається ім'я для наступних посилань на неї. По цієї директиві асемблер формує машинне подання константи (якщо треба, "перевертає" її) і записує в чергову ділянку пам'яті. Адреса цього осередку стає значенням імені: всі входження імені в програму асемблер буде заміняти на цю адресу. Імена, указані в директивах DB, DW й DD, називаються іменами змінних (на відміну від міток - імен команд).

В MASM числа записуються в нормальному (непереверненому) виді в системах числення з підставою 10, 16, 8 або 2. Десяткові числа записуються як звичайно, за шістнадцятирічним числом ставиться буква h (якщо число починається з "цифри" A, B, ..., F, те спочатку обов'язковий 0),за восьмирічним числом - буква q або o, за двійковим числом - буква b.

Приклади:

A DB 162 ;описати константа-байт 162 і дати їй ім'я A

B DB 0A2h ;така ж константа, але з ім'ям B

З DW -1 ;константа-слово -1 з ім'ям З

D DW 0FFFFh ;така ж константа-слово, але з ім'ям D

E DD -1 ;-1 як подвійне слово

Константи-символи описуються в директиві DB подвійно: указується або код символу (ціле від 0 до 255), або сам символ у лапках (одинарних або подвійних); в останньому випадку асемблер сам замінить символ на його код. Наприклад, що випливають директиви еквівалентні (2A - код зірочки в ASCII):

CH DB 02Ah

CH DB '*'

CH DB "*"

Константи-адреси, як правило, задаються іменами. Так, по директиві

ADR DW CH

буде відведене слово пам'яті, якому дається ім'я ADR й у яке запишеться адреса (зсув), що відповідає імені CH. Якщо таке ж ім'я описати в директиві DD, те асемблер автоматично додасть до зсуву імені його сегмент і запише зсув у першу половину подвійного слова, а сегмент - у другу половину.

По кожній з директив DB, DW й DD можна описати змінну, тобто відвести осередок, не давши їй початкового значення. У цьому випадку в правої частини директиви вказується знак питання:

F DW ? - відвести слово й дати йому ім'я F, нічого в цей байт не записувати.

В одній директиві можна описати відразу кілька констант й/або перемінних того самого розміру, для чого їх треба перелічити через кому. Вони розміщаються в сусідніх комірках пам'яті. Приклад:

G DB 200, -5, 10h, ?, 'F'

Ім'я, зазначене в директиві, вважається як іменним першу з констант.

Для посилань на інші в MASM використаються вираження виду <ім'я> + <ціле>; наприклад, для доступу до байта із числом -5 треба вказати вираження G+1, для доступу до байта з 10h - вираження G+2 і т.д.

Якщо в директиві DB перераховані тільки символи, наприклад:

S DB 'a','+','b',

тоді цю директиву можна записати коротше, уклавши всі ці символи в одні лапки:

S DB 'a+b'

І, нарешті, якщо в директиві описується трохи однакових констант (змінних), те можна скористатися конструкцією повторення

k DUP(a,b,...,c)

яка еквівалентна повтореної k раз послідовності a,b,...,c.

Наприклад, директиви

V1 DB 0,0,0,0,0

V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2

можна записати більш коротко в такий спосіб:

V1 DB 5 DUP(0)

V2 DW 9 DUP(?), 'a', 4 DUP(1,2)

Лекція 5

Тема: Структура команд. Виконавчі адреси

1. Структура команд. Виконавчі адреси

Машинні команди ПК займають від 1 до 6 байтів. Код операції (КІП) займає один або два перших байти команди. В ПК настільки багато різних операцій, що для них не вистачає 256 різних Копів, які можна представити в одному байті. Тому деякі операції поєднуються в групу і їм дається той самий КІП, у другому ж байте цей КІП уточнюється. Крім того, у другому байті указується типи й спосіб адресації операндів. Інші байти команди указують на операнди.

Команди можуть мати від 0 до 3 операндів, у більшості команд - один або два операнда. Розмір операндів - байт або слово (рідко - подвійне слово). Операнд може бути зазначений у самій команді (це т.зв. безпосередній операнд), або може перебувати в одному з регістрів ПК і тоді в команді вказується цей регістр, або може перебувати в комірці пам'яті й тоді в команді тим або іншому способу вказується адрес цього осередку. Деякі команди вимагають, щоб операнд перебував в фіксованому місці (наприклад, у регістрі AX), тоді операнд явно не указується в команді. Результат виконання команди міститься в регістр або комірку пам'яті, з якого (якої), як правило, береться перший операнд. Наприклад, більшість команд із двома операндами здійснюють дію

op1 := op1 _ op2,

де op1 - регістр або осередок, а op2 - безпосередній операнд, регістр або осередок.

Адреса операнда дозволена модифікувати по одному або двох регістрам. У першому випадку як регістр-модифікатор можливо використовувати регістр BX, BP, SI або DI (і ніякий інший). У другому випадку один з модифікаторів зобов'язаний бути регістром BX або BP, а іншої - регістром SI або DI; одночасна модифікація по BX й BP або SI й DI неприпустима. Регістри BX й BP звичайно використаються для зберігання бази (початкової адреси) деякої ділянки пам'яті (скажемо, масиву) і тому називаються базовими регістрами, а регістри SI й DI часто містять індекси елементів масиву й тому називаються індексними регістрами.

Однак такий розподіл ролей необов'язково, і, наприклад, в SI може перебувати база масиву, а в BX - індекс елемента масиву.

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

A, A[M] або A[M1][M2],

де A - адреса, M - регістр BX, BP, SI або DI, M1 - регістр BX або BP, а M2 - регістр SI або DI. У другому і третьому варіанті A може не бути, у цьому випадку вважається, що A=0.

При виконанні команди процесор насамперед обчислює т.зв. виконавча (ефективна) адреса - як суму адреси, заданого в команді, і поточних значень зазначених регістрів модифікаторів, причому всі ці величини розглядаються як ненегативні й підсумовування ведеться по модулі 2^16 ([r] означає вміст регістра r):

A : Aисп = A

A[M] : Aисп = A+[M] (mod 2^16)

A[M1][M2]: Aисп = A+[M1]+[M2] (mod 2^16)

Отриманий у такий спосіб 16-розрядна адреса визначає т.зв. зміщення - адреса, відлічена від початку деякого сегмента (області) пам'яті. Перед звертанням до пам'яті процесор ще додає до зсуву початкового адреса цього сегмента (він зберігається в деякому сегментному регістру), у результаті чого виходить остаточне 20-розрядне адрес, по якому й відбувається реальне звертання до пам'яті (див. 1.4).

2. Формати команд

У ПК формати машинних команд досить різноманітні. Для приклада приведемо лише основні формати команд із двома операндами.

1) Формат "регістр-регістр" (2байти):

-і-і-і-і-і-і- -і-і-і-і-і-і-і-і

| КІП |d|w| | 11 |reg1|reg2|

-і-і-і-і-і-і- -і-і-і-і-і-і-і-і

7 2 1 0 7 6 5 3 2 0

Команди цього формату описують звичайно дія reg1:=reg1_ reg2 або

reg2:=reg2_ reg1. Поле КІП першого байта вказує на операцію (_ ), яку треба виконати. Біт w визначає розмір операндів, а біт d указує, у який з регістрів записується результат:

w = 1 - слова d = 1 - reg1:=reg1_ reg2

= 0 - байти = 0 - reg2:=reg2_ reg1

У другому байті два лівих біти фіксовані (для даного формату), а трехбітові поля reg1 й reg2 указують на регістри, що беруть участь в операції, відповідно до наступної таблиці:

reg w=1 w=0 reg w=1 w=0

-і-і-і-і-і-і-і-і- -і-і-і-і-і-і-і-і-

000 AX AL 100 SP AH

001 CX CL 101 BP CH

010 DX DL 110 SI DH

011 BX BL 111 DI BH

2) Формат "регістр-пам'ять" (2-4 байта):

-і-і-і-і-і-і- -і-і-і-і-і-і- -і-і-і-і-і-і-і-і-і-

| КІП |d|w| |mod|reg|mem| |адрес (0-2 байта)|

-і-і-і-і-і-і- -і-і-і-і-і-і- -і-і-і-і-і-і-і-і-і-

Ці команди описують операції reg:=reg_ mem або mem:=mem_ reg. Біт w першого байта визначає розмір операндов (див. вище), а біт d указує, куди записується результат: у регістр (d=1) або в комірку пам'яті (d=0). Трехбітове поле reg другого байта вказує операнд - регістр, двухбітове поле mod визначає, скільки байтів у команді займає операнд - адрес (00 - 0 байтів, 01 - 1 байт, 10 - 2 байти), а трехбітове поле mem указує спосіб модифікації цієї адреси. У наступній таблиці, що дує, зазначені правила обчислення виконавчої адреси в залежності від значень полів mod й mem (a8 - адреса розміром у байт, a16 - адреса розміром у слово):

mem \ mod | 00 01 10

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

000 | [BX]+[SI] [BX]+[SI]+a8 [BX]+[SI]+a16

001 | [BX]+[DI] [BX]+[DI]+a8 [BX]+[DI]+a16

010 | [BP]+[SI] [BP]+[SI]+a8 [BP]+[SI]+a16

011 | [BP]+[DI] [BP]+[DI]+a8 [BP]+[DI]+a16

100 | [SI] [SI]+a8 [SI]+a16

101 | [DI] [DI]+a8 [DI]+a16

110 | a16 [BP]+a8 [BP]+a16

111 | [BX] [BX]+a8 [BX]+a16

Зауваження. Якщо в команді не заданий адреса, то він уважається нульовим. Якщо адреса задана у вигляді байта (a8), то він автоматично розширюється з знаком до слова (a16). Випадок mod=00 й mem=110 указує на відсутність регістрів-модифікаторів, при цьому адреса повинна мати розмір слова (адресне вираження [BP] асемблер транслює в mod=01 й mem=110 при a8=0). Випадок mod=11 відповідає формату "регістр-регістр".

3) Формат "регістр^ - безпосередній операнд" (3-4 байта):

-і-і-і-і-і- -і-і-і-і-і-і- -і-і-і-і-і-і-і-і-і-і-і-і-і

| КІП |s|w| |11|КОП"|reg| |непосред.операнд (1-2 б)|

-і-і-і-і-і- -і-і-і-і-і-і- -і-і-і-і-і-і-і-і-і-і-і-і-і

Команди цього формату описують операції reg:=reg_ immed . Біт w указує на розмір операндов, а поле reg - на регістр- операнд (див. вище). Поле КІП у першому байті визначає лише клас операції (наприклад, клас додавання), уточнює ж операцію поле КІП" із другого байта. Безпосередній операнд може займати 1 або 2 байти - залежно від значення біта w, при цьому операнд - слово записується в команді в "переверненому" виді. Заради економії пам'яті в ПК передбачений випадок, коли в операції над словами непосредствений операнд може бути заданий байтом (на цей випадок указує 1 у біті s при w=1), і тоді перед виконанням операції байт автоматично розширюється (зі знаком) до слова.

4) Формат "пам'ять^- безпосередній операнд" (3-6 байтів):

-і-і-і-і-і- -і-і-і-і-і-і-і -і-і-і-і-і-і-і -і-і-і-і-і-і-і-і-і

| КІП |s|w| |mod|коп"|mem| |адрес (0-2б)| |непоср.оп (1-2б)|

-і-і-і-і-і- -і-і-і-і-і-і-і -і-і-і-і-і-і-і -і-і-і-і-і-і-і-і-і

Команди цього формату описують операції типу mem:=mem_ immed. Зміст всіх полів - той же, що й у попередніх форматах.

Крім розглянутих у ПК використаються й інші формати команди з двома операндами; так, передбачений спеціальний формат для команд, один з операндов яких фіксований (звичайно це регістр AX). Мають свої формати й команди з іншим числом операндів.

3. Запис команд в MASM

Зі сказаного ясно, що та сама операція залежно від типів операдов записується у вигляді різних машинних команд: наприклад, у ПК є 28 команд пересилання байтів і слів. У той же час в MASM всі ці "родинні" команди записуються одноманітно: наприклад, всі команди пересилання мають ту саму символьну форму запису:

MOV op1,op2 (op1:=op2)

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

У загальному випадку команди записуються в MASM у такий спосіб:

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

Мітка із двокрапкою, а також крапка з коми й коментар можуть бути відсутні. Мітка відіграє роль імені команди, її можна використати в командах переходу на дану команду. Коментар не впливає на зміст команди, а лише пояснює її.

Мнемонічні назви операцій повністю перераховані в главі 2.

Операнди, якщо є, перераховуються через кому. Основні правила запису операндів наступні.

Регістри вказуються своїми іменами, наприклад:

MOV AX,SI ;обоє операнда - регістри

Безпосередні операнди задаються константними вираженнями (їх значеннями є константи-числа), наприклад:

MOV BH,5 ;5 - безпосередній операнд

MOV DI,SIZE X ;SIZE X (число байтів, займаних змінної X) - безпосередній операнд.

Адреси описуються адресними вираженнями (наприклад, іменами перемінних), які можуть бути модифіковані по одному або двом регістрам; наприклад, у наступних командах перші операнди задають адреси:

MOV X,AH

MOV X[BX][DI],5

MOV [BX],CL

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

MOV AH,5 ;пересилання байта, тому що AH - байтовий регістр

MOV AX,5 ;пересилання слова, тому що AX - 16-бітовий регістр

(операнд 5 може бути байтом і словом, по ньому не можна визначити розмір пересилаючої величини, що)

MOV [BX],300 ;пересилання слова, тому що число 300 не може бути байтом

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

MOV DS,AX ;обоє операнда мають розмір слова

MOV CX,BH ;помилка: регістри CX й BH мають різні розміри

MOV DL,300 ;помилка: DL - байтовий регістр, а число 300 не

;може бути байтом

Можливі ситуації, коли по зовнішньому вигляді операндів не можна визначити тип жодного з них, як, наприклад, у команді

MOV [BX],5

Тут число 5 може бути й байтом, і словом, а адреса з регістра BX може вказувати й на байт пам'яті, і на слово. У подібних ситуаціях асемблер фіксує помилку. Щоб уникнути її, треба уточнити тип одного з операндов за допомогою оператора з назвою PTR:

MOV BYTE PTR [BX],5 ;пересилання байта

MOV WORD PTR [BX],5 ;пересилання слова

(Оператори - це різновид виражень мови MASM, аналогічні функціям.)

Оператор PTR необхідний й у тому випадку, коли треба змінити тип, запропонований імені при його описі. Якщо, наприклад, X описане як ім'я змінної розміром у слово:

X DW 999

і якщо треба записати в байтовий регістр AH значення тільки першого байта цього слова, тоді скористатися командою

MOV AH,X

не можна, тому що її операнди мають різний розмір. Цю команду треба записати трохи інакше:

MOV AH,BYTE PTR X

Тут конструкція BYTE PTR X означає адресу X, але вже розглянутий не як адреса слова, а як адреса байта. (Нагадаємо, що з одного й того же адреси може починатися байт, слово й подвійне слово; оператор PTR уточнює, осередок якого розміру ми маємо на увазі.)

І ще одне зауваження. Якщо в символьній команді, що оперує з словами, зазначений безпосередній операнд розміром у байт, як, наприклад, у команді

MOV AX,80h

та виникає деяка неоднозначність: що буде записано в регістр

AX - число 0080h (+128) або 0FF80h (-128)? У подібних ситуаціях асемблер формує машинну команду, де операнд - байт розширений до слова, причому розширення відбувається зі знаком, якщо операнд був записаний як негативне число, і без знака в інших випадках. Наприклад:

MOV AX,-128 ; => MOV AX,0FF80h (A:=-128)

MOV AX,128 ; => MOV AX,0080h (A:=+128)

MOV AX,80h ; => MOV AX,0080h (A:=+128)

Лекція 6

Тема: Сегментування

1. Сегменти пам'яті, сегментні регістри

2. Регістри по домовленості

3. Сегментування, базування та індексація адреси

4. Програмні сегменти. Директива ASSUME

5. Початкове завантаження сегментних регістрів

6. Посилання вперед

1. Сегменти пам'яті, сегментні регістри

Перші моделі ПК мали оперативну пам'ять 216 байт (64 Кб), і тому використовуються 16-бітні адреси. В наступних моделях пам'ять була збільшена до 220 байт (1 Мб = 1000 Кб). Однак у цих ПК були збережені 16-бітні адреси: саме ці адреси зберігаються в регістрах і вказуються в командах, саме такі адреси виходять в результаті модифікації по базовим та індексним регістрам. Як же вдається 16-бітним адресам посилатися на 1 Мб пам'яті?

Ця проблема вирішується за допомогою сегментування адресів (неявного базування адресів). В ПК вводиться поняття "сегмент пам'яті". Так зветься будь-яка ділянка пам'яті розміром до 64 Кб і з початковою адресою кратною 16. Абсолютна (20-бітна ) адреса А будь-якої клітини пам'яті можна представити в вигляді суми 20-бітної початкової адреси (бази) В сегменту, якому належить клітина, і 16-бітного зміщення D - адреса цієї клітини, відсчитана від початку сегмента А = В+D. Адреса В заноситься в деякий регістр S і зміщення D (в MASM така пара називається адресною парою, або показником і записується як S:D). А процесор працює так, при виконанні команди він перш за все по парі S:D обчислює абсолютну адресу А як суму даних регістра S і зміщення D, і тільки після того звертається до пам'яті за адресою А. Ось так змінюючи в командах абсолютні на данні адресні пари, і вдається адресувати всю пам'ять 16-бітними адресами (зміщеннями).

В якості регістру S дозволяється використовувати не будь-який регістр а тільки один із чотирьох, які звуться сегментними регістрами: CS, DS, SS і ES. Завдяки цьому можна працювати із чотирма сегментами пам'яті: початок одного з них загружається в регістр CS і усі посилки на клітини цього сегменту вказуються у вигляді пар CS:D, початок другого заноситься в DS і усі посилки на його клітини задаються в вигляді пар DS:D і т.д. Якщо одночасно треба працювати з великим числом сегментів, тоді треба своєчасно рятувати дані сегментних регістрів і вписувати до них початкові адреси п'ятого, шостого і т.д. сегментів.

Відзначимо, що використовувані сегменти можуть бути розташовані пам'яті вільним чином: вони можуть не перехрещуватися, а можуть перехрещуватись і навіть співпадати. Які сегменти пам'яті використовувати, в яких сегментних регістрах утримувати їх початкові адреси - все це особиста справа автора машинної програми.

Так само як усі регістри ПК, сегментні регістри мають розмір слова. Тому виникає питання: як вдається помістити в них 20-бітні початкові адреси сегментів пам'яті? Відповідь така. Оскільки всі ці адресі кратні 16, то у них молодші 4 біти, завжди нульові, і тому ці біти можна не зберігати явно, а тільки мати на увазі. Саме так і робиться: у сегментному регістрі завжди зберігається тільки перші 16 біт початкової адреси сегменту. (ця величина називається номером сегмента або просто сегментом). При знаходженні ж абсолютної адреси А по парі S:D процесор спочатку приписує праворуч до змісту регістра S чотири нульових біта (іншими словами, перемножує на 16) і тільки потім додає зміщення D, причому додавання ведеться по модулю 220:

A abs = 16*[S]+D(mod 220)

Якщо наприклад, в регістрі CS зберігається величина 1234h, то адресна пара 1234h:507h визначає абсолютну адресу, яка дорівнює


Подобные документы

  • Внутрішнє представлення в пам’яті комп’ютера даних базових та похідних типів, масивів. Ідентифікатор, зв'язаний з константним виразом та основи представлення даних. Алгоритм представлення цілих, дійсних, логічних і символьних чисел, структур і об’єднань.

    курсовая работа [279,1 K], добавлен 25.08.2014

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

    презентация [945,0 K], добавлен 01.04.2013

  • Операція алгебраїчного додавання, множення, ділення. Алгоритм ділення модулів чисел. Поняття граф-схеми алгоритму та правила її складання. Основні поняття теорії цифрових автоматів. Синтез керуючого автомата. Контроль виконання арифметичних операцій.

    реферат [55,4 K], добавлен 24.03.2009

  • Склад сучасного настільного персонального комп'ютера. Системне та прикладне програмне забезпечення. Взаємодія користувача з операційною системою MS DOS. Програмна оболонка Norton Commander. Операційна система Microsoft Windows. Основні поняття та команди.

    курсовая работа [1,3 M], добавлен 18.05.2013

  • У наш час Windows ХР є найбільш сучасною настольною операційною системою. Windows ХР, яка займає серед настольних комп’ютерів долю у 84,56 % вимагає досить потужного комп’ютера. Порівняння інтерфейсу операційних систем Windows 98 та Windows ХР.

    реферат [4,4 M], добавлен 24.06.2008

  • Економічна інформація, її види та властивості. Апаратне і програмне забезпечення ПК. Програмне забезпечення стаціонарних комп’ютерів. Комп’ютерні мережі, загальна характеристика глобальної мережі Інтернет. Напрямки використання комп’ютерної техніки.

    контрольная работа [28,0 K], добавлен 06.10.2011

  • Подання чисел у нормальній формі. Порядок нормалізації чисел з рухомою комою. Правила додавання двійкових чисел з рухомою комою. Алгоритми і програми додавання чисел в арифметиці з рухомою комою в інструкціях навчального комп'ютера-симулятора DeComp.

    лабораторная работа [31,7 K], добавлен 13.03.2011

  • Програмне забезпечення ПК, їх структура, склад пристроїв ПК. Об’єкти, які створюються в СУБД Microsoft Access. Їх призначення та застосування. Типи серверів за функціями, які вони підтримують. Системи адресації в Internet. Принципи побудови адрес.

    реферат [18,6 K], добавлен 29.05.2008

  • Web-браузери як програмне забезпечення для комп'ютера або іншого електронного пристрою. Загальна характеристика мови програмування Delphi, розгляд функцій. Аналіз етапів розробки браузера на основі Internet Explorer, знайомство з основаними особливостями.

    дипломная работа [2,1 M], добавлен 06.12.2013

  • Режими роботи з таблицями в Microsoft Access. Основні способи створення таблиць. Вимоги до технічних характеристик комп'ютера. Створення бази даних. Техніка безпеки та основні правила при виконанні робіт на комп'ютері. Порядок архівування роботи.

    реферат [1,5 M], добавлен 23.12.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.