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

08.04.2019

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

Програмиране на асемблер

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

Как се програмиране на асемблер

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

регистри

Регистрите в езика на асемблера се наричат ​​клетки на паметта, разположени директно върху чипа с ALU (процесор). Характеристика на този тип памет е скоростта на достъп до нея, която е много по-бърза от оперативната памет на компютъра. Тя също се нарича ултра-бърза RAM (PopS или SRAM).

Има следните видове регистри:

  1. Регистрите с общо предназначение (RON).
  2. Знамена.
  3. Команден указател
  4. Сегментни регистри.
Регистри за сглобяване

Има 8 регистъра с общо предназначение, всеки по 32 бита.

EAX, ECX, EDX, EBX регистрите могат да бъдат достъпни в 32-битов режим, 16-битов - AX, BX, CX, DX, а също и 8-битов - AH и AL, BH и BL и др.

Буквата "Е" в имената на регистрите означава "Разширен" (разширен). Самите имена са свързани с техните имена на английски:

  • Акумулаторен регистър (AX) - за аритметични операции.
  • Брояч регистър (CX) - за смени и цикли.
  • Регистър на данните (DX) - за аритметични и I / O операции.
  • Базов регистър (BX) - за указател към данните.
  • Регистър на указателя на стека (SP) - за показалец към горната част на стека.
  • Регистър на базови указатели на стека (BP) - за индикатора на основата на стека.
  • Източник на индекс регистър (SI) - за подателя (източник) указател.
  • Индекс регистър на дестинациите (DI) - за получателя.

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

Регистър на флаговете. Това означава байт, който може да приеме стойностите 0 и 1. Комбинацията от всички флагове (има около 30 от тях) показва състоянието на процесора. Примери за флагове: Carry Flag (CF) - флаг за пренасяне, флаг за преливане (OF) - препълване, вмъкнат флаг (NT) - флаг за поставяне на задачи и много други. Флаговете са разделени на 3 групи: състояние, управление и система.

Регистрират се флагове на процесора

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

Сегментни регистри (CS, DS, SS, ES, FS, GS). Тяхното присъствие в асемблера се диктува от специален контрол на оперативната памет, за да се увеличи използването му в програмите. Благодарение на тях е възможно да се управлява памет до 4 GB. В архитектурата Win32 няма нужда от сегменти, но имената на регистрите се запазват и използват по различен начин.

Стек

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

Стек работа в асемблер

Идентификатори, цели числа, символи, коментари, еквивалентност

Идентификаторът в асемблера на езика за програмиране има същото значение, както във всеки друг. Позволени са латински букви, цифри и символи "_", ".", "?", "@", "$". В този случай главни и малки букви са еквивалентни, а точка може да бъде само първият знак от идентификатора.

Целочислени числа в асемблера могат да бъдат определени в референтни системи с бази 2, 8, 10 и 16. Всяко друго въвеждане на числа ще се разглежда от асемблера като идентификатор.

Разрешено е да се използват както апострофи, така и котировки в писмен вид символни данни. Ако трябва да посочите една от тях в низ със символи, тогава правилата са както следва:

  • в реда, затворен в апострофите, кавичките се посочват веднъж, апострофът - два пъти: „не може“, „каза“ да бъде или да не бъде ”;
  • за низ, затворен в кавички, правилото е обратното: двойните кавички се дублират, апострофите са обозначени така, както е: "не може", "Моят любим бар е" "Черна котка" "".

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

Директивата за еквивалентност се използва по сходен начин с други постоянни изрази. Еквивалентността се посочва, както следва:

  EQU  

Така в програмата всички събития ще бъде заменен с на мястото на което е възможно да се посочи цяло число, адрес, низ или друго име. Директивата EQU е подобна в работата си на #define в C ++.

Директиви за данните

Въвеждат се езици на високо ниво (C ++, Pascal). Това означава, че те използват данни, които имат определен тип, има функции за обработката им и т.н. В асемблера на езика за програмиране няма такова нещо. Има само 5 директиви за дефиниране на данни:

  1. DB - Byte: разпределя 1 байт за променлива.
  2. DW - Word: изберете 2 байта.
  3. DD - Двойна дума: изберете 4 байта.
  4. DQ - Quad word: изберете 8 байта.
  5. DT - Десет байта: разпределят 10 байта за променлива.

Буквата D означава дефиниране.

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

синтаксис:

  DQ [, ]   DQ [, ]   DQ [, ] 

Като операнд е позволено да се използват цифри, символи и въпросник - “?”, Обозначаващ променлива без инициализация. Помислете за примери:

 real1 DD 12.34char db 'c'ar2 db '123456',0 ; массив из 7 байтnum1 db 11001001b ; двоичное числоnum2 dw 7777o ; восьмеричное числоnum3 dd -890d ; десятичное числоnum4 dd 0beah ; шестнадцатеричное числоvar1 dd ? ; переменная без начального значенияar3 dd 50 dup (0) ; массив из 50 инициализированных эл-товar4 dq 5 dup (0, 1, 1.25) ; массив из 15 эл-тов, инициализированный повторами 0, 1 и 1.25 

Команди (инструкции)

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

    

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

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

В ролята на командите на операндите могат да бъдат:

  • регистри, достъпни по техните имена;
  • константи;
  • адреси.

Повече за адресите

Адресът може да се предава по няколко начина:

  1. Под формата на име на променлива, която в асемблера е синоним на адрес.
  2. Ако променливата е масив, достъпът до елемента на масива се осъществява чрез името на неговата променлива и отместване. Има 2 форми за това: [<име> + <офсет>] и <име> [<офсет>]. Забележете, че отместването не е индекс в масива, а размер в байтове. Самият програмист трябва да разбере колко трябва да бъде направено отместването в байтове, за да получи желания елемент от масива.
  3. Можете да използвате регистри. За достъп до паметта, в която се съхранява регистърът, трябва да използвате квадратни скоби: [ebx], [edi].
  4. [] - скобите позволяват използването на сложни изрази в себе си за изчисляване на адреса: [esi + 2 * eax].

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

Адрес в асемблер

Освен това в асемблера има съкращения: r за регистри, m за памет и i за операнд. Тези съкращения се използват с цифрите 8, 16 и 32, за да укажат размера на операнда: r8, m16, i32 и т.н.

 add i8/i16/i32, m8/m16/m32 ;суммирование операнда с ячейкой памяти 

Mov команда или напред

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

 MOV ,  MOV ,  

Има други команди в процесора за осъществяване на прехвърлянето. Например, XCHG е команда за обмен на операнди с стойности. Но от гледна точка на програмиста всички те се изпълняват чрез основната команда MOV. Помислете за примери:

 MOV i, 0 ; Записать в i значение 0MOV ECX, EBX ; Пересылка значения EBX в ECX 

Под формата на операнд може да действа като регистър и клетка от паметта. Обаче, ако съдържанието на двата регистъра може да бъде пренаредено, тогава няма две клетки на паметта. Трябва да се внимава операндите да са с еднакъв размер. Също така имайте предвид, че командата MOV не променя стойността на флаговете.

MOV команда в асемблер

инструменти

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

  • Borland Turbo Assembler (TASM) е един от най-популярните инструменти. Добре е за развитие под DOS и лошо за Windows.
  • Microsoft Macrom Assembler (MASM) е пакет за разработване на асемблер в средата на Windows. Той съществува както отделно, така и като вградена функция в средата на Visual Studio. Асемблер и езици на високо ниво често са съвместими. В смисъл, че последният може да използва асемблера директно. Например, C ++.
  • Netwide Assembler (NASM) е популярен безплатен асемблер за архитектурата на Intel.
Програмиране на асемблер

Има много инструменти. В този случай трябва да отбележите, че няма единен стандарт за синтаксис на асемблер. Има 2 най-приложими: AT & T синтаксис, фокусиран върху не-Intel производствени процесори, и съответно синтаксис на Intel.

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