Команди да работят със стъклото на асемблера. Екипна структура в програмирането на езика на асемблер на ниво

1. Архитектура PC .............................................. ........................... 5.

    1.1. Регистрите.

    1.1.1 Общи регистри.

1.1.2. Регистрите на сегмента

1.1.3 Регистър на флаговете

1.2. Организация на паметта.

1.3. Представяне на данни.

1.3.1 Видове данни.

1.3.2 Представяне на символи и линии

2. Програмирани оператори на асемблер ..............................................

    1. Екипи на асемблерния език

2.2. Режими на адресиране и формати на команди на машината

3. Pseudo оператори .............................................. ......................

3.1 Директиви за определяне на данни

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

3.2.1 Софтуерни сегменти. Директивата предполага

3.2.3 Опростена директива за сегментиране

4. Монтаж и оформление на програмата ................................

5. Команди за прехвърляне на данни ............................................... .........

    5.1 Общи команди

    5.2 Работни екипи с стека

5.3 I / O Команди

5.4 Команди за прехвърляне на адрес

5.5 Екипи за доставка на флаг

6. Аритметични екипи .............................................. ...........

    6.1 Аритметични операции над цели двоични номера

6.1.1 Добавяне и изваждане

6.1.2 Екипи на увеличаване и намаляване на приемника на единица

6.2 Умножение и разделение

6.3 Промяна на знака

7. Логически операции ................................................ ................

8. смени и циклични смени ............................................ ....

9. Струнни операции .............................................. ....................

10. Логика и организация на програми ............................................. ..

10.1 Безусловни преходи

10.2 условни преходи

10.4 Процедури в асемблерния език

10.5 прекъсвания int.

10.6 Системния софтуер

10.6.1.1 Прочетете клавиатурата.

10.6.1.2 Изход от символи на екрана

10.6.1.3 Приключване на програми.

10.6.2.1 Избор на режим на показване

11. Диск памет ................................................ ......................... ..

11.2 Таблица за разпределение на файлове

11.3 I / O операции на диск

11.3.1 Запис на файла на диск

11.3.1.1 Данни в ASCIZ формат

11.3.1.2 Номер на файла.

11.3.1.3 Създаване на дисков файл

11.3.2 Четене на диска файл

Въведение

Езикът на асемблер е символично представяне на езика на машината. Всички процеси в персоналния компютър (PC) на най-ниското ниво на хардуера се управляват само от команди (инструкции) на езика на машината. За да решите проблемите, свързани с оборудването (или дори, освен това, в зависимост от оборудването, като например подобряване на скоростта на програмата), това е невъзможно без познаването на асемблера.

Асемблерът е удобна форма на команди директно за компютърния компонент и изисква познания за свойствата и възможностите на интегралния чип, съдържащ тези компоненти, а именно компютърно микропроцесорът. По този начин езикът на асемблер е пряко свързан с вътрешната организация на компютъра. И това не е случайно, че почти всички компилатори на езици на високо равнище поддържат достъп до нивото на програмиране на асемблер.

Необходим е елемент на професионален професионалист за обучение, за да се изследва асемблер. Това се дължи на факта, че програмирането на асемблер изисква познания за архитектурата на компютъра, което ви позволява да създавате по-ефективни програми на други езици и да ги комбинирате с програмите за асемблер.

Ръководството адресира проблемите на програмиране в асемблерния език за компютри, базирани на Intel микроприцесори.

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

    PC архитектура.

Компютърната архитектура е абстрактно представяне на компютър, който отразява неговата структурна, схема и логическа организация.

Всички съвременни компютри имат някои общи и индивидуални свойства на архитектурата. Отделните свойства са присъщи само на специфичен компютърен модел.

Концепцията за архитектура на компютъра включва:

    структурна схема на компютрите;

    средства и методи за достъп до елементи на структурната схема на ЕММ;

    набор и наличие на регистри;

    организация и начини за справяне;

    метод за представяне и формат на компютърни данни;

    комплект за команди на машината;

    машини;

    прекъсване на прекъсвания.

Основните елементи на компютърния хардуер са: системна единица, клавиатура, дисплейни устройства, устройства, устройства за печат (принтер) и различни средства за комуникация. Системното устройство се състои от дънна платка, захранване и удължителни клетки за допълнителни дъски. Системната платка съдържа микропроцесор, постоянна памет (ROM), RAM (RAM) и Coprocessor.

      Регистрите.

Вътре в микропроцесора информацията се съдържа в група от 32 регистри (16 потребител, 16 система), по един или това е на разположение на програмиста. Тъй като ръководството е посветено на програмирането за микропроцесор 8088-I486, след това логично да започне тази тема от дискусията на вътрешните регистри на микропроцесора, наличен за потребителя.

Потребителските регистри се използват от програмист за записване на програми. Тези регистри включват:

    осем 32-битови регистри (регистри на общо предназначение) EAX / AX / AH / AL, EBX / BX / BH / BL, ECX / CX / CH / CL, EDX / DX / DLH / DL, EDX / BP, ESI / SI, \\ t EDI / DI, ESP / SP;

    шест 16 -, моторни регистри: CS, DS, SS, ES, FS, GS;

    регистриране на статуса и управлението: Регистрация на флагове EFLAGS / FLAGS и EIP / IP командващ указател регистър.

Чрез наклонената линия има части от един 32-битов регистър. Префикс E (разширен) означава използването на 32-закален регистър. За работа с байтове се използват регистри с префикси L (ниски) и Н (високи), например, ал, СН - обозначаващи по-младите и старши байтове от 16-битови части на регистрите.

        Регистрите с общо предназначение.

EAX / AX / AH / AL (регистър на акумулатора) - батерия. Използва се при умножаване и разделяне, в I / O операции и в някои операции над линии.

EBX / BX / BH / BL - основен регистър (Базов регистър), често се използва при адресиране на данни в паметта.

ECX / CX / CH / CL - брояч (Графския регистър), се използва като редица броя на повтарянето на цикъла.

EDX / DX / DH / DL - регистър на данните (Регистър на данните), използван за съхранение на междинни данни. В някои отбори, използвайте е необходимо.

Всички регистри на тази група ви позволяват да се обърнете към вашите "по-млади" части. Използвайте за самостоятелно адресиране Можете само по-млади 16- и 8-битови части от тези регистри. По-старите 16 бита на тези регистри като независими обекти не са налични.

За поддържане на команди за обработка на реда, които позволяват последователната обработка на вериги от елементи на с дължина 32, 16 или 8 бита:

ESI / SI (регистър на индекса на източника) - индекс източник. Съдържа адреса на текущия елемент на източника.

EDI / DI (регистър на индекса на дигитацията) - индекс приемник (Получател). Съдържа текущ адрес в низ в приемника.

В архитектурата на микроприцесора, структурата на данните се поддържа на ниво софтуер и хардуер - стек. За да работи с стека, има специални екипи и специални регистри. Трябва да се отбележи, че стекът е попълнен в посоката на по-малките адреси.

ESP / SP (регистър на показалеца на стека) - регистрирам указател стека. Съдържа стека Vergex в текущия сегмент на стека.

EBP / BP (регистър на базовите показалеца) - регистър на основата на стека. Проектиран да организира произволен достъп до данните в стека.

1.1.2. Регистрите на сегмента

В модела на микропроцесора има шест регистри на сегмента: CS, SS, DS, ES, GS, FS. Тяхното съществуване се дължи на спецификата на организацията и използването на микропроцесорите на Intel. Хардуер за микропроцесор подпомага структурната организация на програма, състояща се от сегменти. За да определите сегментите в момента, в момента са предназначени регистрите на сегмента. Микропроцесорът поддържа следните видове сегменти:

    Сегмент на кода.Съдържа програмните команди за достъп до този сегмент, се сервира регистъра на CS (регистър на сегмента на кода) - регистър на сегментния код. Той съдържа адреса на сегмента с машини за машини, към които има достъп на микропроцесора.

    Сегмент на данни. Съдържа програмата, която се обработва. За достъп до този сегмент се обслужва DS регистър (регистър на сегмента на данните) - регистър на сегментакойто съхранява адреса на сегмента на данните на текущата програма.

    Сегмент на стека. Този сегмент е област на паметта, наречена стека. Микропроцесорът организира стека според принципа - първият "дойде", първото "ляво". За достъп до стека служи като регистър SS (Stack Segment Register) - регистрация на сегментасъдържащ адреса на сегмента на стека.

    Допълнителен сегмент на данни. Преработените данни могат да бъдат все още в три допълнителни сегмента на данни. По подразбиране се приема, че данните са в сегмента на данните. Когато се използват допълнителни сегменти на данни, техният адрес трябва да бъде посочен изрично с помощта на специални сегментни префикси на редфикс в командата. Адресите на допълнителни сегменти на данни трябва да се съдържат в ES, GS, регистрите на FS (регистри на сегмента на разширенията).

        Регистрирайте се управлението и статуса

Микропроцесорът съдържа няколко регистри, които съдържат информацията за състоянието, като самата микропроцесор и програмите, чиито команди в момента са заредени в конвейера. То:

Регистър на указателя на EIP / IP;

    eFLAGS / FLAGS FLAGS се регистрира.

Използвайки тези регистри, можете да получите информация за резултатите от изпълнението на команди и да повлияете на състоянието на самия микропроцесор.

EIP / IP (ръководител на инструкции) - указател командите. Регистърът на EIP / IP има малко 32 или 16 бита и съдържа промяна на следващата команда към съдържанието по отношение на съдържанието на сегмента CS в текущия командния сегмент. Този регистър е недостъпен, но промяната се извършва от преходните команди.

EFLAGS / FLAGS (регистър на флага) - регистрирам флагове. Бети 32/16 бита. Отделни битове на този регистър имат определена функционална цел и се наричат \u200b\u200bфлагове. Знамето е малко, което приема стойността на 1 ("флаг"), ако е изпълнено определено състояние, а стойността на 0 ("флаг се нулира") в противен случай. Най-младата част от този регистър е напълно подобна на регистъра на знамената за i8086.

1.1.3 Регистър на флаговете

Регистърът на флага е 32-битов, има името eflags (фиг. 1). Отделни регистърите имат определена функционална цел и се наричат \u200b\u200bфлагове. Всеки от тях е назначил специално име (ZF, CF и др.). По-младите 16 бита ефлагове представляват 16-битовите флагове Регистърът, използван при изпълнението на програми, написани за микропроцесор I086 и I286.

Фиг.1 Регистър на флаговете

Някои флагове са одобрени от знамената на условията; Те автоматично се променят при извършване на команди и записват тези или други свойства на своя резултат (например, това е нула). Други флагове се наричат \u200b\u200bдържавни флагове; Те се променят от програмата и влияят върху по-нататъшното поведение на процесора (например, блокиращи прекъсвания).

Флагове Условия: \\ t

CF (носете флаг) - транспорт флаг. Има стойност 1, ако, когато се появи единица за интегриране, се появи прехвърляща единица, не "трясък" в изпускателната мрежа или ако при изваждане на номера без знак, първият от тях е по-малък от втория. В командването на Shift в CF се въвежда бит, пуснат за решетката за разреждане. CF също така записва характеристиките на командата за умножение.

На (флаг на преливане) - препълване на флага. Той е инсталиран в 1, ако при добавяне или изваждане на цели числа със знамето се оказа резултатът, модулът е по-добър от допустимата стойност (настъпилия Overflow на Mantissa и "се изкачи" на разтоварване на знака).

ZF (нулев флаг) - скреч флаг. Задайте в 1, ако резултатът от командата се оказа равен на 0.

Sf (знака) - флаг знак. Задайте в 1, ако отрицателен резултат се оказа за операции на номерата на иконите.

Pf (farity флаг) - флаг паритет. Равен на 1, ако резултатът от следващата команда съдържа равномерно количество двоични единици. Обикновено се взема предвид при операции I / O.

Спомагателен флаг за носене - знаме на допълнителен трансфер. Поправя характеристиките на извършване на операции през двоични десетични числа.

Знамения на състоянието:

Df (флаг на посоката) - знаме на посока. Задава посоката на разглеждане на редове в низови команди: в DF \u003d 0 линиите се разглеждат "напред" (от началото до края), с DF \u003d 1 - в обратна посока.

Iopl (ниво на входно / изходно привилегия) - ниво на привилегии I / O.Използва се в защитения режим на микропроцесора, за да контролира достъпа до I / O командите, в зависимост от привилегията на задачата.

NT (вложена задача) - флаг за гнездене на задачи.Използва се в защитения режим на работа на микропроцесора, за да се определи факта, че една задача е вградена в друга.

Системен флаг:

Ако (флаг на междуръщане) - прекъсване флаг. При IF \u003d 0, процесорът престава да реагира на прекъсва входящо към него, когато IF \u003d 1, прекъсването на заключването се отстранява.

TF (флаг на капан) - проследете флаг. Когато TF \u003d 1, след изпълнението на всяка команда, процесорът се прекъсва (с номер 1), отколкото можете да използвате, когато отстранявате отстраняването на програма за нейната следа.

RF (възобновяване на знамето) - знаме на подновяване. Използвани при обработката прекъсвания от регистрите на грешки.

VM (режим Virtual 8086) - виртуален флаг 8086. 1-процесорът работи във виртуален 8086 режим. Процесорът работи в реален или защитен режим.

AC (проверка на подравняването) - флаг за контрол на подравняването. Предназначени за разрешаване на контрола на подравняването при достъп до паметта.

      Организация на паметта.

Наречена е физическа памет, към която микропроцесорът има достъп овен (или работно устройство за съхранение - RAM). RAM е верига от байтове, които имат свой собствен уникален адрес (номер), наречен физически. Обхватът на стойностите на физическите адреси от 0 до 4 GB. Механизмът за управление на паметта е напълно хардуер.

Микропроцесорният хардуер поддържа множество модели на използване на RAM:

    сегментиран модел. В този модел паметта за програми е разделена на непрекъснати области на паметта (сегменти) и самата програма може да обжалва само данните, които са в тези сегменти;

    модел на страницата. В този случай RAM се счита за набор от блокове с фиксиран размер от 4 KB. Основната употреба на този модел е свързана с организацията на виртуалната памет, която позволява използването на паметта на паметта да работи повече от количеството на физическата памет. За микропроцесора на Pentium, размерът на възможната виртуална памет може да достигне 4 TB.

Използването и прилагането на тези модели зависи от начина на работа на микропроцесора:

    Режим на реални адреси (реален режим). Режимът е подобен на процесора i8086. Ние сме необходими за функционирането на програмите, разработени за ранни модели на процесора.

    Защитено режим. В защитен режим, възможността за обработка на много задачи, защита на паметта с помощта на механизъм за привилегия с четири нива и нейната организация на страници.

    Virtual 8086 режим. В този режим възможността да работят няколко програми за i8086. В същото време е възможна операцията на реални режима.

Сегментацията е механизмът за адресиране, който осигурява съществуването на няколко независими целеви пространства. Сегментът е независим, поддържан в хардуерното ниво на блока на паметта.

Всяка програма в общия случай може да се състои от произволен брой сегменти, но директен достъп, който има до три основни: код, данни и стак - и от един до три допълнителни данни. Операционната система поставя програмните сегменти в RAM на определени физически адреси, след което поставя стойностите на тези адреси до съответните регистри. Вътре в сегмента програмата се отнася до адреси по отношение на началото на сегмента линейно, т.е. започва от адреса 0 и завършва с адреса, равен на размера на сегмента. Относителен адрес или пристрастие,който микропроцесорът използва за достъп до данните в сегмента, се нарича ефективни.

Формиране на физическия адрес в реалния режим

В реален режим, обхватът на промените във физическия адрес от 0 до 1 MB. Максимален размер на сегмента 64 KB. Когато се свържете с конкретен физически адрес RAM се определя от адреса на началото на сегмента и отместването в сегмента. Адресът на сегмента на сегмента се взема от съответния сегмент регистър. В същото време сегментният регистър съдържа само по-старите 16 бита на физическия адрес на началото на сегмента. Липсващите младши четири бита на 20-битов адрес се получават чрез преместване на стойността на сегментарния регистър вляво до 4 освобождаване от отговорност. Работата смяна се извършва хардуер. Получената 20-битова стойност е настоящият физически адрес, съответстващ на началото на сегмента. I.e. физически адрес На стойност "сегмент: офсет", където "сегментът" (сегментът) е първият, който е първият пост на първоначалния адрес на паметта, към който персоналът и "офсет" - 16-битовия адрес на тази клетка, Преброено от началото на този сегмент на паметта (16 * сегмент + отместването дава абсолютния мобилен адрес). Ако, например в регистъра на CS, стойността на 1234 часа се съхранява, след това адресната двойка 1234H: 507H определя абсолютния адрес, равен на 16 * 1234H + 507H \u003d 12340H + 507H \u003d 12847H. Такава двойка се записва под формата на двойна дума и (както и за номера) в "обърната" форма: в първата дума, има смяна и сегментът е поставен и всяка от тези думи е представени в "обърната" форма. Например, двойка 1234h: 5678H ще бъде записана като тази: | 78 | 56 | 34 | 12 |.

Този механизъм за формиране на физическия адрес ви позволява да направите софтуер, който да бъде преместен, т.е. неспецифични адреси за изтегляне в RAM.

За да може машината да изпълнява отбора на човек на нивото на хардуера, е необходимо да се определи определена последователност от действия на езика на "Ноликов и единици". Асистентът в този бизнес ще бъде асемблер. Това е помощна програма, която работи с прехвърлянето на команди до езика на машината. Написването на програмата обаче е много време и сложен процес. Този език не е предназначен за създаване на бели дробове и прости действия. В момента, използван език за програмиране (асемблер работи добре) ви позволява да пишете специални ефективни задачи, които силно влияят върху работата на хардуера. Основната цел е да се създадат микрооканди и малки кодове. Този език дава повече възможности, отколкото например, Pascal или C.

Кратко описание на асемблерните езици

Всички езици за програмиране са разделени от нива: ниско и високо. Всяка от синтактичната система на "семейството" на асемблера е различна в това, че се обединява едновременно с някои предимства на най-често срещаните и съвременни езици. С други хора, техните роднини и факта, че компютърната система може да бъде напълно използвана.

Отличителна черта на компилатора е простотата за използване. Тя се различава от тези, които работят само с високи нива. Ако вземете под внимание всеки такъв език за програмиране, асемблерът функциите два пъти по-бързо и по-добре. За да напишете светлинна програма в нея, твърде много време няма да се нуждае.

Накратко за структурата на езика

Ако говорим като цяло за работата и структурата на функционирането на езика, можете да кажете със сигурност, че неговите команди напълно отговарят на екипите на процесора. Това означава, че асемблерът използва mnemokodes, най-удобното лице да записва.

За разлика от други езици за програмиране, асемблерът използва определени маркери, за да записва клетките на паметта вместо адреси. Те са преведени в така наречените директиви. Това са относителни адреси, които не засягат функционирането на процесора (не се превежда на езика на машината) и е необходимо да се разпознае самата програмиране на средата.

За всяка линия на процесора, има своя собствена с тази ситуация, че е правилно, включително преведено

Езикът на асемблер има няколко синтаксиса, които ще бъдат обсъдени в статията.

Плюсове на езика

Най-важното и удобно адаптиране на асемблерния език ще бъде, че е възможно да се напише програма за процесор, който ще бъде много компактен. Ако кодът се окаже огромен, тогава някои процеси пренасочват към RAM. В същото време те правят всичко бързо и без неуспехи, освен ако разбира се, те контролират квалифициран програмист.

Водачите, операционните системи, биосите, компилаторите, преводачите и др. - Това е цялата програма в асемблерния език.

Когато използвате разстройство, което прави превод от машината в едно, възможно е лесно да се разбере как работи една или друга задача на системата, дори ако няма обяснение. Това обаче е възможно само ако програмите са светли. За съжаление, в нетривни кодове, е доста трудно да се разбере.

Дръпки езици

За съжаление, програмистите (и често професионалисти) са трудни за разглобяване на езика. Асемблерът изисква подробно описание на необходимата команда. Поради факта, че трябва да използвате команди на машината, вероятността за погрешни действия и сложността на изпълнението нараства.

За да напишете дори най-простата програма, програмистът трябва да бъде квалифициран и нивото на знание е достатъчно високо. Средният специалист, за съжаление, често пише лоши кодове.

Ако платформата, за която е създадена програмата, се актуализира, тогава всички команди трябва да бъдат копирани ръчно - това изисква самия език. Асемблерът не поддържа функцията на автоматичното регулиране на работата на процесите и замени всички елементи.

Екипи на език

Както вече споменахме по-горе, всеки процесор има свой собствен набор от команди. Най-простите елементи, които са признати от всеки тип, са следните кодове:


Използване на директиви

Програмиране на микроконтролери на езика (асемблер Това позволява и перфектно се справя с функционирането) на най-ниското ниво в повечето случаи успешно приключва. Най-добре е да се използват процесори с ограничен ресурс. За 32-битови техники този език е подходящ. Често в кодекси можете да видите директиви. Какво е това? И за какво се използва?

За да започнем, е необходимо да се подчертае факта, че директивите не се прехвърлят на езика на машината. Те регулират работата на компилатора. За разлика от команди, тези параметри, притежаващи различни функции, се различават не поради различни процесори, но за сметка на друг преводач. Сред основните директиви могат да бъдат разпределени, както следва:


Произход на име

Благодарение на името на езика - "Асемблер"? Говорим за преводача и компилатора, който също произвежда криптиране на данни. От английския асемблер означава нищо друго освен колекционер. Програмата не се събира ръчно, използва се автоматична структура. Освен това в момента потребителите и специалистите са изтрили разликата между условията. Често езиците за програмиране на асемблерните обаждания, въпреки че това е само полезност.

Благодарение на общоприетото събиране, някои имат погрешно решение, че има едно ниско ниво на език (или стандартни норми за него). За да може програмист да разбере каква структура е, е необходимо да се уточни, за коя платформа се използва един или друг асемблер.

Macrofs.

Асемблерните езици, които са създадени сравнително наскоро, имат Macrosses. Те улесняват както правописа, така и изпълнението на програмата. Благодарение на присъствието им, преводачът изпълнява писмения код по време на време. Когато създавате условен избор, можете да напишете огромен блок от екипи и е по-лесно да използвате макроси. Те бързо ще превключват между действия, ако състоянието или неизпълнението е изпълнението.

Когато използвате директиви за макроезика, програмистът получава макроси от асемблер. Понякога може да се използва широко, а понякога функционалните му функции се свеждат до една команда. Тяхното присъствие в кода улеснява работата с нея, прави това по-разбираемо и визуално. Въпреки това трябва да се внимава да бъде внимателен - в някои случаи макросите, напротив, влошават ситуацията.

Тема 1.4 Асемблер Мнемоничен. Структура и формати на команди. Видове адресиране. Микропроцесорна екипна система

План:

1 Език на асемблер. Основни понятия

2 Символи на символите за асемблер

3 вида оператори на асемблер

4 Директиви за асемблер

5 Система за командване на процесора

1 J.zYK асемблер. Основни понятия

Асемблер - Това е символично представяне на езика на машината. Всички процеси в машината на най-ниското ниво на хардуера се движат само от команди (инструкции) на машинния език. Ясно е, че въпреки общото име, асемблерният език за всеки тип компютър.

Асемблерната програма е комбинация от блокове с памет, наречена сегменти на паметта.Програмата може да се състои от един или повече такива блокови сегменти. Всеки сегмент съдържа набор от езикови предложения, всяка от които заема отделен ред от програмния код.

Асемблерните оферти са четири вида:

1) команди или инструкции, Представяне на символични аналози на команди на машината. В процеса на излъчване, инструкциите за асемблер се трансформират в съответните команди на командната система на микропроцесора;

2) макрокоманди -декорирани по определен начин на текстовите предложения на програмата, заменени по време на излъчването от други предложения;

3) директивииндикация на преводача на асемблера за извършване на определени действия. Директивите нямат аналози в представянето на машината;

4) редове коментари съдържащи всички символи, включително буквите на руската азбука. Коментарите се игнорират от преводача.

­ Програмна структура на асемблер. Синтаксис на асемблер.

Предложенията, които съставляват програмата, могат да бъдат синтактически дизайн, съответния екип, макрокомандата, директивата или коментар. За да ги признаят от преводача на асемблер, те трябва да бъдат формирани от определени синтактични правила. За да направите това, най-добре е да използвате официално описание на синтаксиса на езика като правилата на граматиката. Най-често срещаните начини за такова описание на програмния език - синтактични графики и разширени форми на Бакуса Наура. За практическо използване по-удобно синтактични графики.Например, синтаксисът на асемблерните предложения може да бъде описан с помощта на синтактични диаграми, показани на следните фигури 10, 11, 12.

Фигура 10 - Формат на офертата за асемблер


­ Фигура 11 - Форматирайте директивите

­ Фигура 12 - Екип и макроси

На тези чертежи:

­ име Тагове - идентификатора, чиято стойност е адресът на първия байт на това предложение на изходния текст на програмата, който обозначава;

­ име - Идентификаторът разграничава тази директива от други директиви на същите имена. В резултат на обработващия асемблер, специфична директива може да бъде присвоена на определени характеристики;

­ оперативен код (CPA) и Директива - Това са мнемонични наименования на съответния машинен екип, макроси или директиви за преводач;

­ операнди - Части от екипа, макромандват или директиви за асемблер, означаващи обекти, над които са направени действия. Асемблерните операнди са описани чрез изрази с числови и текстови константи, марки и идентификатори на променливи, използвайки операции и някои запазени думи.

Помощ за синтактични диаграми намерете и след това преминете по пътя от регистрацията на графиката (вляво) до неговия изход (вдясно). Ако този път съществува, предложението или дизайнът е синтактично правилен. Ако няма такъв път, това означава, че компилаторът няма да приеме този дизайн.

­ 2 символа за асемблер

Допустими символи при писането на текстови текстове са:

1) всички латински букви: A-z., A-z.. В този случай капиталът и малки букви се считат за еквивалентни;

2) Числа от 0 преди 9 ;

3) Знаци ? , @ , $ , _ , & ;

4) разделители , . () < > { } + / * % ! " " ? = # ^ .

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

Lexemes. са:

1) идентификатори - Последователности от допустими символи, използвани за обозначаване на такива обекти, като операционни кодове, имена на променливи и име на етикета. Правилото за запис на идентификатор е както следва: идентификаторът може да се състои от един или повече знака;

2) вериги от символи - последователности от символи, затворени в единични или двойни кавички;

3) цяла булва на една от следните системи за допълнително заплащане : двоичен, десетична, шестнадесетична. Идентифицирането на номерата при записването им в програмите за асемблер се извършва съгласно определени правила:

4) Десетични числа не изискват допълнителни знаци за идентифициране на всички допълнителни знаци, например 25 или 139. Да се \u200b\u200bидентифицират в изходния текст на програмата двоични числа Необходимо е след записване на нули и единици, включени в техния състав, да поставят латински " б.", Например 10010101 б..

5) шестнадесетичните числа имат повече конвенции в записа си:

Първо, те се състоят от числа 0...9 , малки и главни букви на латинската азбука а., Б., ° С., Д., Д., Е. или А., Б., ° С., Д., Д., Е..

Второ, преводачът може да има затруднения с признаването на шестнадесетични номера поради факта, че те могат да се състоят от някои числа 0 ... 9 (например 190845), така че започнете с буквата на латинската азбука (например, eF15.). За да "обяснят" преводача, че това Lexeme не е десетично число или идентификатор, програмистът трябва специално да разпредели шестнадесетичен номер. За да направите това, в края на последователността на шестнадесетични числа, които съставляват шестнадесетично число, напишете латинското писмо " х.". Това е предпоставка. Ако шестнадесетичният номер започне с писмото, водещата нула се записва пред него: 0 eF15. h.

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

Възможно е да се извърши следната класификация на операндите:

­ постоянни или директни операнди;

­ адресни операнди;

­ прехвърлени операнди;

Адресен метър;

­ регистър операнд;

­ основни и индексни операнди;

­ структурни операнди;

Записи.

Операндите са елементарни компоненти, от които се формира част от командата на машината, обозначавайки обекти, върху които се извършва операцията. В по-общ случай операндите могат да включват като част от по-сложното образование, наречено изрази.

Изрази има комбинации от операнди и оператори, считани за цяло. Резултатът от изчисляването на изразяването може да бъде адресът на определена клетка с памет или някаква постоянна (абсолютна) стойност.

­ 3 вида оператори на асемблер

Ние изброяваме възможните типове асемблерни оператори и синтактични правила за формиране на асемблерни изрази:

­ аритметични оператори;

­ оператори на смени;

­ оператори на сравнение;

­ логически оператори;

­ индекс оператор;

­ оператор на предефиниране на типа;

­ предефиниране на оператора на сегмента;

­ именуване на тип оператор на структурата;

­ оператор за получаване на сегментния компонент на адреса на израза;

­ оператор за получаване на изместване на израз.

1 Асемблерни директиви

­ Асемблерните директиви са:

1) Директиви за сегментиране. През предишната дискусия открихме всички основни правила за записване на екипи и операнди в програмата "Асемблер". Въпросът остава въпросът как да се създаде поредица от команди правилно, така че преводачът да може да ги обработва и микропроцесорът трябва да изпълни.

Когато обмисляте архитектурата на микропроцесора, научихме, че има шест сегмента, чрез които тя може едновременно да работи:

­ с един кодов сегмент;

­ с един сегмент на стека;

­ с един сегмент за данни;

­ с три допълнителни сегмента на данни.

Физически сегмент е зона за памет, заета от команди и (или) данни, чиито адреси се изчисляват по отношение на стойността в съответния сегмент регистър. Синтактичното описание на сегмента на асемблера е дизайн, показан на фигура 13:


­ Фигура 13 - Синтаксис Описание на сегмента на асемблера

Важно е да се отбележи, че функционалната цел на сегмента е малко по-широка от простото разбиване на програмата на блокове от код, данни и стека. Сегментацията е част от по-общ механизъм, свързан с концепция за модулно програмиране. Тя включва обединение на дизайна на обектните модули, създадени от компилатора, включително от различни езици за програмиране. Това ви позволява да комбинирате програми, написани на различни езици. За изпълнението на различни варианти за такава асоциация и операнд в директивата за сегмента са предназначени.

2) Директиви за управление на персонал. Директивите за управление на вписването са разделени на следните групи:

­ директиви за управление на общите линии;

­ изходните директиви в списъка на включени файлове;

­ условно блокиране на сглобяването на блокиране;

­ изходни директиви в списъка на макрокоманд;

­ вписване на информация за списъка с препратки;

­ изброяване на директивите за промяна на формата.

2 Командна система на процесора

Системата за командване на процесора е представена на фигура 14.

Помислете за основните групи от екипи.

­ Фигура 14 - Класификация на асемблерните команди

Отборите са:

1 команди за прехвърляне на данни. Тези команди заемат много важно място в системата на команди на всеки процесор. Те изпълняват следните основни функции:

­ спестяване в памет на съдържанието на вътрешните регистрите на процесора;

­ копиране на съдържание от една област на паметта към друга;

­ писане на I / O устройства и четене от I / O устройства.

В някои процесори всички тези функции се изпълняват от един единствен екип.Mov. (за байт пратки -Movb. ) но с различни методи за адресиране на операнди.

В други процесори, в допълнение към екипаMov. Има още няколко команди за извършване на изброените функции. Също така, команди за прехвърляне на данни включват команди за споделяне на информация (тяхното определяне се основава на думаОбмяна ). Може да има обмен на информация между вътрешните регистри, между две половина от един регистър (Размяна ) или между регистъра и клетката на паметта.

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

­ фиксирани запетая (добавяне, изваждане, умножение, разделяне);

­ плаващи полукълъни (добавяне, изваждане, умножение, разделяне);

­ команди за почистване;

­ команди за увеличаване и намаляване;

­ командата за сравнение.

3 фиксирани полукълки работят команди работа с кодове в регистрите на процесора или в паметта като конвенционални двоични кодове. Команди за операции с плаваща комуникация (точка) използват формата на представяне на числа с поръчка и мантиса (обикновено тези номера заемат две последователни клетки от паметта). В съвременните мощни процесори, набор от плаващи точки не се ограничават до четири аритъра и съдържа много други по-сложни команди, например, изчисляването на тригонометрични функции, логаритмични функции, както и сложни функции, необходими при обработка на звук и изображения.

4 Команди за почистване са предназначени да напишат нулев код в регистър или клетка с памет. Тези команди могат да бъдат заменени с командите за доставка на нулеви кодове, но специалните команди за почистване обикновено са по-бързи от командите за доставка.

5 увеличаващи се екипи (увеличаване на единица) и намаление

(Намаляването на единица) също е много удобно. Те могат да бъдат по принцип да заменят команди за сумиране с единица или изваждане на единица, но увеличението и намалението са по-бързи от сумирането и изваждането. Тези команди изискват един входен операнд, който е едновременно изходния операнд.

6 Командата за сравнение е предназначена да сравнява два входни операнда. По същество тя изчислява разликата в тези два операнда, но изходният операнд не се формира, а само променя битовете в държавния процесор в зависимост от това изваждане. Следната команда до командата за сравнение (обикновено това е команда за преход) ще анализира битовете в регистъра на състоянието на процесора и ще изпълнява действия в зависимост от техните стойности. Някои процесори осигуряват командвания за сравнение на веригата на две последователности на операнди в паметта.

7 логически команди. Логическите команди се извършват върху операнди логически (помисени) операции, т.е. те считат, че операнд кодира не като един номер, а като набор от индивидуални битове. Те се различават от аритметичните екипи. Логическите команди изпълняват следните основни операции:

­ логически и логически или, добавяне на модул 2 (с изключение на или);

­ логически, аритметични и циклични смени;

­ проверете битовете и операндите;

­ инсталиране и почистване на битове (флагове) на процесора държавен регистър (PSW).

Команди за операция на логиката ви позволяват да изчислите основните логически функции от два входни операнда. В допълнение, операцията и се използва за принудително почистване на посочените битове (като един от операндите, се използва кодът за маски, при който разтоварванията, които изискват почистване, са настроени на нула). Работа или прилагана за принудително монтиране на определени битове (като един от операндите, се използва кодексът за маски, при който разтоварванията, които изискват монтаж на единица, са равни на един). Операция "Healthing или" се използва за инвертиране на посочените битове (като един от операндите, се използва кодът за маски, при който битовете, които са обект на инверсии, са зададени на единица). Командите изискват два входни операнда и образуват един изходен операнд.

8 Команди за смени ви позволяват да смесите операндния код вдясно (към по-младите изхвърляния) или наляво (в посока на старши изхвърляния). Типът на смяна (логически, аритметичен или цикличен) определя коя ще бъде новата стойност на по-стария бит (когато преминаването вдясно) или по-младия (по време на преминаването наляво) и също така определя дали най-старата стойност на по-старият бит (когато преминаването наляво) се запазва някъде или по-млад бит (при преместване вдясно). Цикличните смени ви позволяват да преместите битовете на операндния код в кръг (по посока на часовниковата стрелка, когато превключването е правилно или обратно на часовниковата стрелка, когато сменянето наляво). В същото време, пръстенът за смяна може да влезе или да не въведе флаг за прехвърляне. В бит за скорост на предаване (ако се използва), стойността на по-стария бит се записва по време на цикличното преминаване наляво и по-младия по време на цикличното преминаване вдясно. Съответно, стойността на бита за флаг на прехвърлянето ще съответства на най-ниския разряд по време на цикличното преминаване наляво и в старши разряд по време на цикличното преминаване вдясно.

9 команди на преходи. Отборите за съвместими са проектирани да организират всички видове цикли, клонове, разговори към подпрограми и т.н., т.е. те нарушават серийния напредък. Тези команди се записват в командния регистър нов смисъл и по този начин се обаждат на прехода на процесора не към следващата команда, но за всяка друга команда в паметта на програмите. Някои команди на преходи осигуряват допълнително връщане обратно към точката, от която е направен преходът, други не предвиждат това. Ако възстановяването е осигурено, текущите параметри на процесора се съхраняват в стека. Ако възстановяването не е предвидено, текущите параметри на процесора не са запазени.

Сравни команди без възстановяване се разделят на две групи:

­ безусловни преходи;

­ общи екипи за пресичане.

В наименованията на тези команди се използват думиКлон (разклоняване) и скок (скок).

Команди на безусловните преходи предизвикват прехода към нов адрес, независимо от всичко. Те могат да повикат прехода към определената стойност на изместване (напред или назад) или към посочения адрес на паметта. Стойността на изместване или новата адресна стойност се посочва като входен операнд.

Условните преходни команди причиняват прехода не винаги, но само при извършване на посочените условия. Като такива условия стойностите на знамето в държавния регистър на процесора обикновено действат.PSW. ). Това означава, че условието за преход е резултат от предишната операция, която променя стойностите на флаговете. Общите условия на прехода могат да бъдат от 4 до 16. Няколко примера за условни преходни екипи:

­ преход, ако е нула;

­ преход, ако не е нула;

­ преход, ако има преливник;

­ преход, ако няма преливане;

­ преход, ако е повече нула;

­ преход, ако е по-малък или равен на нула.

Ако състоянието на прехода се изпълни, то се изтегля в новия регистър на стойността. Ако състоянието на прехода не е изпълнено, командният метър просто се увеличава и процесорът избира и изпълнява следната команда по ред.

Специално за проверка на условията на прехода, Командата за сравнение (SMR) се прилага пред предходната команда за условност (или дори няколко конвенционални преходни екипа). Но флаговете могат да бъдат инсталирани и всяка друга команда, като команда за предаване на данни, всяка аритметична или логическа команда. Трябва да се отбележи, че командите на преходния флаг не променят, че дава възможност да се постави няколко преходни команди един след друг.

Специално място сред преходните екипи е заета от команди за прекъсване. Тези команди като входен операнд изискват прекъсване на номера (вектор адрес).

Изход:

Езикът на асемблер е символично представяне на езика на машината. Език за асемблер за всеки тип компютър. Програмата за асемблер е набор от блокове с памет, наречени сегменти на паметта. Всеки сегмент съдържа набор от езикови предложения, всяка от които заема отделен ред от програмния код. Предложенията на асемблера са четири вида: екипи или инструкции, макроси, директиви, линии за коментари.

Всички латински букви са допустими при писането на текста на програмите: A-z., A-z.. В този случай капиталът и малки букви се считат за еквивалентни; Фигури от 0 преди 9 Шпакловка Знак ? , @ , $ , _ , & Шпакловка разделители , . () < > { } + / * % ! " " ? = # ^ .

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

Команната система е разделена на 8 големи групи.

­ Контролни въпроси:

1 Какво представлява асемблерният език?

2 Какви знаци могат да се използват за записване на команди на асемблера?

3 Какви са етикетите и тяхното назначение?

4 Изчислете структурата на асемблерните команди.

5 Избройте 4 вида асемблерни предложения.

Национален университет в Узбекистан на име Мирцо Улугбек

Факултет по компютърни технологии

На темата: семантичен анализ на EXE файла.

Изпълнени:

Ташкент 2003.

Предговор.

Език и структура на екипа.

EXE -FILE структура (семантичен анализ).

Структурата на компютъра.

Принципа на действие и разпространение на вируса.

Разглобяване.

Програми.

Предговор

Професията на програмист е невероятна и уникална. Днес науката и животът не могат да бъдат подадени без най-новата технология. Всичко, което е свързано с човешката дейност, не се извършва без компютърна технология. И това допринася за нейното голямо развитие и съвършенство. Нека развитието на лични компютри започва не толкова отдавна, но през това време имаше колосални стъпки за софтуерните продукти и за дълго време тези продукти ще бъдат широко използвани. Областта, свързана с знанието на компютрите, е претърпяла експлозия, както и съответната технология. Ако не вземете предвид търговско парти, тогава можем да кажем, че няма професионални дейности в тази област на професионална дейност. Много от тях развиват програми, а не за полза или доходи, но според собствената им воля, от страст. Разбира се, това не трябва да влияе върху качеството на програмата и по този въпрос, така да се каже "бизнес", има конкуренция и търсене на качеството на изпълнение, в стабилна работа и отговаря на всички изисквания на модерността. Тук си струва да се отбележи и външността на микропроцесорите през 60-те години, което дойде да замени големия брой лампи. Има някои разновидности на микропроцесори, които са много различни един от друг. Тези микропроцесори са различни един от друг на изпускателните и вградените системни екипи. Най-често като: Intel, IBM, Celeron, AMD и др. Всички тези процесори са свързани с развитата архитектура на Intel процесори. Разпространението на микрокомпютри е причината за преразглеждане на отношението към асемблерния език по две основни причини. Първо, програмите, написани в асемблерния език, изискват значително по-малко време за памет и изпълнение. Второ, знанието за асемблерния език и полученият машинен код дава разбиране на архитектурата на машината, която едва ли ще бъде предоставена при работа на езика на високо равнище. Въпреки че повечето софтуерни специалисти се развиват на езици на високо равнище, като Pascal, C или Delphi, което е по-лесно при писането на програми, най-мощният и ефективен софтуер е напълно или частично написан в асемблерния език. Езиците на високо равнище бяха предназначени да избягват специални технически характеристики на конкретни компютри. И асемблерният език, на свой ред, е предназначен за специфични процесорни особености. Следователно, за да напишете програма в асемблерния език за определен компютър, трябва да знаете нейната архитектура. В днешния ден видът на основния софтуер е EXE файл. Като се имат предвид положителните аспекти на това, авторът на програмата може да бъде уверен в своята почтеност. Но често понякога не е така. Има и разстройство. С помощта на разстройство можете да научите прекъсвания и програми за програми. Човек, който разглобява в асемблера, няма да е трудно да се поправи цялата програма на своя вкус. Може би следователно най-нерешен проблем - вирусът. Защо хората пишат вирус? Някои задават този въпрос с изненада, някои с гневно, но въпреки това хората продължават да съществуват, които се интересуват от тази задача, не от гледна точка на причиняването на някаква вреда, а представляват интерес за системно програмиране. Питайте за различни причини. Едно подобно на системните предизвикателства, други подобряват знанията си в асемблера. Ще се опитам да изгоня всичко това в работата ми. Той също така се казва не само за структурата на EXE файла, но и за асемблерния език.

^ Език.

Интересно е да се проследи, започвайки от времето на появата на първите компютри и завършвайки с днешния ден, за превръщането на идеите за езика за асемблер от програмисти.

След като асемблерът е език, без да знае, че е невъзможно да се направи компютър да направи нещо полезно. Постепенно ситуацията се промени. Появиха се по-удобни средства за комуникация с компютър. Но за разлика от други езици, асемблерът не умре, затова не можеше да направи това по принцип. Защо? В търсене на отговора ще се опитаме да разберем какъв вид асемблер език е като цяло.

Ако накратко, асемблерният език е символично представяне на езика на машината. Всички процеси в машината на най-ниското ниво на хардуера се движат само от команди (инструкции) на машинния език. Ясно е, че въпреки общото име, асемблерният език за всеки тип компютър. Това се отнася за появата на програми, написани в асемблера, и идеите, отражението на този език е.

За да решите проблемите, свързани с оборудването (или дори, освен това, в зависимост от оборудването, като например подобряване на скоростта на програмата), това е невъзможно без познаването на асемблера.

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

Разбира се, времето на компютърното универсално вече е преминало. Както казват, че е невъзможно да се твърди огромното. Но има нещо общо, един вид основа, на която се изгражда всяко сериозно компютърно обучение. Това познаване на принципите на компютъра, нейната архитектура и асемблерния език като отражение и въплъщение на тези знания.

Типичният модерен компютър (базиран на I486 или pentium) се състои от следните компоненти (фиг. 1).

Фиг. 1. Компютърни и периферни устройства

Фиг. 2. Структурна схема на персонален компютър

От фигурата (фиг. 1) може да се види, че компютърът е съставен от няколко физически устройства, всеки от които е свързан с един блок, наречен системата. Ако твърдите логично, е ясно, че тя играе ролята на определено координиращо устройство. Да погледнем в системата на системата (не е необходимо да се опитвате да проникнете в монитора - няма нищо интересно, освен това е опасно): отворете кутията и вижте някои дъски, блокове, свързващи кабели. Да разберем тяхната функционална цел, нека погледнем структурната схема на типичен компютър (фиг. 2). Тя не претендира безусловна точност и е предназначена да покаже целта, връзката и типичния състав на елементите на съвременния персонален компютър.

Нека обсъдим схемата на фиг. 2 в няколко нетрадиционен стил.
Тя е типична, срещаща се с нещо ново, потърсете някои асоциации, които могат да му помогнат да знае неизвестното. Какви асоциации са компютър? Имам, например, компютърът често се свързва с самия човек. Защо?

Човек, който създава компютър някъде в дълбочините на себе си, смята, че ще създаде нещо като себе си. Компютърът има възприемането на информация от външния свят - е клавиатура, мишка, устройства за съхранение на магнитни дискове. На фиг. 2 Тези органи са разположени отдясно на системните гуми. Компютърът има "храносмилателни" органи, получената информация е централен процесор и RAM. И накрая, компютърът има речеви органи, които излизат от резултатите от обработката. Това са и някои от устройствата вдясно.

Съвременните компютри, разбира се, далеч на човек. Те могат да бъдат сравнени със същества, които взаимодействат с външния свят на нивото на голям, но ограничен набор от безусловни рефлекси.
Този набор от рефлекси образува система от команди на машината. На каквото и високо ниво не комуникирате с компютъра, в крайна сметка всичко се свежда до скучната и монотонна последователност на машинните команди.
Всеки екип на машината е един вид дразнещ, за да възбуди един или друг безусловен рефлекс. Реакцията на този стимул винаги е недвусмислена и "зашит" в блока на микрокоманда под формата на фърмуер. Този фърмуер прилага действия за изпълнение на командата на машината, но вече на нивото на сигнала, представено на определени логически вериги на компютъра, като по този начин се движат различни компютърни подсистеми. Това е така нареченият принцип на управление на фърмуера.

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

Така, външно, като полиглот, компютърът разбира само един език - езика на команди на машината. Разбира се, за комуникация и работа с компютър, не е необходимо да се знае този език, но почти всеки професионален програмист рано или късно е изправен пред нужда. За щастие, програмист не е необходимо да се опитва да разбере стойността на различни комбинации от двоични числа, тъй като в 50-те години програмистите започнаха да използват символичния аналог на машинния език за програмиране, което се нарича асемблер. Този език точно отразява всички характеристики на езика на двигателя. Ето защо, за разлика от езиците на високо равнище, асемблерният език за всеки тип компютър е ваша.

От всичко по-горе можем да заключим, че тъй като асемблерният език за компютъра "роден", тогава най-ефективната програма може да бъде написана само на нея (при условие, че пише квалифициран програмист). Има една малка "но": тя е много трудна, която изисква голямо внимание и практически опит в процеса. Ето защо, всъщност, асемблерът е написан в основната програма, която трябва да осигури ефективна работа с хардуера. Понякога асемблерът е написан от времето на изпълнение или разходване на паметта. Впоследствие те са изготвени под формата на подпрограми и се комбинират с кода на езика на високо равнище.

За да проучите езика на асемблера на всеки компютър, има смисъл да започнете само след като се появи коя част от компютъра е оставена видима и достъпна за програмиране на този език. Това е така нареченият компютърен софтуер модел, част от която е микропроцесорен софтуер модел, който съдържа 32 регистри по един или друг начин, който е наличен за използване от програмиста.

Тези регистри могат да бъдат разделени на две големи групи:

^ 16 Регистрите на потребителите;

16 системни регистри.

В програмите в асемблерния език регистрите се използват много интензивно. Повечето регистри имат определена функционална цел.

Както следва името, потребителските регистри се наричат, защото програмистът може да ги използва при писането на своите програми. Тези регистри включват (фиг. 3):

Осем 32-битови регистри, които могат да бъдат използвани от програмисти за съхраняване на данни и адреси (те също се наричат \u200b\u200bрегистрите с общо предназначение (RON)):

шест сегменти Регистки: CS, DS, SS, ES, FS, GS;

регистри на статуса и управлението:

EFLAGS / FLAGS FLAGS регистър;

EIP / IP указател за показалеца.

Фиг. 3. Регистри на потребителите на микропроцесори I486 и Pentium

Защо много от тези регистри са показани с наклонена функция за разделяне? Не, те не са различни регистри, са части от един голям 32-битов регистър. Те могат да се използват в програмата като отделни обекти. Това се прави, за да се гарантира, че изпълнението на програми, написани за по-младите 16-битови модели на микропроцесори Intel, започвайки с i8086. I486 и Pentium микропроцесорите имат предимно 32-битови регистри. Техния брой, с изключение на сегментните регистри, същото като през i8086, но измерението е по-голямо, което се отразява в техните наименования - те имат
префикс e (разширен).

^ Общи регистри
Всички регистри на тази група ви позволяват да се свържете с нашите "по-млади" части (виж фиг. 3). Като се има предвид този чертеж, забележете, че е възможно да се използва самостоятелно адресиране само на по-младите 16 и 8-битови части от тези регистри. По-старите 16 бита на тези регистри като независими обекти не са налични. Това се прави, както отбелязахме по-горе, за съвместимост с по-младите 16-битови модели на Intel микропроцесори.

Ние изброяваме регистрите, принадлежащи към групата за регистрите с общо предназначение. Тъй като тези регистри са физически разположени в микропроцесор в аритметично и логическо устройство (ALLU), те също се наричат \u200b\u200bрегистрите от AllU:

eAX / AX / AH / AL (регистър на акумулатора) - батерия.
Използва се за съхраняване на междинни данни. В някои отбори се изисква използването на този регистър;

eBX / BX / BH / BL (базов регистър) - основен регистър.
Използва се за съхраняване на основния адрес на някакъв предмет в паметта;

eCX / CX / Ch / CL (графският регистър) е регистъра.
Използвани в команди, които произвеждат някои повтарящи се действия. Използването му често е имплицитно и скрито в алгоритъма на съответния екип.
Например, организацията на цикъла на цикъла, в допълнение към предаването на управлението на команди, разположено на адрес, анализира и намалява стойността на регистъра ECX / CX;

eDX / DX / DH / DL (регистър на данните) - регистър на данните.
Подобно на регистъра EAX / AX / AAH / AL, той съхранява междинни данни. В някои отбори нейното използване е задължително; За някои команди това е имплицитно.

Следните две регистри се използват за подпомагане на така наречените верижни операции, т.е. операциите, произвеждащи последователна обработка на вериги от елементи, всеки от които може да има дължина 32, 16 или 8 бита:

eSI / SI (регистър на източника) - индекс на източника.
Този регистър във верижните операции съдържа настоящия адрес на елемента в източника на веригата;

eDI / DI (регистър на дестинацията) - индекс на приемника (получател).
Този регистър във верижните операции съдържа текущия адрес в веригата на приемника.

В архитектурата на микропроцесора такава структура на данни се поддържа на софтуера и нивото на хардуера като стека. За да работи с стек в командната система на микропроцесора, има специални команди и в модела на софтуера на микропроцесора има специални регистри:

eSP / SP (Stack Stocker Register) - Регистър на указателя на стека.
Съдържа стека Vergex в текущия сегмент на стека.

eBP / BP (регистър на базовите показалеца) - Stack Frame Base Register регистър.
Проектиран да организира произволен достъп до данните в стека.

Стакът се нарича програмната област за временно съхраняване на произволни данни. Разбира се, данните могат да бъдат запазени и в сегмента на данните, но в този случай е необходимо да се стартира отделна посочена именно име на паметта през това време, което увеличава размера на програмата и броя на използваните имена. Удобството на стека е, че нейната област се използва многократно и ги спестява от там, използвайки ефективни букви и поп команди, без да посочват имена.
Стакът традиционно се използва например, за да се запази съдържанието на регистрите, използвани от програмата, преди да се обадите на подпрограмата, която от своя страна ще използва регистрите на процесора "за техните лични цели". Първоначалното съдържание на регистрите се проектира от стака след завръщането от подпрограмата. Друго общо приемане е прехвърлянето на подпрограмата на изискваните от нея параметри през стека. Подпрограмата, познаването, в какъв ред се поставят върху купчината параметри, може да ги избере от там и да се използва при извършването му. Отличителна черта на стека е особеният ред на извадката от данните, съдържащи се в него: само горният елемент е на разположение на стека по всяко време, т.е. Елементът се зарежда в стека последно. Разтоварването от стека на горния елемент прави наличния елемент. Елементите на купчината са разположени в зоната на паметта, разпределени под стека, като се започне от дъното на стека (т.е. от максималния си адрес) при постоянно намаляване на адресите. Адресът на горния, наличен елемент се съхранява в регистъра на индикатора на SP Stack. Подобно на всяка друга област на програмната памет, стекът трябва да въведе някакъв сегмент или да образува отделен сегмент. Във всеки случай сегментният адрес на този сегмент се поставя в сегмента на SS Stack. По този начин, чифт регистри ss: sp описват адреса на достъпна килия на стека: сегментът на стека се съхранява в SS, и в SP - изместването на последния, съхраняван в купчина от това (фиг. 4, a ). Моля, обърнете внимание, че в първоначалното състояние указателят на SP стара показва клетка под дъното на стека и не е включена в нея.

Фигура 4. Организация на стека: A - първоначално състояние, B - След зареждане на един елемент (в този пример - съдържанието на регистъра AH), в - след зареждане на втория елемент (съдържанието на регистъра на DS), G - след разтоварване Един елемент, D - след разтоварване на два елемента и се връща в първоначалното си състояние.

Зареждането на стека се извършва чрез специално управление на работата с Push Stack (натиснете). Тази команда първо намалява съдържанието на указателя на стека до 2, а след това поставя операнда на адреса в СП. Ако, например, искаме временно да запазим съдържанието на регистрацията AH на стака, трябва да изпълните командата

Стакът преминава към състоянието, показано на фиг. 1.10, b. Може да се види, че указателят на стека се премества на два байта (към по-малки адреси) и този адрес записва командата за натискане на операнда. Следваща команда за изтегляне на стека, например,

ще бъде ли стекът в състоянието, показано на фиг. 1.10, c. Стекът сега ще съхранява два елемента и ще бъде достъпен само горният ще бъде достъпен, което показва указателя на SP Stack. Ако след известно време трябваше да възстановим оригиналното съдържание, записано в купчината регистрите, трябва да изпълним командите за разтоварване от поп стека (изтласкване):

поп ds.
поп брадва.

Какъв размер трябва да бъде стекът? Това зависи от това колко интензивно се използва в програмата. Ако, например, е планирано да се съхранява масив от 10 000 байта в стека, тогава стекът трябва да бъде не по-малък от този размер. В същото време трябва да се има предвид, че в някои случаи стекът автоматично се използва от системата, по-специално при изпълнение на командата INT 21H прекъсване. Според тази команда, процесорът първо поставя обратния адрес на стека, а след това DOS изпраща същото съдържание на регистрация и друга информация, свързана с прекъснатата програма. Ето защо, дори ако програмата изобщо не използва стека, тя все още трябва да присъства в програмата и да има не по-малко от няколко десетки думи. В нашия първи пример ние взехме под стека от 128 думи, което определено е достатъчно.

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

Програмата за асемблер е набор от блокове с памет, наречени сегменти на паметта. Програмата може да се състои от един или повече такива блокови сегменти. Всеки сегмент съдържа набор от езикови предложения, всяка от които заема отделен ред от програмния код.

Асемблерните оферти са четири вида:

команди или инструкции, които са символични аналози на команди на машината. В процеса на излъчване, инструкциите за асемблер се трансформират в съответните команди на командната система на микропроцесора;

макрокоманди - определено предложение на текстовите предложения на програмата, които се заменят по време на излъчването чрез други предложения;

директиви, които са индикация за асемблер преводач за извършване на определени действия. Директивите нямат аналози в представянето на машината;

редове от коментари, съдържащи всички символи, включително буквите на руската азбука. Коментарите се игнорират от преводача.

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

Предложенията, които съставляват програмата, могат да бъдат синтактически дизайн, съответния екип, макрокомандата, директивата или коментар. За да ги признаят от преводача на асемблер, те трябва да бъдат формирани от определени синтактични правила. За да направите това, най-добре е да използвате официално описание на синтаксиса на езика като правилата на граматиката. Най-често срещаните начини за такова описание на езика за програмиране са синтактични графики и разширени форми на Бакуса. За практическа употреба, синтактичните диаграми са по-удобни. Например, синтаксисът на асемблерните предложения може да бъде описан с помощта на синтактични диаграми, показани на следните фигури.

Фиг. 5. Формат на офертата за асемблер

Фиг. 6. Директива за формата

Фиг. 7. Команден формат и макроси

На тези чертежи:

името на етикета е идентификаторът, чиято стойност е адресът на първия байт на предложението на изходния текст на програмата, който обозначава;

името е идентификатор, който отличава настоящата директива от други директиви със същото име. В резултат на обработващия асемблер, специфична директива може да бъде присвоена на определени характеристики;

оперативен код (КЗК) и Директивата е мнемонични обозначения на съответния машинен екип, макроси или директиви за преводач;

операнди - части от екипа, макромандват или асемблерни директиви, обозначаващи обекти, над които са направени действия. Асемблерните операнди са описани чрез изрази с числови и текстови константи, марки и идентификатори на променливи, използвайки операции и някои запазени думи.

^ Как да използвате синтактични класации? Много е просто: за това просто трябва да намерите и след това да преминете по пътя от вход на графиката (вляво) до неговия изход (вдясно). Ако този път съществува, офертата или дизайнът е синтактично правилен. Ако няма такъв път, това означава, че компилаторът няма да приеме този дизайн. Когато работите със синтактични класации, обръщаме внимание на посоката на байпаса, обозначен със стрелките, тъй като сред пътеките може да има такива, за които можете да отидете вдясно наляво. По същество, синтактичните графики отразяват логиката на преводача, когато входните предложения на програмата изолират.

Допустими символи при писането на текстови текстове са:

Всички латински букви: A-Z, A-Z. В този случай капиталът и малки букви се считат за еквивалентни;

Числа от 0 до 9;

Знаци?, @, $, _, &;

Разделители ,. (< > { } + / * % ! " " ? \ = # ^.

Предложенията на асемблера са оформени от леерема, които са синтактично неразделни последователности на допустимите символи на езика, които имат смисъл за преводача.

Лекс са:

идентификатори - последователности на допустими символи, използвани за означаване на такива обекти на обект, като операционни кодове, имена на променливи и име на етикета. Правилото за запис на идентификатор е както следва: Идентификаторът може да се състои от един или повече знака. Като символи можете да използвате буквите на латинската азбука, цифрите и някои специални знаци - _ ,?, $, @. Идентификаторът не може да стартира цифра символ. Дължината на идентификатора може да бъде до 255 знака, въпреки че преводачът възприема само първите 32, а останалите пренебрегват. Можете да регулирате дължината на възможните идентификатори, като използвате опцията MV командния ред. В допълнение, има възможност да се укаже преводача да различава главни и малки букви или да игнорира тяхната разлика (която се извършва по подразбиране).

^ Асемблерни команди.

Команди за асемблер разкриват способността да прехвърлят своите изисквания към компютъра, механизма за управление в програмата (цикли и преходи) за логически сравнения и организация на софтуер. Въпреки това, програмируемите задачи рядко са толкова лесни. Повечето програми съдържат редица цикли, в които няколко команди се повтарят до определено изискване за постигане и различни проверки, които определят кои от няколко действия трябва да бъдат изпълнени. Някои команди могат да предават контрол, като променят нормалната последователност от стъпки, директно променят стойността на компенсатора в командния показалец. Както бе споменато по-рано, има различни екипи за различни процесори, ние ще разгледаме редица някои команди за процесори 80186, 80286 и 80386.

За да опишете състоянието на флаговете след извършване на някакъв екип, ние ще използваме пробата от таблицата, отразяваща структурата на флага на EFLAGS:

В долния ред на тази таблица стойностите на флаговете са дадени след изпълнение на командата. В същото време се използва следната нотация:

1 - След изпълнение на командата флагът е определен (равен на 1);

0 - След изпълнението на командата флагът се нулира (равен на 0);

r - стойността на знамето зависи от резултата от работата на екипа;

След изпълнението на командата флагът не е дефиниран;

пространство - след изпълнение на командата, флагът не се променя;

За да представляват операнди в синтактични диаграми, се използва следната нотация:

r8, R16, R32 - операнд в един от регистрите с размер на байт, дума или двойна дума;

m8, M16, M32, M48 - операнд в размер на байта, дума, двойна дума или 48 бита;

i8, I16, i32 - Директен оперен байт размер, дума или двойна дума;

a8, A16, A32 - относителен адрес (офсет) в сегмента на кода.

Отбори (азбучен ред):

* Тези команди са описани подробно.

Добавете.
(Добавяне)

Допълнение

^ Диаграма на екипа:

добавете приемник, източник

Цел: Добавяне на два операнди източник и приемник байт, дума или двойна дума.

Работен алгоритъм:

сгънете източника и приемника на операндите;

записват резултата от добавянето към приемника;

инсталирайте флаговете.

Състояние на флага След изпълнението на командата:

Приложение:
Командата Add се използва за добавяне на две цели операнди. Резултатът от добавянето е поставен на адреса на първия операнд. Ако резултатът от добавянето е над границата на операндния приемник (преливник), след това разгледайте тази ситуация чрез анализиране на флага на CF и последващото възможно прилагане на командата ADC. Например, поставяйте стойности в регистъра на брадвата и зоната на паметта ch. Когато добавяте, трябва да имате предвид възможността за преливане.

Регистрация плюс регистър или памет:

| 000000DW | modrebr / rm |

Регистрирайте AX (AL) плюс директна стойност:

| 0000010W | --data-- | данни, ако w \u003d 1 |

Регистрация или памет плюс директна стойност:

| 100000sw | mod000r / m | --data-- | данни, ако bw \u003d 01 |

Обади се
(Обади се)

Процедура или задача за обаждане

^ Диаграма на екипа:

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

прехвърляне на контрола на тясна или дългосрочна процедура с запаметяване в сека на адреса на връщане;

задачи за превключване.

Работен алгоритъм:
определени от вида на операнда:

Lessenger Label - съдържанието на указателя на EIP / IP командата се въвежда в стака и новата адресна стойност се зарежда в същия регистър, адреса, съответстващ на етикета;

Етикет за етикети - съдържанието на указателя на EIP / IP и CS е въведено в стека. След това същите регистри са заредени с нови стойности на адресите, съответстващи на дългия маркер;

R16, 32 или M16, 32 - определяне на компенсациите за регистър или паметта, съдържащи компенсации в текущия командния сегмент, където се предава контролът. Когато контролирате контрола, се въвежда съдържанието на указателя на EIP / IP;

Указател на паметта - дефинира клетъчна клетка, съдържаща 4 или 6 байтова точка към наречената процедура. Структурата на такъв указател 2 + 2 или 2 + 4 байта. Интерпретацията на такъв указател зависи от начина на работа на микропроцесора:

^ Флаг Statla след изпълнение на командата (с изключение на задачата за превключване):

изпълнението на екипа не засяга флаговете

Когато превключите задачата, стойностите на флага се променят в съответствие с информацията за регистрацията на EFLAGS в сегмента на състоянието на TSS на задачата, към която превключвате.
Приложение:
Командата за повикване ви позволява да организирате гъвкав и многовариантни контроли към подпрограмата, докато запазвате адреса на връщане.

Около D (четири формата):

Директно адресиране в сегмента:

| 11101000 | disp-low | diep-high |

Непряко адресиране в сегмента:

| 1111111 | mod010r / m |

Непряко адресиране между сегментите:

| 1111111 | mod011r / m |

Директно адресиране между сегментите:

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

CMP.
(Сравнете операндите)

Сравнение на операндите

^ Диаграма на екипа:

cMP Operand1, Operand2

Цел: сравнение на два операнда.

Работен алгоритъм:

извършване на изваждане (операнд1 операнд2);

в зависимост от резултата, инсталирайте флагове, операнд1 и операнд2, за да не се променят (т.е., резултатът не се запаметява).

Приложение:
Тази команда се използва за сравняване на двата операнда чрез изваждане, докато операндите не се променят. Според резултатите от командата са инсталирани флагове. Командата CMP се прилага за управляваните команди за преход и командата за инсталиране на байта чрез стойността на SETCC.

Около K O D (три формата):

Регистрирайте се или регистрирайте паметта:

| 001110DW | modrebr / m |

Директна стойност с регистрация AX (al):

| 0011110W | --data - | данни, ако w \u003d 1 |

Директна стойност с регистър или памет:

| 100000sw | mod111r / m | --data-- | данни, ако SW \u003d 0 |

Декември
(Намаление на операнд с 1)

Намаляване на операнда на единица

^ Диаграма на екипа:

операнд

Цел: намаляване на стойността на операнда в паметта или регистър от 1.

Работен алгоритъм:
командата приспада 1 от операнда. Състояние на флага След изпълнението на командата:

Приложение:
Командата на декември се използва за намаляване на стойността на байтата, думите, двойните думи в паметта или регистъра на единица. В същото време забележете, че командата не засяга знамето на CF.

Регистрация: | 01001Reg |

^ Регистриране или памет: | 1111111W | mod001r / m |

Гнездо
(Разделяйте неподписани)

Решение за неизпълнение

Екипна диаграма:

div разделител

Цел: извършване на операцията за разделяне на две двоични неподписани стойности.

^ Algorithm:
За командата е необходимо да се определят два операнда - да се разделят и разделят. Дивидентът се дефинира имплицитно и неговият размер зависи от размера на разделителя, който е посочен в командата:

ако делителят в байтата, тогава дивидентът трябва да бъде разположен в AX регистър. След операцията, частният се поставя в ал и остатъкът в АХ;

ако разделителят е размерът на думата, тогава дивидентът трябва да бъде разположен в двойка регистрите DX: AX, а най-младата част от дивидента е в брадва. След операцията, частното се поставя в брадва и остатъкът в DX;

ако разделянето на двойна дума, делимата трябва да бъде разположена в двойката EDX Register: EAX, а най-младата част от разделението е в EAX. След операцията частното се поставя в EAX и остатъкът е в EDX.

^ Stattla след изпълнение на командата:

Приложение:
Екипът извършва цяло число на операнди с издаването на резултата от разделянето под формата на частно и остатък от разделение. При извършване на операция по разделение може да възникне изключителна ситуация: 0 - Грешка в разделянето. Тази ситуация възниква в един от двата случая: разделителят е 0 или частен твърде голям за настаняването си в регистъра EAX / AX / AL.

О, около D:

| 1111011W | mod110r / m |

Int.
Прекъсване)

Призоваване на прекъсване на услугата подпрограма

^ Диаграма на екипа:

int number_name.

Цел: призоваване на услугата прекъсване с прекъсващ номер, определен от командния операнд.

^ Algorithm:

напишете на флаговете на EFLAGS / FLAGS и обратен адрес. При възстановяване на обратния адрес, съдържанието на регистъра на CS се записва за първи път, след това съдържанието на указателя на EIP / IP команда;

нулиране, ако и tf в нулеви флагове;

прехвърлете контрола до програмата за обработка на прекъсването с посочения номер. Контролният механизъм зависи от начина на работа на микропроцесора.

^ Stattla след изпълнение на командата:

Приложение:
Както може да се види от синтаксиса, има две форми на тази команда:

iNT 3 - има собствен индивидуален код на работата на 0CCH и взема един байт. Това обстоятелство го прави много удобен за използване в различни софтуерни дебагери, за да инсталирате точки на прекъсване, като замените първия байт на всяка команда. Микропроцесорът, срещнат в командването на командната последователност с операционния код 0CCH, причинява програма за обработка на прекъсването с вектор номер 3, който служи за комуникация с програмния дебъгер.

Втората форма на командата заема два байта, има код за работа 0CDH и ви позволява да инициирате повикване на преработката на прекъсване с векторно число в диапазона от 0-255. Характеристиките на управлението на управлението, както е отбелязано, зависят от начина на работа на микропроцесора.

За (два формата):

Регистрация: | 01000рег |

^ Регистриране или памет: | 1111111W | mod000r / m |

JCC.
JCXZ / JECXZ.
(Скочи, ако условие)

(Скочи, ако cx \u003d нула / скок, ако ecx \u003d нула)

Преход, ако условието е изпълнено

Преход, ако cx / ECX е нула

^ Диаграма на екипа:

jCC тагове
jCXZ Label.
jecxz тагове

Цел: преходът в текущия командния сегмент в зависимост от някои състояния.

^ Командиращ алгоритъм (с изключение на JCXZ / Jecxz):
Проверка на състоянието на знамената в зависимост от кода на операцията (отразява проверимото състояние):

ако състоянието на теста е наистина вярно, след това преминете към клетката, определена от операнда;

ако валидното състояние е невярно, прехвърлете следната команда.

JCXZ / Jecxz екип за работа Алгоритъм:
Проверете условията за равенство нула съдържанието на регистъра ECX / CX:

ако проверимото състояние

На дестинацията можете да избирате команди (в скоби са примери за мнемонични кодове на операции на операциите тип PC тип на IBM PC):

l Извършване на аритметични операции (добавяне и ADC - добавяне и допълване с прехвърляне, под и sBB - изваждане и изваждане с заеми, mul и imul - умножение без знак и със знак, div и idiv - разделяне без знак и със знак, cmp - сравнения и т.н.);

l извършване на логически операции (или, а не, ксор, тест и др.);

l Доставка (MOV - изпращане, XCHG - Exchange, inter в микропроцесора, изход от микропроцесора и др.);

l Контролна предаване (клонове на програмата: JMP - безусловен преход, процедура за повикване, RET връщане от процедурата, J * - условен преход, контрола на цикъла и др.);

l Обработка на символи (MOVS - доставка, CMPS - сравнение, LOD - Downloads, SCAS - сканиране. Тези команди обикновено се използват с репутацията на префикса (модификатор);

l Програма прекъсва (Int - програмата прекъсва, в зависимост от препълването, IRET - връщане от прекъсване);

l Контрол на микропроцесора (ST * и CL * - Монтаж и регулиране на флаговете, HLT - Спрете, изчакване - очаквания, nop - празен и др.).

С пълен списък на асемблерните команди, можете да се запознаете в произведенията.

Команди за прехвърляне на данни.

l Mov DST, SRC - пратка за данни (преместване - изпращане от SRC до DST).

Изпраща: един байт (ако src и dst имат формат на байта) или една дума (ако SRC и DST имат формат на думи) между регистъра или между регистъра и паметта, и също така записва директна стойност в регистъра или в паметта.

DST и SRC операндите трябва да имат същия формат - байтове или дума.

SRC може да бъде тип: R (регистър) - регистър, m (памет) - памет, i (импеданс) - директна стойност. DST може да бъде тип R, m. Невъзможно е да се използват операнди в една команда: RSEGM заедно с I; Два операнд тип М и два операнда тип RSEGM). Операнд мога да бъда просто изразяване:

mOV AX, (152 + 101B) / 15

Изчисляването на израза се извършва само когато излъчва. Знамената не се променят.

l push src - слово покритие стека (натиснете - притискане Записване на купчината İSRC). Той поставя съдържанието на SRC в горната част на стека - всеки 16-битов регистър (включително сегмент) или две клетки от памет, съдържащи 16-битова дума. Флагове не се променят;

l Поп DST - извличане на думи от стека (поп - изтласкване; пребройте се от стека в DST). Премахва думата от върха на стака и го поставя в DST - всеки 16-битов регистър (включително сегмент) или в две клетки памет. Знамената не се променят.

Дял