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

Въведение.

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

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

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

). Генерираната последователност от символи се използва за изпълнение на функциите, присвоени на оригиналната програма.

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

Особености на езика.

Основни характеристики на асемблера:

● вместо двоични кодове, езикът използва символни имена - мнемоника.Например за командата за добавяне (

) се използват мнемотехника

изваждания (

умножение (

дивизии (

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

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

● езикът осигурява достъп към всички обектии екипи. Езици високо нивонямат тази способност. Например асемблерният език ви позволява да проверявате битове от флаговия регистър и езикът от високо ниво (напр.

) няма тази способност. Имайте предвид, че езиците за системно програмиране (например C) често заемат междинна позиция. По отношение на достъпността те са по-близо до асемблерния език, но имат синтаксис на език от високо ниво;

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

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

● програма, написана на асемблер, е значително по-малка по размер и работи много по-бързо от програма, написана на език от високо ниво. За някои приложения тези индикатори играят основна роля, например много системни програми (включително компилатори), програми за кредитни карти, мобилни телефони, драйвери на устройства и др.;

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

В повечето програми само малък процент от общия код е отговорен за голям процент от времето за изпълнение на програмата. Обикновено 1% от програмата отговаря за 50% от времето за изпълнение, а 10% от програмата отговаря за 90% от времето за изпълнение. Следователно, за да напишете конкретна програма в реални условия, се използват както асемблер, така и един от езиците на високо ниво.

Операторен формат на асемблер.

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

Поле за етикет.

Колона 1 е предназначена за полето за етикет, което е символно име или идентификатор. адресипамет. Необходимо е, за да можете:

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

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

Такива отчети са снабдени с етикет. За обозначаване на име се използват (главни) букви от английската азбука и цифри. Името трябва да има буква в началото и двоеточие в края. Етикетът с двоеточие може да бъде изписан на отделен ред, както и кодът на операцията следващ редв колона 2, което опростява работата на компилатора. Липсата на двоеточие не позволява разграничаване на етикет от код на операция, ако те са разположени на отделни редове.

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

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

Поле за код на операцията.

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

mnemonic е избран за зареждане на регистър от паметта

), и за запазване на съдържанието на регистъра в паметта - мнемоника

). На асемблерни езици

и за двете операции можете да използвате съответно едно и също име

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

Мнемониката на регистрите също зависи от версията на асемблера (Таблица 5.2.1).

Операндно поле.

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

● цифрови данни,

представени в различни бройни системи. За да се укаже използваната бройна система, константата е последвана от една от латинските букви: B,

Съответно двоичен, осмичен, шестнадесетичен, десетична системанотация (

Не е нужно да го записвате). Ако първата цифра на шестнадесетично число е A, B, C,

Тогава отпред се добавя незначителна 0 (нула);

● кодове на вътрешни микропроцесорни регистри и клетки на паметта

M (източници или получатели на информация) под формата на буквите A, B, C,

M или техните адреси във всяка бройна система (например 10B - регистрационен адрес

V двоична система);

● идентификатори,

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

Първите букви са B,

Н; за двойка акумулатор и регистър на функции -

; за програмния брояч -

;за указателя на стека -

● етикети, указващи адресите на операндите или следващите инструкции в условието

(ако условието е изпълнено) и безусловни преходи.Например операнд M1 в командата

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

● изрази,

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

Определете думата) и по-късно въведени Алтернативен вариант.

който беше в езика за процесори от самото начало

В езикова версия

използвани

Определете константа).

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

II регистри с различна дължина имат различни имена: EAX - за поставяне на 32-битови операнди (тип

); AX - за 16-битов (тип

и AN - за 8-битов (тип

● за процесори

Към всеки код на операция се добавят суфикси: суфикс

За вид

; суфикс ".B" за тип

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

) и думи в 64-битов регистър с помощта на кодове за операции

съответно.

Поле за коментари.

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

● точка и запетая (;) в езиците за процесорите на компанията

● удивителен знак (!) на езици за

Всеки отделен ред за коментар се предхожда от водещ знак.

Псевдокоманди (директиви).

В асемблерния език има два основни типа команди:

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

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

за семейството

.

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

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

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

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

Макросът или макрокомандата се характеризира с три аспекта: макродефиниция, макроинверсия и макроразширение.

Макро дефиниция

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

Макро дефиницията има следната структура:

Списък с изрази; Макро дефиниция

В дадената структура на макродефиницията могат да се разграничат три части:

● заглавие

макрос, включително името

Псевдокоманда

и набор от параметри;

● маркирани с точки тяломакро;

● екип

абитуриентски

макродефиниции.

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

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

макрокоманди и списък с параметри с други стойности.

Когато асемблерът срещне дефиниция на макрос по време на процеса на компилиране, той я съхранява в таблицата с дефиниции на макроси. При следващи появи в програмата на името (

) на макрос, асемблерът го замества с тялото на макроса.

Извиква се използване на име на макрос като код на операция макрообрат(макро извикване) и замяната му с тялото на макроса - макро експанзия.

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

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

Процесът на сглобяване се извършва в два хода:

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

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

Макроси с параметри.

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

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

● със формаленпараметри. По време на разширяването на макроса всеки формален параметър, който се появява в тялото на макроса, се заменя със съответния действителен параметър.

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

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

И второто

Програма 2 включва макрос с два формални параметъра P1 и P2. По време на разширяване на макрос всеки знак P1 в тялото на макроса се заменя с първия действителен параметър (P,

), а символът P2 се заменя с втория действителен параметър (

) от програма No 1. В макро извик

програма 2 е отбелязана с: P,

Първият действителен параметър,

Втори действителен параметър.

Програма 1

Програма 2

MOV EBX,Q MOV EAX,Pl

MOV Q, EAX MOV EBX, P2

MOV P,EBX MOV P2,EAX

Разширени възможности.

Нека разгледаме някои разширени езикови функции

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

етикетът е обявен за локален (

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

ви позволява да дефинирате макроси в други макроси. Тази разширена функция е много полезна в комбинация с условно свързване на програма. Нека помислим

IF WORDSIZE GT 16 M2 MACRO

Макросът M2 може да бъде дефиниран и в двете части на отчета

Дефиницията обаче зависи от това на кой процесор е сглобена програмата: 16-битов или 32-битов. Ако M1 не бъде извикан, тогава макрос M2 изобщо няма да бъде дефиниран.

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

За използването на макросредства в асемблер.

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

Запазване на дефиниции на макроси.

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

Когато срещнете макрос по време на сглобяване е създаден:

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

● списък формаленпараметри.

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

Вътрешно представяне на макрос

от примера по-горе за програма 2 (стр. 244) е:

MOV EAX, MOV EBX, MOV MOV &

където точката и запетая се използва като знак за връщане на каретка, а амперсандът & се използва като знак за формален параметър.

Разширяване на макро повиквания.

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

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

Двуходов асемблер.

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

● преведете го на машинен език;

● прехвърлете получения машинен код във файл и съответната част от листинга в друг файл;

● повторете изброените процедури, докато цялата програма бъде преведена.

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

при първото минаване трябва събирами съхранявайте всички дефиниции на символи (включително етикети) в таблицата, а на второто преминаване прочетете и асемблирайте всеки оператор. Този метод е относително прост, но второто преминаване през оригиналната програма изисква допълнително време, изразходвано за I/O операции;

● при първото преминаване трябва преобразувампрограмата в междинна форма и я запишете в таблица, а второто преминаване изпълнете не според оригиналната програма, а според таблицата. Този метод на сглобяване спестява време, тъй като второто преминаване не извършва I/O операции.

Първо преминаване.

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

;Стойност - размер на буфера

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

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

Таблица със символни имена

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

● дължината на полето с данни, свързано със символа;

● битове за преразпределение на паметта (които показват дали стойността на даден символ се променя, ако програмата се зареди на адрес, различен от предвидения от асемблера);

● информация дали символът може да бъде достъпен извън процедурата.

Символните имена са етикети. Те могат да бъдат зададени с помощта на оператори (напр.

Директивна таблица.

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

Таблица с кодове на операциите.

За всеки код на операция таблицата има отделни колони: обозначение на кода на операцията, операнд 1, операнд 2, шестнадесетична стойност на кода на операцията, дължина на командата и тип на командата (Таблица 5.2.5). Операционните кодове са разделени на групи в зависимост от броя и вида на операндите. Типът на командата определя номера на групата и указва процедурата, която се извиква за обработка на всички команди в тази група.

Второ преминаване.

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

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

Изходната програма може да съдържа грешки, например:

дадения символ не е дефиниран или е дефиниран повече от веднъж;

● кодът на операцията е представен с невалидно име (поради печатна грешка), няма достатъчно операнди или има твърде много операнди;

● без оператор

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

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

Тема 2.5 Основи на програмирането на процесора

С увеличаването на продължителността на програмата запомнянето на кодовете става все по-трудно различни операции. Мнемониката предоставя известна помощ в това отношение.

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

Асемблер езике език, в който всяко изказване отговаря на точно една машинна команда.

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

Асемблерният език има няколко характеристики, които го отличават от езиците на високо ниво:

1. Това е едно към едно съответствие между операторите на асемблерния език и машинните инструкции.

2. Програмистът на асемблер има достъп до всички обекти и инструкции, присъстващи на целевата машина.

Разбирането на основите на програмирането на машинно-ориентирани езици е полезно за:



По-добро разбиране на компютърната архитектура и по-компетентно използване на компютри;

Да се ​​разработят по-рационални структури на алгоритми за програми за решаване на приложни задачи;

Възможността за преглед и коригиране на изпълними програми с разширение .exe и .com, компилирани от всякакви езици на високо ниво, в случай на загуба на изходните програми (чрез извикване на посочените програми в дебъгера на програмата DEBUG и декомпилиране на показването им в асемблиране език);

Компилиране на програми за решаване на най-критичните проблеми (програма, написана на машинно-ориентиран език, обикновено е по-ефективна - по-кратка и по-бърза с 30-60 процента от програмите, получени в резултат на превод от езици на високо ниво)

Да се ​​изпълняват процедури, включени в основната програма във формата отделни фрагментив случай, че не могат да бъдат реализирани нито на използвания език от високо ниво, нито с помощта на сервизни процедури на ОС.

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

Азбуката на асемблерния език се състои от ASCII знаци.

Числата са само цели числа. Има:

Двоичните числа завършват с буквата B;

Десетични числа, завършващи с буквата D;

Шестнадесетичните числа завършват с буквата H.

RAM, регистри, представяне на данни

За определена серия от MP се използва индивидуален език за програмиране - асемблер.

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

Софтуерен модел на микропроцесорна система на базата на MP KR580VM80

Софтуерен модел на MPS в съответствие с Фигура 1

MP портове памет

С З A.C. П ° С

Снимка 1

От гледна точка на програмиста, MP KR580VM80 има следните програмно достъпни регистри.

А– 8-битов акумулаторен регистър. Това е основният регистър на МП. Всяка операция, извършена в ALU, включва поставяне на един от операндите за обработка в акумулатора. Резултатът от операция в ALU също обикновено се съхранява в A.

B, C, D, E, H, L– 8-битови регистри с общо предназначение(RON). Вътрешна памет MP. Предназначен да съхранява обработената информация, както и резултатите от операцията. При обработката на 16-битови думи регистрите образуват двойки BC, DE, HL, а двойният регистър се нарича първа буква - B, D, H. В регистровата двойка най-високият е първият регистър. Регистрите H и L имат специално свойство, което се използва както за съхраняване на данни, така и за съхраняване на 16-битови адреси на RAM клетки.

ЕТ– флагов регистър (знаков регистър) 8-битов регистър, в който пет знака на резултата от аритметика и логически операциив MP. FL формат според снимката

Бит C (CY - пренасяне) - пренасяне, зададено на 1, ако е имало пренасяне от горния ред на байта при извършване на аритметични операции.

Bit P (паритет) – паритет, зададен на 1, ако броят на единиците в битовете на резултата е четен.

AC цифрата е допълнителен пренос, предназначен да съхранява пренасящата стойност от тетрада от нисък ред на резултата.

Бит Z (нула) – задава се на 1, ако резултатът от операцията е 0.

Бит S (знак) – задава се на 1, ако резултатът е отрицателен, и на 0, ако резултатът е положителен.

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

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

В началната област на паметта на адрес 0000Н – 07FF има контролна програмаи демонстрационни програми. Това е ROM зоната.

0800 – 0AFF - адресна област за запис на изследваните програми. (RAM).

0В00 – 0ВВ0 - адресна област за запис на данни. (RAM).

0ВВ0 – начален адрес на стека. (RAM).

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

Формат на данните и командна структура на асемблерния език

Паметта на MP KR580VM80 е масив от 8-битови думи, наречени байтове. Всеки байт има свой собствен 16-битов адрес, който определя неговата позиция в последователността от клетки на паметта. MP може да адресира 65536 байта памет, която може да се съдържа както в ROM, така и в RAM.

Формат на данните

Данните се съхраняват в паметта като 8-битови думи:

D7 D6 D5 D4 D3 D2 D1 D0

Най-малко значимият бит е бит 0, най-значимият бит е бит 7.

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

Формат на командата

Командите на MP KR580VM80 имат формат от един, два или три байта. Многобайтовите команди трябва да бъдат поставени на съседни езици. Форматът на командата зависи от спецификата на извършваната операция.

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

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

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

Еднобайтов команден формат съгласно фигура 2

Фигура 4

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

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


Методи за адресиране

Всички кодове на операнди (вход и изход) трябва да се намират някъде. Те могат да се намират във вътрешните регистри на МП (най-удобният и бърз вариант). Те могат да бъдат разположени в системна памет(най-често срещаният вариант). И накрая, те могат да бъдат разположени в I/O устройства (най-редкият случай). Местоположението на операндите се определя от кода на инструкцията. Съществуват различни методи, с който кодът на инструкцията може да определи къде да вземе входния операнд и къде да постави изходния операнд. Тези методи се наричат ​​методи за адресиране.

За MP KR580VM80 съществуват следните методи за адресиране:

Директен;

Регистрирам;

Непряк;

Подредени.

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

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

Регистрирам адресирането предполага, че операндът (вход или изход) е във вътрешния регистър на MP. Използва се в еднобайтови команди

Непряк (неявното) адресиране предполага, че вътрешният регистър на MP съдържа не самия операнд, а неговия адрес в паметта.

Стек адресирането предполага, че командата не съдържа адрес. Адресиране на клетки от паметта с помощта на съдържанието на 16-битовия SP регистър (указател на стека).

Командна система

Командната система MP е пълен списък от елементарни действия, които MP е способен да изпълнява. MP, управляван от тези команди, изпълнява прости действия, като елементарни аритметични и логически операции, прехвърляне на данни, сравнение на две стойности и др. Броят на командите на MP KR580VM80 е 78 (като се вземат предвид модификациите 244).

Разграничават се следните групи команди:

Предаване на данни;

аритметика;

Главоблъсканица;

Команди за скок;

Команди за вход/изход, контрол и стек.


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

Символ Намаляване
АДРЕС 16-битов адрес
ДАННИ 8-битови данни
ДАННИ 16 16-битови данни
ПРИСТАНИЩЕ 8-битов адрес на I/O устройство
БАЙТ 2 Втори байт от командата
БАЙТ 3 Трети байт от командата
R, R1, R2 Един от регистрите: A, B, C, D, E, H, L
Р.П. Една от регистровите двойки: B - указва двойката BC; D - определя DE двойка; H – определя двойката HL
RH Първи регистър на двойката
Р.Л. Втори регистър на двойката
Λ Логическо умножение
V Логично допълнение
Събиране по модул две
М Клетка от паметта, чийто адрес определя съдържанието на регистровата двойка HL, т.е. M = (HL)

1. Компютърна архитектура…………………………………………………………………………………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. Псевдооператори………………………………………………………….

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 ASCIIZ данни

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

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

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

Въведение

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

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

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

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

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

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

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

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

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

    компютърна блокова схема;

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

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

    организация и методи на адресиране;

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

    набор от компютърни машинни инструкции;

    формати на машинни инструкции;

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

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

      Регистри.

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

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

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

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

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

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

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

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

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

ECX/CX/CH/CL – брояч(count register), използван като брояч за броя на повторенията на цикъла.

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

Всички регистри в тази група позволяват достъп до техните „долни“ части. Само долните 16- и 8-битови части на тези регистри могат да се използват за самоадресиране. Горните 16 бита на тези регистри не са налични като независими обекти.

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

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

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

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

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

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

1.1.2. Сегментни регистри

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

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

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

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

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

        Контролни и статусни регистри

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

EIP/IP регистър на показалеца на инструкции;

    флагов регистър EFLAGS/ФЛАГИ.

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

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

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

1.1.3 Флагов регистър

Регистърът на флаговете е 32-битов и се нарича EFLAGS (фиг. 1). Отделните битове на регистъра имат определено функционално предназначение и се наричат ​​флагове. На всеки от тях е присвоено конкретно име (ZF, CF и др.). По-малките 16 бита на EFLAGS представляват 16-битовия флагов регистър FLAGS, използван при изпълнение на програми, написани за микропроцесорите i086 и i286.

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

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

Флагове за условия:

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

OF (флаг за препълване) - флаг за препълване. Задайте на 1, ако при добавяне или изваждане на цели числа със знак резултатът е резултат, който надвишава допустимата стойност по абсолютна стойност (мантисата е преляла и се е „изкачила“ в цифрата на знака).

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

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

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

AF (спомагателен флаг за носене) - допълнителен флаг за носене. Коригира характеристиките на извършване на операции върху двоични десетични числа.

Държавни знамена:

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

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

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

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

IF (флаг за прекъсване) - прекъсване флаг. Когато IF=0, процесорът спира да отговаря на входящи прекъсвания; когато IF=1, блокирането на прекъсванията се премахва.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Командите могат да бъдат разграничени по предназначение (примери за кодове на мнемонични операции на команди за асемблер на IBM PC са дадени в скоби):

l извършване на аритметични операции (ADD и ADC - събиране и събиране с пренасяне, SUB и SBB - изваждане и изваждане със заемане, MUL и IMUL - умножение без знак и знак, DIV и IDIV - деление без знак и знак, CMP - сравнения и др.);

l извършване на логически операции (ИЛИ, И, НЕ, XOR, ТЕСТ и др.);

l трансфер на данни (MOV - напред, XCHG - обмен, IN - вход в микропроцесора, OUT - изход от микропроцесора и др.);

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

l обработка на символни низове (MOVS - трансфери, CMPS - сравнения, LODS - зареждания, SCAS - сканиране. Тези команди обикновено се използват с префикс (модификатор на повторение) ​​REP;

l програмни прекъсвания (INT - софтуерни прекъсвания, INTO - условно прекъсване при препълване, IRET - връщане от прекъсване);

l микропроцесорно управление (ST* и CL* - флагове за настройка и нулиране, HLT - спиране, WAIT - изчакване, NOP - празен ход и др.).

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

Команди за трансфер на данни

l MOV dst, src - трансфер на данни (преместване - изпращане от src към dst).

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

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

Src може да бъде от следния тип: r (register) - регистър, m (memory) - памет, i (impedance) - непосредствена стойност. Dst може да бъде от тип r, m. Не можете да използвате следните операнди в една команда: rsegm заедно с i; два операнда от тип m и два операнда от тип rsegm). Операндът i може също да бъде прост израз:

mov AX, (152 + 101B) / 15

Оценката на израза се извършва само по време на превода. Не променя флаговете.

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

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

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

Всяка машинна команда се състои от две части:

  • оперативен - определяне "какво да се направи";
  • операнд - дефиниране на обекти за обработка, "какво да правя с."

Командата на микропроцесорната машина, написана на асемблер, е един ред със следната синтактична форма:

етикет на команда/директива операнд(и); коментари

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

Етикетът, командата/директивата и операндите (ако има такива) са разделени с поне един интервал или знак за разделяне.

Ако дадена команда или директива трябва да бъде продължена на следващия ред, се използва обратната наклонена черта: \.

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

Примерни редове код:

Пребройте db 1 ;Име, директива, един операнд
mov eax,0 ;Команда, два операнда
cbw ; Екип

Етикети

Етикет на асемблер може да съдържа следните символи:

  • всички букви от латинската азбука;
  • числа от 0 до 9;
  • специални знаци: _, @, $, ?.

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

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

Екипи

Екип казва на преводача какво действие трябва да извърши микропроцесорът. В сегмент от данни команда (или директива) дефинира поле, работно пространство или константа. В кодов сегмент командата указва действие, като например преместване (mov) или добавяне (add).

Директиви

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

Операнди

Операнд – обект, върху който се изпълнява машинна команда или израз на език за програмиране.
Една инструкция може да има един или два операнда или изобщо да няма операнди. Броят на операндите е имплицитно определен от кода на инструкцията.
Примери:

  • Няма операнди ret ;Return
  • Един операнд inc ecx ;Увеличаване на ecx
  • Два операнда добавят eax,12 ;Добавете 12 към eax

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

Операндите могат да бъдат

  • идентификатори;
  • поредици от знаци, затворени в единични или двойни кавички;
  • цели числа в двоична, осмична, десетична или шестнадесетична бройна система.
Идентификатори

Идентификатори – поредици от валидни знаци, използвани за обозначаване на програмни обекти като кодове на операции, имена на променливи и имена на етикети.

Правила за запис на идентификатори.

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

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

Програмна структура на събранието

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

Пример за програма „нищо не прави“ на асемблер:

686P
.МОДЕЛ ПЛОСКИ,STDCALL
.ДАННИ
.КОД
НАЧАЛО:

RET
КРАЙ НАЧАЛО

Тази програма съдържа само една микропроцесорна команда. Тази команда е RET. Той гарантира, че програмата завършва правилно. По принцип тази команда се използва за излизане от процедура.
Останалата част от програмата се отнася до работата на преводача.
.686P - Разрешени са команди за защитен режим Pentium 6 (Pentium II). Тази директива избира поддържания набор от инструкции за асемблер, като посочва модела на процесора. Буквата P, посочена в края на директивата, информира преводача, че процесорът работи в защитен режим.
.MODEL FLAT, stdcall - плосък модел на паметта. Този модел памет се използва в операционната зала Windows система. stdcall
.DATA е програмен сегмент, съдържащ данни.
.CODE е програмен блок, съдържащ код.
СТАРТ - етикет. В асемблера таговете играят голяма роля, което не може да се каже за съвременните езици на високо ниво.
END START - край на програмата и съобщение до преводача, че изпълнението на програмата трябва да започне с надпис START.
Всеки модул трябва да съдържа директива END, за да маркира края програмен кодпрограми. Всички редове, които следват директивата END, се игнорират. Ако пропуснете директивата END, се генерира грешка.
Етикетът, посочен след директивата END, казва на преводача името на основния модул, от който започва изпълнението на програмата. Ако програмата съдържа един модул, етикетът след директивата END може да бъде пропуснат.