Статията ще обсъди основите на асемблерния език във връзка с архитектурата win32. Това е символичен запис на машинни кодове. Във всеки електронен компютър най-ниското ниво е хардуер. Тук управлението на процесите се извършва с инструкции или инструкции на машинен език. Именно в тази област асемблерът трябва да работи.
Писането на програма в асемблер е изключително труден и скъп процес. За да създадете ефективен алгоритъм, се нуждаете от задълбочено разбиране на работата на компютрите, познаване на детайлите на командите, както и повишено внимание и точност. Ефективността е критичен параметър за програмиране в асемблер.
Основното предимство на асемблерния език е, че ви позволява да създавате кратки и бързи програми. Затова се използва по правило за решаване на специализирани проблеми. Нуждаете се от код, който работи ефективно с хардуерни компоненти или имате нужда от програма, която изисква памет или време на изпълнение.
Регистрите в езика на асемблера се наричат клетки на паметта, разположени директно върху чипа с ALU (процесор). Характеристика на този тип памет е скоростта на достъп до нея, която е много по-бърза от оперативната памет на компютъра. Тя също се нарича ултра-бърза RAM (PopS или SRAM).
Има следните видове регистри:
Има 8 регистъра с общо предназначение, всеки по 32 бита.
EAX, ECX, EDX, EBX регистрите могат да бъдат достъпни в 32-битов режим, 16-битов - AX, BX, CX, DX, а също и 8-битов - AH и AL, BH и BL и др.
Буквата "Е" в имената на регистрите означава "Разширен" (разширен). Самите имена са свързани с техните имена на английски:
Специализация 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
Така в програмата всички събития
Въвеждат се езици на високо ниво (C ++, Pascal). Това означава, че те използват данни, които имат определен тип, има функции за обработката им и т.н. В асемблера на езика за програмиране няма такова нещо. Има само 5 директиви за дефиниране на данни:
Буквата 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
Синтаксисът на команди за асемблер или инструкции за асемблер е както следва:
Етикет (етикет :) трябва да завършва с двоеточие и може да бъде поставен на отделен ред. Етикетите се използват за позоваване на команди в рамките на програмата.
Инструкциите показват операцията, която трябва да се извърши. В асемблерните операции са представени под формата на буквени съкращения за улесняване на разбирането. Инструкциите могат да се наричат мнемонични.
В ролята на командите на операндите могат да бъдат:
Адресът може да се предава по няколко начина:
В асемблера, адресът се предава чрез квадратни скоби. Тъй като променливата е и адрес, тя може да се използва с или без квадратни скоби.
Освен това в асемблера има съкращения: r за регистри, m за памет и i за операнд. Тези съкращения се използват с цифрите 8, 16 и 32, за да укажат размера на операнда: r8, m16, i32 и т.н.
add i8/i16/i32, m8/m16/m32 ;суммирование операнда с ячейкой памяти
Тази инструкция е основната сред асемблерните команди. Тя ви позволява да запишете в регистъра стойността на друг регистър, клетка от паметта или константа. Той също така записва стойността на регистър или константа в клетката на паметта. Синтаксис на командите:
MOV ,
MOV ,
Има други команди в процесора за осъществяване на прехвърлянето. Например, XCHG е команда за обмен на операнди с стойности. Но от гледна точка на програмиста всички те се изпълняват чрез основната команда MOV. Помислете за примери:
MOV i, 0 ; Записать в i значение 0MOV ECX, EBX ; Пересылка значения EBX в ECX
Под формата на операнд може да действа като регистър и клетка от паметта. Обаче, ако съдържанието на двата регистъра може да бъде пренаредено, тогава няма две клетки на паметта. Трябва да се внимава операндите да са с еднакъв размер. Също така имайте предвид, че командата MOV не променя стойността на флаговете.
По-нататъшно теоретично проучване на асемблера може да бъде трудно, така че трябва да помислите за инструментите, използвани за разработване на програми с него. Тук ще видите само кратък списък с популярни инструменти:
Има много инструменти. В този случай трябва да отбележите, че няма единен стандарт за синтаксис на асемблер. Има 2 най-приложими: AT & T синтаксис, фокусиран върху не-Intel производствени процесори, и съответно синтаксис на Intel.
Въпреки очевидната сложност, асемблерът е прост език за програмиране, който е лесен за разбиране. Ето защо, можете безопасно да използвате образователна литература за сходството на "асемблер за манекени" и да научат този чудесен език.