ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ 32 РОЗРЯДНОГО АСЕМБЛЕРА

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Комп'ютерна інженерія
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2011
Тип роботи:
Методичні вказівки до лабораторної роботи
Предмет:
Системне програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка”  Кафедра ЕОМ ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ 32 РОЗРЯДНОГО АСЕМБЛЕРА Методичні вказівки до лабораторної роботи № 1 з курсу “ Системне програмування ” для студентів базового напряму 6.050102  -  “Комп’ютерна інженерія” Затверджено на засіданні кафедри ”Електронні обчислювальні машини” Протокол №  від року Львів – 2011 Особливості програмування з використанням 32 розрядного асемблера: Методичні вказівки до лабораторної роботи № 1 з курсу “ Системне програмування ” для студентів базового напряму 6.050102  -  “Комп’ютерна інженерія” / Укладачі: Мархивка В.С., Олексів М.В., Акимишин О.І., Мороз І.В., – Львів: Національний університет “Львівська політехніка”, 2011, 13  с. Укладачі Мархивка В.С., ст. викл. Олексів М. В., асистент Акимишин О.І., к.т.н., доцент Мороз І.В., ст. викл. Рецензенти Відповідальний за випуск: Мельник А. О., професор, завідувач кафедри ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ 32 РОЗРЯДНОГО АСЕМБЛЕРА Мета: Ознайомитись з програмною моделлю 32 розрядних процесорів Intel та оволодіти навиками створення програм, використовуючи 32 розрядний асемблер. ТЕОРЕТИЧНІ ВІДОМОСТІ Програмна модель комп'ютера, частиною якої є програмна модель мікропроцесора, яка містить 32 регістри в тій чи іншій мірі доступних для використання програмістом. Дані регістри можна розділити на дві великі групи: 16 регістрів користувача; 16 системних регістрів. У програмах на мові асемблера регістри використовуються дуже інтенсивно. Більшість регістрів мають певне функціональне призначення. Регістри користувача Як випливає з назви, призначеними для користувача регістри називаються тому, що програміст може використовувати їх при написанні своїх програм. До цих регістрів відносяться (рис.1): вісім 32-бітових регістрів, які можуть використовуватися програмістами для зберігання даних і адрес (їх ще називають регістрами загального призначення (РЗП)): eax/ax/ah/al; ebx/bx/bh/bl; edx/dx/dh/dl; ecx/cx/ch/cl; ebp/bp; esi/si; edi/di; esp/sp. шість сегментних регістрів: cs, ds, ss, es, fs, gs; регістри управління та стану: регістр прапорів eflags/flags; регістр покажчика команди eip/ip. Чому багато з цих регістрів приведені з розділовою межею? (рис. 1) Ні, це не різні регістри — це частини одного великого 32-розрядного регістра. Їх можна використовувати в програмі як окремі об'єкти. Так зроблено для забезпечення працездатності програм, написаних для молодших 16-розрядних моделей мікропроцесорів фірми Intel, починаючи з i8086. Мікропроцесори i486 і Pentium мають в основному 32-розрядні регістри. Їх кількість, за винятком сегментних регістрів, таке ж, як і у i8086, але розмірність більше, що і відбито в їх позначеннях — вони мають приставку e (Extended). Регістри загального призначення Всі регістри цієї групи дозволяють звертатися до своїх “молодших” частин (див. рис. 1). Відмітимо, що використовувати для самостійної адресації можна тільки молодші 16 і 8-бітові частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні. До РЗП відносяться: eax/ax/ah/al (Accumulator register) — акумулятор. Застосовується для зберігання проміжних даних. У деяких командах використання цього регістра обов'язкове; ebx/bx/bh/bl (Base register) — базовий регістр.  Рис. 1. Регістри користувача мікропроцесорів i486 і Pentium Застосовується для зберігання базової адреси деякого об'єкту в пам'яті; ecx/cx/ch/cl (Count register) — регістр-лічильник. Застосовується в командах, що проводять деякі дії, що повторюються. Його використання часто неявно і приховано в алгоритмі роботи відповідної команди. Наприклад, команда організації циклу loop окрім передачі управління команді, що знаходиться за деякою адресою, аналізує і зменшує на одиницю значення регістра ecx/cx; edx/dx/dh/dl (Data register) — регістр даних. Так само, як і регістр eax/ax/ah/al, він зберігає проміжні дані. У деяких командах його використання обов'язково; для деяких команд це відбувається неявно. Наступні два регістри використовуються для підтримки операцій, що проводять послідовну обробку ланцюжків елементів, кожний з яких може мати довжину 32, 16 або 8 біт: esi/si (Source Index register) — індекс джерела. edi/di (Destination Index register) — індекс приймача (одержувача). У архітектурі мікропроцесора на програмно-апаратному рівні підтримується така структура даних, як стек. Для роботи із стеком в системі команд мікропроцесора є спеціальні команди, а в програмній моделі мікропроцесора для цього існують спеціальні регістри: esp/sp (Stack Pointer register) — регістр покажчика стека. Містить покажчик вершини стека в поточному сегменті стека. ebp/bp (Base Pointer register) — регістр покажчика бази кадру стека. Призначений для організації довільного доступу до даних усередині стека. Використання жорсткого закріплення регістрів для деяких команд дозволяє компактніше кодувати їх машинне уявлення. Знання цих особливостей дозволить вам при необхідності хоч би на декілька байт заощадити пам'ять, займану кодом програми. Робота з масивами Регістри загального призначення використовуються для адресації масивів. При цьому застосовується адресація по базі з масштабуванням: початкова адреса + база* масштабуючий коефіцієнт бази. Допустимі значення масштабуючого коефіцієнту бази (кількість байт, які займає 1 елемент масиву) рівні 1, 2, 4, 8. Таким чином, щоб записати 3-й елемент масиву оголошеного мовою С як short arr[15] в edx треба написати код: mov eax, arr mov ebx, 2 mov edx,[eax+ebx*2] Сегментні регістри У програмній моделі мікропроцесора є шість сегментних регістрів: cs, ss, ds, es, gs, fs. Їх існування обумовлено специфікою організації і використання оперативної пам'яті мікропроцесорами Intel. Вона полягає в тому, що мікропроцесор апаратно підтримує структурну організацію програми у вигляді трьох частин, званих сегментами. Відповідно, така організація пам'яті називається сегментною. Для того, щоб вказати на сегменти, до яких програма має доступ в конкретний момент часу, і призначені сегментні регістри. Фактично, з невеликою поправкою, як ми побачимо далі, в цих регістрах містяться адреси пам'яті з яких починаються відповідні сегменти. Логіка обробки машинної команди побудована так, що при вибірці команди, доступі до даних програми або до стека неявно використовуються адреси в цілком певних сегментних регістрах. Мікропроцесор підтримує наступні типи сегментів: Сегмент коду. Містить команди програми. Для доступу до цього сегменту служить регістр cs (code segment register) — сегментний регістр коду. Він містить адресу сегменту з машинними командами, до якого має доступ мікропроцесор (тобто ці команди завантажуються в конвейєр мікропроцесора). Сегмент даних. Містить оброблювані програмою дані. Для доступу до цього сегменту служить регістр ds (data segment register) — сегментний регістр даних, який зберігає адресу сегменту даних поточної програми. Сегмент стека. Цей сегмент є областю пам'яті, званою стеком. Роботу із стеком мікропроцесор організовує за наступним принципом: останній записаний в цю область елемент вибирається першим. Для доступу до цього сегменту служить регістр ss (stack segment register) — сегментний регістр стека, що містить адресу сегменту стека. Додатковий сегмент даних. Неявно алгоритми виконання більшості машинних команд припускають, що оброблювані ними дані розташовані в сегменті даних, адреса якого знаходиться в сегментному регістрі ds. Якщо програмі недостатньо одного сегменту даних, то вона має можливість використовувати ще три додаткові сегменти даних. Але на відміну від основного сегменту даних, адреса якого міститься в сегментному регістрі ds, при використанні додаткових сегментів даних їх адреси потрібно указувати явно за допомогою спеціальних префіксів перевизначення сегментів в команді. Адреси додаткових сегментів даних повинні міститися в регістрах es, gs, fs (extension data segment registers). Регістри стану і управління У мікропроцесор включені декілька регістрів (див. рис.1), які постійно містять інформацію про стан як самого мікропроцесора, так і програми, команди якої в даний момент завантажені на конвеєр. До цих регістрів відносяться: регістр прапорів eflags/flags; регістр покажчика команди eip/ip. Використовуючи ці регістри, можна одержувати інформацію про результати виконання команд і впливати на стан самого мікропроцесора. Розглянемо докладніше призначення і вміст цих регістрів: eflags/flags (flag register) — регістр прапорів. Розрядність eflags/flags — 32/16 біт. Окремі біти даного регістра мають певне функціональне призначення і називаються прапорами. Молодша частина цього регістра повністю аналогічна регістру flags для i8086. На рис.2 показане вміст регістра eflags. Виходячи з особливостей використання, прапори регістра eflags/flags можна розділити на три групи: 8 прапорів стану. Ці прапори можуть змінюватися після виконання машинних команд. Прапори стану регістра eflags відображають особливості результату виконання арифметичних або логічних операцій. Це дає можливість аналізувати стан обчислювального процесу і реагувати на нього за допомогою команд умовних переходів і викликів підпрограм. 1 прапор управління. Позначається df (Directory Flag). Він знаходиться в 10-му біті регістра eflags і використовується для рядкових операцій. Значення прапора df визначає напрям поелементної обробки в цих операціях: від початку рядка до кінця або навпаки, від кінця рядка до її початку (df = 1). Для роботи з прапором df існують спеціальні команди: cld (зняти прапор df) і std (встановити прапор df). Застосування цих команд дозволяє привести прапор df у відповідність з алгоритмом і забезпечити автоматичне збільшення або зменшення лічильників при виконанні операцій з рядками; 5 системних прапорів, для керування вводом/виводом, маскованими перериваннями, відладкою, перемиканням між завданнями і віртуальним режимом 8086. Прикладним програмам не рекомендується модифікувати без необхідності ці прапори, оскільки в більшості випадків це приведе до переривання роботи програми. eip/ip (Instraction Pointer register) — регістр-покажчик команд. Регістр eip/ip має розрядність 32/16 біт і містить зміщення до наступної команди, що має виконуватись, відносно вмісту сегментного регістра cs. Цей регістр безпосередньо недоступний програмісту, але завантаження і зміна його значення проводяться різними командами управління, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення з процедур. Виникнення переривань також приводить до модифікації регістра eip/ip.  Рис. 2. Вміст регістра eflags Системні регістри мікропроцесора Сама назва цих регістрів говорить про те, що вони виконують специфічні функції в системі. Використання системних регістрів жорстко регламентовано. Саме вони забезпечують роботу захищеного режиму. Їх також можна розглядати як частина архітектури мікропроцесора, яка навмисно залишена видимою для того, щоб кваліфікований системний програміст міг виконати самі низькорівневі операції. Системні регістри можна розділити на три групи: чотири регістри управління; чотири регістри системних адрес; вісім регістрів відлагодження. Регістри управління До групи регістрів управління входять 4 регістри: cr0, cr1, cr2, cr3. Ці регістри призначені для загального управління системою. Регістри управління доступні тільки програмам з рівнем привілеїв 0. Хоча мікропроцесор має чотири регістри управління, доступними є тільки три з них — виключається cr1, функції якого поки не визначені (він зарезервований для майбутнього використання). Регістр cr0 містить системні прапори, для керування режимами роботи мікропроцесора, що відображають його стан глобально, незалежно від конкретних завдань, що виконуються. Призначення системних прапорів: ре (Protect Enable), біт 0 — дозвіл захищеного режиму роботи. Стан цього прапора показує, в якому з двох режимів — реальному (pe=0) або захищеному (pe=1) — працює мікропроцесор в даний момент часу. mp (Math Present), біт 1 — наявність співпроцесора. Завжди 1. ts (Task Switched), біт 3 — перемикання завдань. Процесор автоматично встановлює цей біт при перемиканні на виконання іншого завдання. am (Aligment Mask), біт 18 — маска вирівнювання. Цей біт дозволяє (am = 1) або забороняє (am = 0) контроль вирівнювання. cd (Cache Disable), біт 30, — заборона кеш-пам'яті. За допомогою цього біта можна заборонити (cd = 1) або дозволити (cd = 0) використання внутрішньої кеш-пам'яті (кеш-пам'яті першого рівня). pg (PaGing), біт 31, — дозвіл (pg = 1) або заборона (pg = 0) сторінкового перетворення. Регістр cr2 використовується при сторінковій організації оперативної пам'яті для реєстрації ситуації, коли поточна команда звернулася за адресою, що міститься в сторінці пам'яті, відсутній в даний момент часу в пам'яті. У такій ситуації в мікропроцесорі виникає виняткова ситуація з номером 14, і лінійна 32-бітова адреса команди, що викликала це виключення, записується в регістр cr2. Маючи цю інформацію, обробник виключення 14 визначає потрібну сторінку, здійснює її підкачку в пам'ять і відновлює нормальну роботу програми; Регістр cr3 також використовується при сторінковій організації пам'яті. Це так званий регістр каталога сторінок першого рівня. Він містить 20-бітову фізичну базову адресу каталога сторінок поточного завдання. Цей каталог містить 1024 32-бітових дескриптора, кожний з яких містить адресу таблиці сторінок другого рівня. У свою чергу кожна з таблиць сторінок другого рівня містить 1024 32-бітових дескриптора, що адресують сторінкові кадри в пам'яті. Розмір сторінкового кадру — 4 Кбайт. Регістри системних адрес Ці регістри ще називають регістрами управління пам'яттю. Вони призначені для захисту програм і даних в мультизадачному режимі роботи мікропроцесора. При роботі в захищеному режимі мікропроцесора адресний простір ділиться на: глобальний — загальний для всіх завдань; локальний — окремий для кожного завдання. Цим розділенням і пояснюється присутність в архітектурі мікропроцесора наступних системних регістрів: регістра таблиці глобальних дескрипторів gdtr (Global Descriptor Table Register) що має розмір 48 біт і що містить 32-бітову (биті 16—47) базову адресу глобальної дескрипторної таблиці GDT і 16-бітове (биті 0—15) значення межі, що є розміром в байтах таблиці GDT; регістра таблиці локальних дескрипторів ldtr (Local Descriptor Table Register) що має розмір 16 біт і що містить так званий селектор дескриптора локальної дескрипторної таблиці LDT. Цей селектор є покажчиком в таблиці GDT, який і описує сегмент, що містить локальну дескрипторну таблицю LDT; регістра таблиці дескрипторів переривань idtr (Interrupt Descriptor Table Register) що має розмір 48 біт і що містить 32-бітову (биті 16–47) базову адресу дескрипторної таблиці переривань IDT і 16-бітове (биті 0—15) значення межі, що є розміром в байтах таблиці IDT; 16-бітового регістра завдання tr (Task Register), який подібно до регістра ldtr, містить селектор, тобто покажчик на дескриптор в таблиці GDT. Цей дескриптор описує поточний сегмент стану завдання (TSS — Task Segment Status). Цей сегмент створюється для кожного завдання в системі, має жорстко регламентовану структуру і містить контекст (поточний стан) завдання. Основне призначення сегментів TSS — зберігати поточний стан завдання у момент перемикання на інше завдання. Регістри відлагодження Це дуже цікава група регістрів, призначених для апаратного відлагодження. Засоби апаратного відлагодження вперше з'явилися в мікропроцесорі i486. Апаратний мікропроцесор містить вісім регістрів відлагодження, але реально з них використовуються тільки 6. Регістри dr0, dr1, dr2, dr3 мають розрядність 32 біти і призначені для завдання лінійних адрес чотирьох точок переривання. Регістр dr6 називається регістром стану відлагодження. Біти цього регістра встановлюються відповідно до причин, які викликали виникнення останнього виключення з номером 1. Перерахуємо ці біти і їх призначення: b0 — якщо цей біт встановлений в 1, то останнє виключення (переривання) виникло в результаті досягнення контрольної крапки, визначеної в регістрі dr0; b1 — аналогічно b0, але для контрольної крапки в регістрі dr1; b2 — аналогічно b0, але для контрольної крапки в регістрі dr2; b3 — аналогічно b0, але для контрольної крапки в регістрі dr3; bd (біт 13) — служить для захисту регістрів відлагодження; bs (біт 14) — встановлюється в 1, якщо виключення 1 було викликано станом прапора tf = 1 в регістрі eflags; bt (біт 15) встановлюється в 1, якщо виключення 1 було викликано перемиканням на завдання зі встановленим бітом пастки в TSS t = 1. Решта всіх бітів в цьому регістрі заповнюється нулями. Обробник виключення 1 по вмісту dr6 повинен визначити причину, після якої відбулося виключення, і виконати необхідні дії. Регістр dr7 називається регістром управління відладкою. У ньому для кожного з чотирьох регістрів контрольних точок відлагодження є поля, за допомогою яких можна уточнити наступні умови, при яких слід згенерувати переривання: місце реєстрації контрольної крапки — тільки в поточному завданні або в будь-якому завданні. Ці біти займають молодші вісім біт регістра dr7 (по два бита на кожну контрольну крапку (фактично точку переривання), що задається регістрами dr0, dr1, dr2, dr3 відповідно). Перший біт з кожної пари — це так званий локальний дозвіл; його установка говорить про те, що точка переривання діє якщо вона знаходиться в межах адресного простору поточного завдання. Другий біт в кожній парі визначає глобальний дозвіл, який говорить про те, що дана контрольна крапка діє в межах адресних просторів всіх завдань, що знаходяться в системі; тип доступу, по якому ініціюється переривання: тільки при вибірці команди, при записі або при записі/читанні даних. Біти, що визначають подібну природу виникнення переривання, локалізуються в старшій частині даного регістра. КОНТРОЛЬНІ ПИТАННЯ 1. Які програмно доступні регістри архітектури ІА-32 ви знаєте? 2. В чому полягає різниця між програмними моделями архітектур x86 і ІА-32? 3. Як написати програму використовуючи MASM 32? 4. Як відлагодити програму використовуючи MASM 32? 5. Принципи роботи з масивами даних в Асемблері. ЛІТЕРАТУРА 1. Джордейн Р.Справочник програмиста персональных компъютеров типа ІBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31. 2.Березко Л.О., Троценко В.В. Особливості програмування в турбо-асемблері. - Київ, НМК ВО, 1992. 3.Дао Л. Программирование микропроцессора 8088.Пер. с англ. -М.: "Мир",1988. 4.Абель П.Язык ассемблера для ІBM PC и программирования. Пер. з англ.-М.,"Высшая школа",1992. ЗАВДАННЯ Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу. A={a[i]} – попередньозаданий масив з N чисел. c, d - константи. Переконатися у правильності роботи програми використовуючи VKDebug. Скласти звіт про виконану роботу з приведенням тексту програми. Дати відповідь на контрольні запитання. ВАРІАНТИ ЗАВДАННЯ: № Завдання  1 Знайти, скільки елементів масиву A={a[i]}, що задовольняють умову с <= a[i] <= d  2 Знайти, скільки додатних непарних елементів міститься в масиві A={a[i]}  3 Знайти скільки додатних елементів в масиві A={a[i]}  4 Знайти скільки від’ємних елементів в масиві A={a[i]} мають непарні індекси  5 Знайти, скільки парних від’ємних елементів масиву A={a[i]} задовольняють умову с-d <= a[i] <= c+d  6 Знайти скільки додатних елементів масиву A={a[i]} задовольняють умову: с <= a[i] <= d  7 Знайти суму всіх додатних елементів масиву A={a[i]}, що задовольняють умову: a[i] >= |d/c|  8 Знайти суму всіх додатних елементів масиву A={a[i]}  9 Знайти скільки елементів з непарними індексами масиву A={a[i]} задовольняють умову с < a[i] <= d  10 Знайти суму перших К елементів масиву A={a[i]}, що задовольняють умову: a[i] >= с + d  11 Знайти суму перших К від’ємних елементів масиву A={a[i]}, що задовольняють умову: a[i] >= с + d  12 Знайти суму перших К додатних елементів масиву A={a[i]}, що задовольняють умову: a[i] >= с + d  13 Знайти скільки від’ємних і нульових елементів в масиві A={a[i]} задовольняють умову: с <= a[i] < d  14 Знайти скільки нульових елементів в масиві A={a[i]}  15 Знайти суму всіх від’ємних елементів масиву A={a[i]}  16 Знайти суму останніх L елементів в масиві A={a[i]}. L – ціле додатне число  17 Знайти суму перших К від’ємних елементів масиву A={a[i]}, що задовольняють умову: с <= a[i] <= d  18 Знайти добуток останніх L елементів в масиві A={a[i]}, що задовольняють умову: с <= a[i] <= d  19 Знайти добуток останніх L додатних елементів масиву A={a[i]}, що відповідають умові: с < a[i] < d  20 Знайти суму всіх непарних елементів масиву A={a[i]}  21 Знайти суму перших К елементів масиву A={a[i]}, що задовольняють умову с <= a[i] <= d  22 Знайти суму перших К елементів масиву A={a[i]}, що задовольняють умову 2*с <= a[i] <=3*d  23 Знайти суму елементів масиву A={a[i]}, що задовольняють умову: с <= a[i] <= d.  24 Знайти суму останніх L додатних елементів в масиві A={a[i]}  25 Знайти суму останніх L від’ємних елементів в масиві A={a[i]}  26 Знайти суму всіх парних елементів масиву A={a[i]}  27 Знайти скільки ненульових елементів в масиві A={a[i]}  28 Знайти суму елементів в масиві A={a[i]}, що задовольняють умову с <= a[i] <=4*d  30 Знайти суму елементів масиву A={a[i]}, що задовольняють умову: a[i] >= c/d   ПОРЯДОК ВИКОНАННЯ Завантажити з http://www.masm32.com/masmdl.htm або взяти у керівника лабораторних робіт і встановити макроасемблер MASM 32. Запустити середовище розробки MASM 32. Для цього потрібно запустити на виконання файл qeditor.exe з каталогу, куди встановлено MASM 32. Створити новий файл. Для цього в закладці File вибрати New. Написати програму вносячи виклики відлагоджувальних макросів VKDebug (рис.3). Перелік відлагоджувальних макросів та методів їх використання знаходиться у вкладці середовища розробки MASM 32: Help->VKDebug Help.  Рис.3. середовище розробки MASM 32 з написаною програмою. Зберегти програму. Збудувати програму. Для цього запустити: Project -> Build All. Увага!!! Перед кожним будуванням програми її необхідно зберегти вручну. Запустити програму і переконатися в правильності її виконання. Для цього необхідно запустити: File -> Run Program. Вибрати файл з розширенням .exe для запуску. Після запуску програми відкриється вікно відлагоджувача, де буде відображено відлагоджувальну інформацію. В цьому вікні обов’язково має бути відображеним результат виконання програми (рис.4).  Рис.4. Вікно відлагоджувача. ПРИКЛАД ПРОГРАМИ ;Програма виводить в зворотному порядку за допомогою ;відлагоджувача масив 4 байтних значень .586 ; використати плоску модель пам'яті і узгодження імен stdcall .model flat, stdcall option casemap: none ; оголошення службових процедур, макросів, змінних, констант include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\debug.inc ; підключення службових бібліотек includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\debug.lib ; оголошення масиву даних .data Arr dd 1,2,3,4,5 .code start: mov ecx,5 prnt: mov eax,[Arr+ecx*4-4] PrintDec eax,"Arr value" ; виклик макросу відлагодження dec ecx cmp ecx,0 jnz prnt invoke ExitProcess, NULL ; виклик процедури завершення процесу end start НАВЧАЛЬНЕ ВИДАННЯ ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ 32 РОЗРЯДНОГО АСЕМБЛЕРА МЕТОДИЧНІ ВКАЗІВКИ до лабораторної роботи № 1 з дисципліни “ Системне програмування ” для студентів базового напряму 6.050102 -  “Комп’ютерна інженерія” Укладачі Мархивка В.С., ст. викл. Олексів М. В., асистент Акимишин О.І., к.т.н., доцент Мороз І.В., ст. викл. Редактор Комп’ютерне верстання Здано у видавництво . Підписано до друку Формат 70х100/16. Папір офсетний. Друк на різографі Умовн. друк. арк. Обл..-вид. арк.. Тираж прим. Зам.. Видавництво Національного університету “Львівська політехніка” Реєстраційне свідоцтво ДК №751 від 27.12.2001 р. Поліграфічний центр Видавництва Національного університету “Львівська політехніка” Вул.. Ф. Колесси, 2. Львів, 79000
Антиботан аватар за замовчуванням

20.05.2013 22:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!