Какви инструкции има асемблерният език. Програмиране: асемблер

Какви инструкции има асемблерният език.  Програмиране: асемблер
Какви инструкции има асемблерният език. Програмиране: асемблер

По предназначение командите могат да бъдат разграничени (примери за мнемонични кодове на операции на команди на компютърен асемблер като 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-битов регистър (включително сегмент) или две места в паметта. Флаговете не се сменят.

Курсова работа

По дисциплина" Системно програмиране»

Тема номер 4: "Решаване на задачи за процедури"

Вариант 2

ИЗТОЧНОСИБИРСКИ ДЪРЖАВЕН УНИВЕРСИТЕТ

ТЕХНОЛОГИЯ И УПРАВЛЕНИЕ

____________________________________________________________________

ТЕХНОЛОГИЧЕН КОЛЕЖ

УПРАЖНЕНИЕ

за курсова работа

Дисциплина:
Тема: Решаване на проблеми за процедури
Художник(и): Главинская Арина Александровна
Ръководител: Сесегма Викторовна Дамбаева
Кратко резюме на работата: изучаването на подпрограми в асемблерния език,
решаване на проблеми с помощта на подпрограми
1. Теоретична част: Основни сведения за асемблерния език (компл
команди и др.), Организация на подпрограми, Начини за предаване на параметри
в подпрограми
2. Практическа част: Разработете две подпрограми, едната от които преобразува дадена буква в главна (включително за руски букви), а другата преобразува буквата в малка.
преобразува дадена буква в главна, а другата преобразува буквата в малка.
преобразува буква в малка.
Срокове на проекта по график:
1. Теоретична част - 30% до 7 седмица.
2. Практическа част - 70% до 11 седмици.
3. Защита - 100% до 14 седмици.
Изисквания за дизайн:
1. Разчетната и обяснителната бележка на курсовия проект трябва да бъдат представени в
електронни и хартиени копия.
2. Обемът на доклада трябва да бъде минимум 20 машинописни страници, без приложенията.
3. RPP се изготвя в съответствие с GOST 7.32-91 и се подписва от ръководителя.

Ръководител на работата __________________

Изпълнител __________________

Дата на издаване " 26 " Септември 2017 Ж.


Въведение. 2

1.1 Основна информация за асемблерния език. 3

1.1.1 Набор от команди. 4

1.2 Организация на подпрограмите на асемблер. 4

1.3 Методи за предаване на параметри в подпрограми. 6

1.3.1 Предаване на параметри през регистри.. 6

1.3.2 Предаване на параметри през стека. 7

2 ПРАКТИЧЕСКА ЧАСТ.. 9

2.1 Постановка на проблема. 9

2.2 Описание на решението на проблема. 9

2.3 Тестване на програмата.. 7

Заключение. 8

Препратки.. 9


Въведение

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

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

Втората област на приложение на Assembler е свързана с оптимизирането на изпълнението на програмата. Много често програмите за превод (компилатори) от езици на високо ниво произвеждат много неефективна програма на машинен език. Това обикновено се отнася за програми с изчислителен характер, в които много малка (около 3-5%) част от програмата (основният цикъл) се изпълнява през повечето време. За решаването на този проблем могат да се използват така наречените многоезични системи за програмиране, които ви позволяват да пишете части от програмата на различни езици. Обикновено основната част от програмата е написана на език за програмиране от високо ниво (Fortran, Pascal, C и др.), а критичните за времето секции на програмата са написани на Assembler. В този случай скоростта на цялата програма може да се увеличи значително. Често това единствения начинда принуди програмата да даде резултат в приемливо време.

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

Работни задачи:

1. Да изучи основната информация за езика Asembler (структурата и компонентите на програмата в Assembler, формата на командите, организацията на подпрограмите и др.);

2. Да се ​​изучават видовете битови операции, формата и логиката на логическите команди на асемблера;

3. Решаване на индивидуална задача за използване на подпрограми в Асемблер;

4.. Формулирайте заключение за свършената работа.

1 ТЕОРЕТИЧЕН ЧАСТ

Основи на асемблерния език

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

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

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

Предимства и недостатъци

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

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

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

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

По-малко налични библиотеки, тяхната ниска съвместимост;

· директен достъп до хардуер: входно-изходни портове, специални процесорни регистри;

максимално "пасване" за желаната платформа (използване на специални инструкции, технически характеристики"жлеза");

· непреносимост към други платформи (с изключение на бинарно съвместими).

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

Дефиниране на данни (константи и променливи);

управление на организацията на програмата в паметта и параметрите на изходния файл;

задаване на режим на компилатор;

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

макроси.

Набор от команди

Типичните инструкции на асемблерния език са:

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

· Аритметични команди(добавяне, подмяна, imul и т.н.)

Логически и побитови операции (или, и, xor, shr и т.н.)

Команди за управление на изпълнението на програмата (jmp, loop, ret и др.)

Команди за прекъсване на повикване (понякога наричани контролни команди): int

I/O команди към портове (вход, изход)

Микроконтролерите и микрокомпютрите също се характеризират с команди, които извършват проверки и преходи по условие, например:

· jne - скок, ако не е равен;

· jge - скок, ако е по-голямо или равно на .

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

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

Всички езици за програмиране са разделени на нива: ниско и високо. Всяка от синтактичните системи на „семейството“ на Assembler е различна по това, че съчетава едновременно някои от предимствата на най-често срещаните и модерни езици. Те също са свързани с другите от факта, че можете да използвате напълно компютърната система.

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

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

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

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

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

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

Езикови професионалисти

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

Драйвери, операционни системи, BIOS, компилатори, интерпретатори и т.н. са програми на асемблерни езици.

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

Минуси на езика

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

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

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

Езикови команди

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


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

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

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


произход на името

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

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

макро инструменти

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

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

Въведение.

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

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

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

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

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

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

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

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

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

изваждания (

умножение (

дивизии (

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

● числени данни,

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

Съответно, двоични, осмични, шестнадесетични, десетични бройни системи (

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

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

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

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

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

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

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

за регистрирани двойки самолети,

Първите букви Б

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

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

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

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

(когато условието е изпълнено) и безусловни преходи.Например операнд 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). Операционните кодове са разделени на групи в зависимост от броя и вида на операндите. Типът на командата определя номера на групата и указва процедурата, която се извиква за обработка на всички команди в тази група.

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

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

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

Оригиналната програма може да съдържа грешки, например:

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

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

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

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

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

Обща информация за асемблерния език

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

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

Символичните имена, въведени при програмиране на асемблер, като правило отразяват семантиката на програмата, а съкращението на командите - тяхната основна функция. Например: PARAM - параметър, TABLE - таблица, MASK - маска, ADD - събиране, SUB - изваждане и т.н. н. Такива имена се запомнят лесно от програмиста.

За програмиране на асемблер е необходимо да имате сложни инструменти, отколкото за програмиране на машинен език: имате нужда от компютърни системи, базирани на микрокомпютри или компютри с набор периферни устройства(буквено-цифрова клавиатура, символен дисплей, флопидисково устройство и принтер), както и резидентни или крос-програмни системи за необходимите типове микропроцесори. Асемблерният език ви позволява ефективно да пишете и дебъгвате много по-сложни програми от машинния език (до 1 - 4 KB).

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

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

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

Използвайки асемблер, програмистът може да зададе следните параметри:

мнемоника (символно име) на всяка команда от машинния език на микропроцесора;

стандартен форматза редове на програма, описана в асемблер;

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

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

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

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

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

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

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

операционна - определяща "какво да се направи";

· операнд - дефиниране на обработващи обекти, "какво да се прави с".

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

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

При което задължително поле in line е команда или директива.

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

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

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

Директно адресиране: Ефективният адрес се определя директно от полето за отместване на машинната инструкция, което може да бъде с размер 8, 16 или 32 бита.

mov eax, сума; eax = сума

Асемблерът заменя sum със съответния адрес, съхранен в сегмента с данни (по подразбиране, адресиран от регистър ds) и поставя стойността, съхранена на адрес sum в регистър eax.

индиректно адресиранена свой ред има следните видове:

Непряка основна (регистрова) адресация;

Непряка основна (регистрова) адресация с отместване;

· индиректно индексно адресиране;

· индиректно базово индексно адресиране.

Непряка основна (регистрова) адресация.С това адресиране ефективният адрес на операнда може да бъде във всеки от регистрите с общо предназначение, с изключение на sp / esp и bp / ebp (това са специфични регистри за работа със сегмент на стека). Синтактично в инструкция този режим на адресиране се изразява чрез затваряне на името на регистъра в квадратни скоби.

mov eax, ; eax = *esi; *esi стойност на адрес esi