ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Семантичний аналіз структури EXE файлу і дісассемблер (з прикладами і исходниками), вірусологія
         

     

    Інформатика, програмування

    НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ІМЕНІ УЗБЕКИСТАН СвітЗа Улугбек

    ФАКУЛЬТЕТ КОМП'ЮТЕРНИХ ТЕХНОЛОГІЇ

    На тему: Семантичний розбір EXE-файлу.

    Виконав:

    Ташкент 2003.

    ПЛАН:

    Передмова.

    1. Мова асемблера і структура команд.

    2. Структура EXE-файлу (семантичний розбір).

    3. Структура COM-файлу.

    4. Принцип дії і розповсюдження вірусу.

    5. Дісассемблер.

    6. Програми.

    Передмова

    Професія програміста дивовижна і унікальна. У наш час науку іжиття неможливо уявити без новітніх технології. Все що пов'язано здіяльністю людини не обходиться без обчислювальної техніки. А цесприяє її високого рівня розвитку і досконалості. Нехай розвитокперсональних комп'ютерів почалося не так давно, але протягом цього часубуло зроблено колосальні кроки з програмних продуктів і ще довгий часці продукти будуть широко використовуватися. Область пов'язаних з комп'ютерамизнанні зазнала вибух, як і відповідна технологія. Якщо не брати дорозгляд комерційну сторону, то можна сказати, що чужих людей у ційгалузі професійної діяльності немає. Багато хто займається розробкоюпрограм не заради вигоди або заробітку, а з власної волі, по захопленню.
    Звичайно це не повинно позначитися на якості програми, і в цій справі таксказати «бізнесі» є конкуренція і попит на якість виконання, настабільній роботі і відповідає всім вимогам сучасності. Тут такж варто відзначити появу мікропроцесорів в 60-х роках, які прийшлина заміну великої кількості набору ламп. Є деякі різновидимікропроцесорів які сильно відрізняються один від одного. Цімікропроцесори відмінні один від одного розрядністю і вбудованими системнимикомандами. Найпоширеніші такі як: Intel, IBM, Celeron, AMD іт.д. Всі ці процесори мають відношення до розвиненої архітектурі процесорівфірми Intel. Поширення мікрокомп'ютерів послужило причиноюперегляду ставлення до мови асемблера з двох основних причин.
    По-перше, програми, написані на мові асемблера, вимагаютьзначно менше пам'яті і часу виконання. По-друге, знаннямови асемблер і результуючого машинного коду дає розумінняархітектури машини, що навряд чи забезпечується при роботі на мові високого рівня. Хоча більшість фахівців у галузі програмного забезпеченняведуть розробки на мовах високого рівня, таких як Паскаль, С або
    Delphi, що простіше при написанні програм, найбільш потужний та ефективнепрограмне забезпечення повністю або частково написано на мовіасемблера. Мови високого рівня були розроблені для того, щобуникнути спеціальної технічної особливості конкретних комп'ютерів.
    А мова асемблера, у свою чергу, розроблений для конкретної специфікипроцесора. Отже, для того, щоб написати програму на мовіасемблера для конкретного комп'ютера, слід знати його архітектуру. Усправжні дні видом основного програмного продукту є EXE-файл.
    З огляду на позитивні сторони цього, автор програми може бути впевнений уїї недоторканості. Але найчастіше часом це далеко не так. Існує такж і дісассемблер. За допомогою дісассемблера можна дізнатися переривання і кодипрограми. Людині, що добре розбирається в асемблері не складно будепереробити всю програму на свій смак. Можливо звідси з'являється саманерозв'язна проблема - вірус. Навіщо ж люди пишуть вірус? Деякі задаютьце питання з подивом, деякі з злістю, але проте продовжуютьіснувати люди які цікавляться цим завданням не з точки зорунанесення якого-то шкоди, а як інтересу до системного програмування.
    Пишуть Віруси з різних причин. Одним подобається системні виклики, іншимудосконалювати свої знання в асемблера. Про все це я постараюсявикласти у своїй роботі. Так само в ньому сказано не тільки проструктуру EXE-файл, але й про мову асемблера.

    1. Мова Асемблера.

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

    Колись асемблер була мовою, без знання якого не можна булозмусити комп'ютер зробити що-небудь корисне. Поступово ситуаціязмінювалася. З'являлися більш зручні засоби спілкування з комп'ютером. Але, ввідміну від інших мов, асемблер не вмирав, понад те, він не міг зробитицього в принципі. Чому? У пошуках відповіді спробуємо зрозуміти, що такемова асемблера взагалі.

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

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

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

    Типовий сучасний комп'ютер (на базі i486 або Pentium) складається знаступних компонентів (рис. 1).


    Рис. 1. Комп'ютер та периферійні пристрої


    Рис. 2. Структурна схема персонального комп'ютера

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

    Обговоримо схему на рис. 2 в кілька нетрадиційному стилі.

    Людині властиво, зустрічаючись з чимось новим, шукати якісьасоціації, які можуть допомогти йому пізнати невідоме. Які асоціаціївикликає комп'ютер? У мене, наприклад, комп'ютер часто асоціюється зсамою людиною. Чому?

    Людина створюючи комп'ютер десь у глибині себе думав що створюєщось схоже на себе самого. У комп'ютера є органи сприйняттяінформації із зовнішнього світу - це клавіатура, мишка, накопичувачі на магнітнихдисках. На рис. 2 ці органи розташовані праворуч від системних шин. Укомп'ютера є органи "переварювати" отриману інформацію - цецентральний процесор і оперативна пам'ять. І, нарешті, у комп'ютера єоргани мови, що видають результати переробки. Це також деякі зпристроїв справа.

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

    Цей набір рефлексів утворює систему машинних команд. На якому б високомурівні ви не спілкувалися з комп'ютером, в кінцевому підсумку все зводиться донудною та одноманітною послідовності машинних команд.

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

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

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

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

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

    Дані регістри можна розділити на дві великі групи:

    . 16 призначених для користувача регістрів;

    . 16 системних регістрів.
    У програмах на мові асемблера регістри використовуються дуже інтенсивно.
    Більшість регістрів мають певне функціональне призначення.
    Як випливає з назви, призначеними для користувача регістри називаються тому, щопрограміст може використовувати їх при написанні своїх програм. До цихрегістрів належать (рис. 3):

    . вісім 32-бітових регістрів, які можуть використовуватися програмістами для зберігання даних і адрес (їх ще називають регістрами загального призначення (РОН)): o eax/ax/ah/al; o ebx/bx/bh/bl; o edx/dx/dh/dl; o ecx/cx/ch/cl; o ebp/bp; o esi/si; o edi/di; o esp/sp.

    . шість регістрів сегментів: cs, ds, ss, es, fs, gs;

    . регістри стану і управління: o регістр прапорів eflags/flags; o регістр покажчика команди eip/ip.


    Рис. 3. Користувальницькі регістри мікропроцесорів i486 і Pentium

    Чому багато хто з цих регістрів наведені з похилої розділовоїрисою? Ні, це не різні регістри - це частини одного великого 32 --розрядного регістра. Їх можна використовувати у програмі як окреміоб'єкти. Так зроблено для забезпечення працездатності програм, написанихдля молодших 16-розрядних моделей мікропроцесорів фірми Intel, починаючи зi8086. Мікропроцесори i486 та Pentium мають в основному 32-розряднірегістри. Їх кількість, за винятком сегментних регістрів, таке ж, які у i8086, але розмірність більше, що й відображено в їх позначення - вонимають

    приставку e (Extended).


    Регістри загального призначення

    Всі регістри цієї групи дозволяють звертатися до своїх "молодшим" частинам (див.рис. 3). Розглядаючи цей малюнок, зауважте, що використовувати длясамостійної адресації можна лише молодші 16 і 8-бітні частини цихрегістрів. Старші 16 біт цих регістрів як самостійні об'єктинедоступні. Це зроблено, як ми зазначили вище, для сумісності з молодшими
    16-розрядними моделями мікропроцесорів фірми Intel.

    Перерахуємо регістри, які відносяться до групи регістрів загальногопризначення. Так як ці регістри фізично знаходяться в мікропроцесоріусередині арифметико-логічного пристрою (АЛП), то їх ще називаютьрегістрами АЛУ:

    . eax/ax/ah/al (Accumulator register) - акумулятор.

    Застосовується для зберігання проміжних даних. У деяких командах використання цього регістра обов'язково;

    . ebx/bx/bh/bl (Base register) - базовий регістр.

    Застосовується для зберігання базової адреси деякого об'єкта в пам'яті;

    . 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) - регістр покажчика бази кадру стека.

    Призначений для організації довільного доступу до даних усередині стека.

    Стек

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

    Стек традиційно використовується, наприклад, для збереження вмістурегістрів, що використовуються програмою, перед викликом підпрограми, яка, всвою чергу, буде використовувати регістри процесора "у своїх особистихцілях ". Вихідне вміст регістрів ізатекается з стека після поверненняз підпрограми. Інший поширений прийом - передача підпрограмінеобхідних нею параметрів через стек. Підпрограма, знаючи, в якому порядкупомещени в стек параметри, може забрати їх звідти і використовувати при своємувиконання. Відмінною особливістю стека є своєрідний порядоквибірки містяться в ньому даних: в будь-який момент часу в стеку доступнийтільки верхній елемент, тобто елемент, завантажений в стек останнім.
    Вивантаження з стека верхнього елементу робить доступним наступний елемент.
    Елементи стека розташовуються в області пам'яті, відведеної під стек, починаючиз дна стека (тобто з його максимального адреси) за послідовнозменшуваним адресами. Адреса верхнього, доступного елемента зберігається врегістрі-покажчику стека SP. Як і будь-яка інша область пам'яті програми,стек повинен входити в якийсь сегмент або утворювати окремий сегмент.
    У будь-якому випадку сегментний адресу цього сегменту розміщується в сегментнийрегістр стека SS. Таким чином, пара регістрів SS: SP описують адресадоступною осередку стека: в SS зберігається сегментний адреса стека, а в SP --зсув останній збережений в стеку даного (рис. 4, а). Обратітімувагу на те, що в початковому стані покажчик стека SP вказує наклітинку, яка лежить під дном стека і не входить до нього.


    Рис 4. Організація стека: а - вихідний стан, б - після завантаження одногоелемента (в даному прикладі - вмісту регістра АХ), в - після завантаженнядругого елементу (вмісту регістра DS), г - після вивантаження одногоелемента, д - після вивантаження двох елементів і повернення у вихіднестан.

    Завантаження в стек здійснюється спеціальною командою роботи зі стекомpush (проштовхнути). Ця команда спочатку зменшує на 2 вміст покажчикастека, а потім поміщає операнд за адресою в SP. Якщо, наприклад, ми хочемотимчасово зберегти в стеку вміст регістра АХ, слід виконатикоманду push АХ

    Стек переходить в стан, показане на рис. 1.10, б. Видно, щопокажчик стека зміщується на два байти нагору (у бік менших адрес) іза цією адресою записується вказаний в команді проштовхування операнд.
    Наступна команда завантаження в стек, наприклад, push DSпереведе стек в стан, показане на рис. 1.10, ст. У стеку будутьтепер зберігатися два елементи, причому доступним буде тільки верхній, наякий вказує покажчик стека SP. Якщо через якийсь час намзнадобилося відновити вихідне вміст збережені в стекурегістрів, ми повинні виконати команди вивантаження з стека pop (виштовхнути): pop DS

    pop AX

    Якого розміру повинен бути стек? Це залежить від того, наскількиінтенсивно він використовується в програмі. Якщо, наприклад, планується зберігатив стеку масив обсягом 10 000 байт, то стек повинен бути не менше цьогорозміру. При цьому треба мати на увазі, що в ряді випадків стек автоматичновикористовується системою, зокрема, при виконанні команди переривання int
    21h. За цією командою спочатку процесор поміщає в стек адреса повернення, апотім DOS відправляє туди ж вміст регістрів та іншу інформацію,що відноситься до перерваної програмі. Тому, навіть якщо програма зовсім невикористовує стек, він все ж таки повинен бути присутнім в програмі і мати розмірне менше кількох десятків слів. У нашому першому прикладі ми відвели підстек 128 слів, що безумовно достатньо.


    Структура програми на асемблері

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

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

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

    . директиви, які є вказівкою транслятору асемблера на виконання деяких дій. У директив немає аналогів у машинному поданні;

    . рядки коментарів, що містять будь-які символи, у тому числі і літери російського алфавіту. Коментарі ігноруються транслятором.


    Синтаксис асемблера

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


    Рис. 5. Формат пропозиції асемблера


    Рис. 6. Формат директив


    Рис. 7. Формат команд і макрокоманд

    На цих малюнках:

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

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

    . код операції (КОП) і директива - це мнемонічні позначення відповідної машинної команди, дії або директиви транслятора;

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

    1. всі латинські літери: A-Z, a-z. При цьому великі і малі літери вважаються еквівалентними;

    2. цифри від 0 до 9;

    3. знаки?, @, $, _, &;

    4. роздільники,. [] () <> () +/*%! ' "? = # ^.
    Пропозиції асемблера формуються з лексем, що представляють собоюсинтаксично нероздільні послідовності припустимих символів мови,що мають значення для транслятора.
    Лексемами є:

    . ідентифікатори - послідовності припустимих символів, що використовуються для позначення таких об'єктів програми, як коди операцій, імена змінних і назви міток. Правило запису ідентифікаторів полягає в наступному: ідентифікатор може складатися з одного або кількох символів. В якості символів можна використовувати букви латинського алфавіту, цифри і деякі спеціальні знаки - _,?, $, @. Ідентифікатор не може починатися символом цифри.

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


    Команди асемблера.

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

    1. Для опису стану прапорів після виконання певної команди будемо використовувати вибірку з таблиці, що відображає структуру регістра прапорів eflags:


    Призначення: додавання двох операндів джерело і приймач розмірністю байт,слово або подвійне слово.
    Алгоритм роботи:

    . скласти операнди джерело і приймач;

    . записати результат додавання в приймач;

    . встановити прапори.
    Стан прапорів після виконання команди:


    Призначення:

    . передача керування близької чи далекої процедурою із запам'ятовуванням в стеку адреси точки повернення;

    . перемикання завдань.
    Алгоритм роботи:

    визначається типом операнда:

    . мітка ближня - в стек заноситься вміст покажчика команд eip/ip і в цей же регістр завантажується нове значення адреси, відповідне мітці;

    . мітка далека - в стек заноситься вміст покажчика команд eip/ip і cs. Потім в ці ж регістри завантажуються нові значення адрес, відповідні далекої мітці;

    . r16, 32 або m16, 32 - визначають регістр або комірку пам'яті, що містять зміщення в поточному сегменті команд, куди передається керування. При передачі управління в стек заноситься вміст покажчика команд eip/ip;

    . покажчик на пам'ять - визначає комірку пам'яті, яка містить 4 або 6 - байтним покажчик на спричинюється процедуру. Структура такого вказівника

    2 +2 або 2 4 байти. Інтерпретація такого покажчика залежить від режиму роботи мікропроцесора:
    Стан прапорів після виконання команди (крім перемикання завдання):
    | виконання команди не впливає на прапори |


    При перемиканні завдання значення прапорців змінюються відповідно доінформацією про регістрі eflags в сегменті стану TSS завдання, на якупроводиться перемикання.

    Застосування:

    Команда call дозволяє організувати гнучку і багатоваріантних передачууправління на підпрограму зі збереженням адреси точки повернення.

    О б ъ е к т н и й к о д (чотири формату):

    Пряма адресація в сегменті: < p> | 11101000 | disp-low | diep-high |

    Непряма адресація в сегменті:

    | 11111111 | mod010r/m |

    Непряма адресація між сегментами :

    | 11111111 | mod011r/m |

    Пряма адресація між сегментами:

    | 10011010 | offset-low | offset-high | seg-low | seg -high |

    CMP

    (CoMPare operands)

    Порівняння операндів

    | Схема команди: | cmp операнд1, операнд2 |


    Призначення: порівняння двох операндів.
    Алгоритм роботи:

    . виконати віднімання (операнд1-операнд2);

    . в залежності від результату встановити прапори, операнд1 і операнд2 не змінювати (тобто результат не запам'ятовувати).
    Стан прапорів після виконання команди:


    Призначення: зменшення значення операнда в пам'яті або регістрі на 1.
    Алгоритм роботи:

    команда віднімає 1 з операнда. Стан прапорів після виконання команди:


    Призначення: виконання операції ділення двох двійкових беззнакових значень.

    Алгоритм роботи:

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

    . якщо дільник розміром у байт, то ділене повинно бути розташоване в регістрі ax. Після операції приватне поміщається в al, а залишок - в ah;

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

    Після операції приватне поміщається в ax, а залишок - в dx;

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


    Призначення: виклик підпрограми обслуговування переривання з номеромпереривання, заданим операндом команди.
    Алгоритм роботи:

    . записати в стек регістр прапорів eflags/flags та адреса повернення. Під час запису адреси повернення спочатку записується вміст сегментного регістра cs, потім вміст покажчика команд eip/ip;

    . скинути в нуль прапори if і tf;

    . передати управління на програму обробки переривання з вказаним номером. Механізм передачі управління залежить від режиму роботи мікропроцесора.
    Стан прапорів після виконання команди:
    | 09 | 08 |
    | IF | TF |
    | 0 | 0 |


    Застосування:

    Як видно з синтаксису, існують дві форми цієї команди:

    . int 3 - має свій індивідуальний код операції 0cch і займає один байт. Ця обставина робить її дуже зручною для використання в різних програмних відладчика для встановлення точок переривання шляхом підміни першого байта будь-якої команди. Мікропроцесор, зустрічаючи в послідовності команд команду з кодом операції 0cch, викликає програму обробки переривання з номером вектора 3, яка служить для зв'язку з програмним відладчиком.

    . Друга форма команди займає два байти, має код операції 0cdh і дозволяє ініціювати виклик підпрограми обробки переривання з номером вектора в діапазоні 0-255. Особливості передачі управління, як було зазначено, залежать від режиму роботи мікропроцесора.
    О б ъ е к т н и й к о д (два формати):

    Регістр: | 01000reg |

    Регістр або пам'ять: | 1111111w | mod000r/m |

    JCC

    JCXZ/JECXZ

    (Jump if condition)

    (Jump if CX = Zero/Jump if ECX = Zero)

    Перехід, якщо виконана умова

    Перехід, якщо CX/ECX дорівнює нулю

    | Схема команди: | jcc мітка |
    | | Jcxz мітка |
    | | Jecxz мітка |


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

    Алгоритм роботи команд (крім jcxz/jecxz):

    Перевірка стану прапорів у залежності від коду операції (воно відображаєперевіряємо умови):

    . якщо перевіряється умова істинно, то перейти до комірки, позначеної операндом;

    . якщо перевіряється умова неправдиво, і передати управління наступній команді.
    Алгоритм роботи команди jcxz/jecxz:

    Перевірка умови рівності нулю вмісту регістра ecx/cx:

    . якщо перевіряється умова істинно, тобто вміст ecx/cx дорівнює 0, то перейти до комірки, позначеної операндом мітка;

    . якщо перевіряється умова помилково, тобто вміст ecx/cx не дорівнює 0, то передати управління наступної за jcxz/jecxz команді програми.
    Стан прапорів після виконання команди:
    | JA | CF = 0 і ZF = 0 | якщо вище |
    | JAE | CF = 0 | якщо вище або дорівнює |
    | JB | CF = 1 | якщо нижче |
    | JBE | CF = 1 або ZF = 1 | якщо нижче або дорівнює |
    | JC | CF = 1 | якщо перенесення |
    | JE | ZF = 1 | якщо одно |
    | JZ | ZF = 1 | якщо 0 |
    | JG | ZF = 0 і SF = OF | якщо більше |
    | JGE | SF = OF | якщо більше або дорівнює |
    | JL | SF OF | якщо менше |
    | JLE | ZF = 1 або SF OF | якщо менше або дорівнює |
    | JNA | CF = 1 і ZF = 1 | якщо не вище |
    | JNAE | CF = 1 | якщо не вище або дорівнює |
    | JNB | CF = 0 | якщо не нижче |
    | JNBE | CF = 0 і ZF = 0 | якщо не нижче або дорівнює |
    | JNC | CF = 0 | якщо немає переносу |
    | JNE | ZF = 0 | якщо не дорівнює |
    | JNG | ZF = 1 або SF OF | якщо не більше |
    | JNGE | SF OF | якщо не більше або дорівнює |
    | JNL | SF = OF | якщо не менше |
    | JNLE | ZF = 0 і SF = OF | якщо не менше або дорівнює |
    | JNO | OF = 0 | якщо немає переповнення |
    | JNP | PF = 0 | якщо кількість одиничних бітів результату |
    | | | Непарній (непарний паритет) |
    | JNS | SF = 0 | якщо знак плюс (знаковий (старший) біт |
    | | | Результату дорівнює 0) |
    | JNZ | ZF = 0 | якщо немає нуля |
    | JO | OF = 1 | якщо переповнення |
    | JP | PF = 1 | якщо кількість одиничних бітів результату |
    | | | Парному (парний паритет) |
    | JPE | PF = 1 | те ж, що і JP, тобто парний паритет |
    | JPO | PF = 0 | те ж, що й JNP |
    | JS | SF = 1 | якщо знак мінус (знаковий (старший) біт |
    | | | Результату дорівнює 1) |
    | JZ | ZF = 1 | якщо нуль |


    Логіка умови "більше" і "менше" відносяться до порівнянь цілочисельнихзначень зі знаком, а "вище і" нижче "- до порівнянь цілочисельних значеньбез знака. Якщо уважно подивитися, то у багатьох команд можна помітитиоднакові значення прапорів для переходу. Це пояснюється наявністюкількох ситуацій, які можуть викликати однакову стан прапорів. Уцьому випадку з метою зручності асемблер допускає кілька різнихмнемонічних позначень однієї і тієї ж машинної команди умовногопереходу. Ці команди асемблера за дією абсолютно рівнозначні, тому щоце одна й та ж машинна команда. Спочатку в мікропроцесорі i8086команди умовного переходу могли здійснювати тільки короткі переходи вмежах -128 ... 127 байт, рахуючи від наступної команди. Починаючи змікропроцессора i386, ці команди вже могли виконувати будь-які переходи вмежах поточного сегмента команд. Це стало можливим за рахунок введення всистему команд мікропроцесора додаткових машинних команд. Дляреалізації межсегментних переходів необхідно комбінувати командиумовного переходу і команду безумовного переходу jmp. При цьому можнаскористатися тим, що практично всі команди умовного переходу парні,тобто мають команди, що перевіряють зворотні умови.

    Застосування jcxz/jecxz:
    | Команд | Стан прапорів у | Умова переходу |
    | а | eflags/flags | |
    | JCXZ | не впливає | якщо регістр |
    | | | CX = 0 |
    | JECXZ | не впливає | якщо регістр |
    | | | ECX = 0 |


    Команду jcxz/jecxz зручно використовувати з усіма командами, які використовуютьрегістр ecx/cx для своєї роботи. Це команди організації циклу і цепочечниекоманди. Дуже важливо відзначити те, що команда jcxz/jecxz, на відміну відінших команд переходу, може виконувати тільки близькі переходи в межах
    -128 ... 127 байт, рахуючи від наступної команди. Тому для неї особливоактуальна проблема передачі управління далі як в зазначеному діапазоні. Дляцього можна залучити команду безумовного переходу jmp. Наприклад, командуjcxz/jecxz можна використовувати для попередньої перевірки лічильника циклу врегістрі cx для обходу циклу, якщо його лічильник нульовий.

    JMP

    (JuMP)

    Перехід безумовний

    | Схема команди: | jmp мітка |


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

    Команда jmp в залежності від типу свого операнда змінює вміст аботільки одного регістру eip, або обох регістрів cs і eip:

    . якщо операнд в команді jmp - мітка в поточному сегменті команд (a8, 16,

    32), то асемблер формує машинну команду, операнд якої є значенням зі знаком, що є зміщенням переходу щодо наступної за jmp команди. При цьому виді переходу змінюється тільки регістр eip/ip;

    . якщо операнд в команді jmp - символічний ідентифікатор елементу пам'яті

    (m16, 32, 48), то асемблер припускає, що в ній знаходиться адресу, за якою необхідно передати управління. Ця адреса може бути трьох видів: o значенням абсолютного зміщення мітки переходу щодо початку сегменту коду. Величина цього зміщення може бути 16 або 32 біт у залежності від режиму адресації; o далеким покажчиком на мітку переходу в реальному та захищеному режимах, що містить два компоненти адреси - сегментний і зсув. Розміри цих компонентів також залежать від встановленого режиму адресації (use16 або use32). Якщо поточним режимом є use16, то адреса сегменту та зміщення займають по

    16 біт, причому зміщення розташовується у молодшому слові подвійного слова, що відводиться під цей повну адресу мітки переходу. Якщо поточним режимом є use32, то адреса сегменту та зміщення займають, відповідно, 16 і 32 біт, - у молодшому подвійному слові знаходиться зміщення, в старшому - адресу сегменту; o адресою в одному з 16

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status