Програма на асемблерски јазик. Општи карактеристики на командниот систем на јазикот Assembler за IBM-PC (основен сет на команди, основни методи за адресирање на операнди). Структура на програмата во асемблер јазик. Команди на асемблерски јазик

Генерални информацииза асемблерскиот јазик

Симболичниот асемблерски јазик може во голема мера да ги елиминира недостатоците на програмирањето на машинскиот јазик.

Неговата главна предност е што во асемблерскиот јазик сите програмски елементи се претставени во симболична форма. Претворањето симболични имиња на команди во нивните бинарни кодови е одговорност на специјална програма- асемблер, кој го ослободува програмерот од трудоинтензивна работа и ги елиминира неизбежните грешки.

Симболичките имиња што се внесуваат при програмирање на асемблер обично ја одразуваат семантиката на програмата, а кратенката на командите ја одразува нивната главна функција. На пример: PARAM - параметар, ТАБЕЛА - табела, МАСКА - маска, ADD - собирање, SUB - одземање итн. итн. Ваквите имиња лесно ги памети програмерот.

За програмирање на асемблерски јазик, неопходно е да имате сложени алатки отколку за програмирање на машински јазик: ви требаат компјутерски системи базирани на микрокомпјутер или компјутер со комплет периферни уреди(алфанумеричка тастатура, приказ на знаци, пловечки погон и уред за печатење), како и резидентни или вкрстени системи за програмирање за потребните типови на микропроцесори. Јазикот на собранието ви овозможува ефикасно да пишувате и дебагирате многу посложени програми од машинскиот јазик (до 1 - 4 KB).

Јазиците на склопување се машински ориентирани, т.е. зависат од машинскиот јазик и структурата на соодветниот микропроцесор, бидејќи во нив на секоја инструкција на микропроцесорот и е доделено специфично симболично име.

Јазиците на собранието обезбедуваат значително зголемување на продуктивноста на програмерите во споредба со машинските јазици и во исто време ја задржуваат можноста за користење на сите софтверски достапни хардверски ресурси на микропроцесорот. Ова им овозможува на квалификуваните програмери да пишуваат програми што можат да се извршат за помалку од кратко времеи заземаат помалку меморија во споредба со програмите креирани на јазик на високо ниво.

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

Користејќи асемблерски јазик, програмерот може да ги постави следните параметри:

мнемоника (симболично име) на секоја команда на јазикот на машината на микропроцесорот;

стандарден формат за линии на програма напишана на асемблерски јазик;

формат за означување на различни начиниваријанти на адресирање и команда;

формат за одредување на карактерни константи и целобројни константи во различни системи на броеви;

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

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

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

Програмирањето на ниво на машинска инструкција е минималното ниво на кое може да се напишат програмите. Системот на машински инструкции мора да биде доволен за да ги спроведе потребните дејства со издавање инструкции до компјутерскиот хардвер.

Секоја машинска команда се состои од два дела:

· операциона сала - одредување „што да се прави“;

· операнд - дефинирање на објекти за обработка, „со што да се прави“.

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

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

Во овој случај, потребното поле во линијата е команда или директива.

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

Ако некоја команда или директива треба да се продолжи на следната линија, се користи знакот за назад црта: \.

Стандардно, асемблерскиот јазик не прави разлика помеѓу големи и мали букви при пишување наредби или директиви.

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

mov eax, сума ; eax = збир

Асемблерот ја заменува сумата со соодветната адреса зачувана во податочниот сегмент (стандардно адресирана од регистарот ds) и ја става вредноста зачувана на сума во eax регистарот.

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

· индиректно основно (регистерско) адресирање;

· индиректно основно (регистерско) адресирање со офсет;

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

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

Индиректно основно (регистрирано) адресирање.Со ова адресирање, ефективната адреса на операндот може да се лоцира во кој било од регистрите за општа намена, освен sp/esp и bp/ebp (ова се специфични регистри за работа со сегментот на стек). Синтаксички во командата, овој режим на адресирање се изразува со приложување на името на регистарот во квадратни загради.

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

Вовед.

Јазик на кој е напишано оригинална програма, повикан влезјазик, а јазикот на кој е преведен за извршување од страна на процесорот е во слободни деновијазикот. Процесот на конвертирање на влезниот јазик во излезен јазик се нарекува емитува.Бидејќи процесорите се способни да извршуваат програми на бинарен машински јазик, кој не се користи за програмирање, потребно е преведување на сите изворни програми. Познато два начинаемитувања: компилација и толкување.

На компилацијаизворната програма прво е целосно преведена во еквивалентна програма на излезниот јазик, наречена објектпрограма и потоа се извршува. Овој процес се спроведува со помош на специјален програми,повикани компајлер.Компајлерот за кој влезниот јазик е симболична форма на претставување на машинскиот (излезен) јазик на бинарни кодови се нарекува асемблер.

На толкувањаСекоја линија текст во изворната програма се анализира (интерпретира) и командата наведена во неа веднаш се извршува. Имплементацијата на овој метод е доверена на преведувачка програма.Толкувањето трае долго време. За да ја зголеми својата ефикасност, наместо да ја обработува секоја линија, толкувачот прво ги конвертира сите тимнизи до знаци (

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

Јазикот за асемблирање за кој се дискутира подолу се имплементира со помош на компилација.

Карактеристики на јазикот.

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

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

) се користат мнемоници

Одземање (

множење (

Поделби (

итн. Симболичките имиња се користат и за адресирање на мемориските ќелии. За програмирање на асемблерски јазик, наместо бинарни кодови и адреси, треба да знаете само симболични имиња кои асемблерот ги преведува во бинарни кодови;

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

● јазикот обезбедува пристап на сите предметии тимови. Јазиците на високо ниво ја немаат оваа способност. На пример, асемблерскиот јазик ви овозможува да проверите делови од регистарот со знаменце и јазик на високо ниво (на пример,

) ја нема оваа способност. Забележете дека програмските јазици на системи (на пример, C) често заземаат средна позиција. Во однос на пристапноста, тие се поблиску до асемблерски јазик, но имаат синтакса на јазик на високо ниво;

● асемблерски јазик не е универзален јазик.Секоја специфична група на микропроцесори има свој асемблер. Јазиците на високо ниво го немаат овој недостаток.

За разлика од јазиците на високо ниво, пишувањето и дебагирањето на програмата на асемблерски јазик одзема многу време. И покрај ова, асемблерскиот јазик доби широка употребапоради следните околности:

● програма напишана на асемблерски јазик е значително помала по големина и работи многу побрзо од програма напишана на јазик на високо ниво. За некои апликации, овие индикатори играат примарна улога, на пример, многу системски програми(вклучувајќи компајлери), програми на кредитни картички, Мобилни телефони, драјвери за уреди итн.;

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

Во повеќето програми, само мал процент од вкупниот код е одговорен за голем процент од времето на извршување на програмата. Вообичаено, 1% од програмата е одговорна за 50% од времето на извршување, а 10% од програмата е одговорна за 90% од времето на извршување. Затоа, за да се напише одредена програма во реални услови, се користат и асемблер и еден од јазиците на високо ниво.

Операторски формат на асемблерски јазик.

Програма за асемблерски јазик е листа на команди (искази, реченици), од кои секоја зафаќа посебна линија и содржи четири полиња: поле за ознака, поле за операција, поле за операнд и поле за коментари. Секое поле има посебна колона.

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

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

● направи условна или безусловна транзиција кон командата;

● добијте пристап до локацијата каде што се складирани податоците.

Таквите изјави се обезбедени со етикета. За означување на име, се користат (големи) букви од англиската азбука и броеви. Името мора да има буква на почетокот и разделувач на две точки на крајот. Етикетата за две точки може да се напише на посебна линија, а оптичкиот код може да се напише на следната линија во колоната 2, што ја поедноставува работата на компајлерот. Отсуството на дебелото црево не дозволува разликување на етикетата од оперативниот код ако тие се наоѓаат на посебни линии.

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

Не треба да има идентични имиња во полето за етикети, бидејќи етикетата е поврзана со адреси на команди. Ако за време на извршувањето на програмата нема потреба да се повикува команда или податоци од меморијата, тогаш полето за ознака останува празно.

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

Ова поле го содржи мнемоничкиот код за команда или псевдо-команда (види подолу). Командата мнемонички код ја избираат развивачите на јазици. Во асемблерски јазик

мнемоник е избран за да се вчита регистар од меморијата

), и да ја зачувате содржината на регистарот во меморија - мнемоник

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

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

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

Мнемониката на регистрите зависи и од асемблер верзијата (Табела 5.2.1).

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

Тука се наоѓа дополнителни информации, неопходни за извршување на операцијата. Во полето за операнд за команди за скокови, се наведува адресата на која треба да се направи скокот, како и адреси и регистри кои се операнди за машинската команда. Како пример, даваме операнди кои можат да се користат за 8-битни процесори

● нумерички податоци,

претставени во различни системи на броеви. За означување на употребениот броен систем, константата е проследена со едно од Латински букви: ВО,

Соодветно на тоа, бинарни, октални, хексадецимални, децимални броени системи (

Не мора да го запишувате). Ако првата цифра од хексадецимален број е A, B, C,

Потоа се додава незначителна 0 (нула) напред;

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

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

M или нивните адреси во кој било броен систем (на пример, 10B - адреса на регистар

во бинарен систем);

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

за регистерски парови на авиони,

Првите букви се Б,

N; за пар акумулатор и регистар на карактеристики -

; за програмскиот бројач -

;за покажувачот на стек -

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

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

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

● изрази,

кои се конструирани со поврзување на податоците дискутирани погоре со помош на аритметички и логички оператори. Имајте предвид дека методот за резервирање простор за податоци зависи од јазичната верзија. Програмерите на асемблерски јазици за

Дефинирајте го зборот), а подоцна внесете Алтернативна опција.

кој беше на јазикот за процесори од самиот почеток

Во јазична верзија

користени

Дефинирајте константа).

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

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

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

и AN - за 8-битни (тип

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

На секој оперативен код се додаваат суфикси: суфикс

За типот

; наставка „.Б“ за тип

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

) и зборовите во 64-битен регистар користејќи оптички кодови

соодветно.

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

Ова поле дава објаснувања за активностите на програмата. Коментарите не влијаат на работата на програмата и се наменети за луѓе. Тие може да бидат потребни за модификација на програма, која без такви коментари може да биде целосно неразбирлива дури и за искусни програмери. Коментарот започнува со симбол и се користи за објаснување и документирање на програмите. Почетниот карактер на коментарот може да биде:

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

Извичник(!) на јазици за

На секоја посебна линија за коментари и претходи водечки знак.

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

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

основниинструкции кои се еквивалентни на кодот на машината на процесорот. Овие команди ја извршуваат целата обработка наменета од програмата;

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

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

.

При програмирање, постојат ситуации кога, според алгоритмот, истиот синџир на команди мора да се повторува многу пати. За да излезете од оваа ситуација, можете:

● напишете ја потребната низа наредби кога и да се појави. Овој пристап води до зголемување на обемот на програмата;

● распоредете ја оваа низа во процедура (потпрограма) и повикајте ја ако е потребно. Овој излез има свои недостатоци: секој пат кога ќе треба да извршите команда за повикување на специјална процедура и команда за враќање, што, ако низата е кратка и често се користи, може значително да ја намали брзината на програмата.

Наједноставниот и ефективен методповтореното повторување на синџирот на команди се состои од користење макро,што може да се претстави како псевдо-команда дизајнирана да преведе група наредби кои често се наоѓаат во програма.

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

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

Ова е ознака за постојано повторувана низа програмски команди, што се користи за референци во текстот на програмата.

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

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

Во дадената структура на макро-дефиниција, може да се издвојат три дела:

● наслов

макро, вклучувајќи го и името

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

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

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

● тим

дипломирање

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

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

За повторно составување на избраната група команди, се користи приговор кој се состои од името

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

Кога асемблерот ќе наиде на макро дефиниција за време на процесот на компилација, тој го складира во табелата за макро дефиниција. На следните настапи во програмата на името (

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

Користењето макро име како оптички код се нарекува макро-пресврт(макро повик), и заменувајќи го со телото на макро - макро проширување.

Ако програмата е претставена како низа од знаци (букви, бројки, празни места, интерпункциски знаци и се враќа за да се премести во нова линија), тогаш макро проширувањето се состои од замена на некои синџири од оваа низа со други синџири.

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

Процесот на склопување се спроведува во два премини:

l На првото поминување, сите макро дефиниции се зачувани, а макро повиците се прошируваат. Во овој случај, оригиналната програма се чита и се претвора во програма во која се отстранети сите макро дефиниции и секој макро повик се заменува со телото на макрото;

● вториот премин ја обработува добиената програма без макроа.

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

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

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

● со формаленпараметри. При макро проширување, секој формален параметар што се појавува во телото на макрото се заменува со соодветниот вистински параметар.

користејќи макроа со параметри.

Програмата 1 содржи две слични секвенци на команди, кои се разликуваат по тоа што првата ги заменува P и

И вториот

Програмата 2 вклучува макро со два формални параметри P1 и P2. За време на макро проширување, секој знак P1 во макро телото се заменува со првиот вистински параметар (P,

), а симболот P2 се заменува со вториот вистински параметар (

) од програмата бр.1. Во макроповикот

програмата 2 е означена: P,

Првиот вистински параметар,

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

Програма 1

Програма 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Проширени способности.

Ајде да погледнеме некои напредни јазични карактеристики

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

етикетата е прогласена за локална (

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

ви овозможува да дефинирате макроа во други макроа. Оваа напредна функција е многу корисна во комбинација со условно поврзување на програма. Ајде да размислиме

АКО МАКРО ГТ 16 М2 ГТ

Макрото M2 може да се дефинира во двата дела на изјавата

Сепак, дефиницијата зависи од тоа на кој процесор е склопена програмата: 16-битен или 32-битен. Ако М1 не се повика, тогаш макрото М2 воопшто нема да се дефинира.

Друга напредна карактеристика е тоа што макроата можат да повикуваат други макроа, вклучувајќи ги и самите себе - рекурзивенјавете се. Во вториот случај, за да се избегне бескрајна јамка, макрото мора да си пренесе параметар што се менува со секое проширување, а исто така провериовој параметар и завршете ја рекурзијата кога параметарот ќе достигне одредена вредност.

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

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

Зачувување на макро дефиниции.

Сите имиња на макроа се зачувани во табела. Секое име е придружено со покажувач кон соодветното макро за да може да се повика доколку е потребно. Некои асемблери имаат посебна табела за имиња на макроа, други имаат општа табела во која, заедно со имињата на макроата, се наоѓаат сите инструкции и директиви на машината.

Кога ќе наидете на макро за време на склопувањето се создава:

нов елемент на табелатасо името на макрото, бројот на параметри и покажувач кон друга табела за дефиниција на макро каде што ќе се зачува телото на макрото;

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

Телото на макрото, кое е едноставно низа знаци, потоа се чита и се складира во табелата за макро дефиниција. Означени се формалните параметри што се појавуваат во телото на јамката посебен карактер.

Внатрешно претставување на макро

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

MOV EAX, MOV EBX, MOV MOV &

каде точка-запирка се користи како знак за враќање на превозот, а знакот & се користи како формален знак на параметар.

Продолжување на макро повици.

Секогаш кога ќе се сретне макро дефиниција за време на склопувањето, таа се чува во макро табелата. Кога се повикува макро, асемблерот привремено престанува да чита влезни податоци од влезниот уред и почнува да го чита зачуваното макро тело. Формалните параметри извлечени од макро телото се заменуваат со вистински параметри и се обезбедуваат со повикот. Параметрите амперсенд & пред му овозможуваат на асемблерот да ги препознае.

И покрај фактот дека има многу верзии на асемблер, процесите на склопување имаат заеднички карактеристики и се слични на многу начини. Работата на асемблерот со две премини е разгледана подолу.

Двопропусен склопувач.

Програмата се состои од голем број изјави. Затоа, се чини дека при склопување, можете да ја користите следнава низа на дејства:

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

● префрлете го добиениот машински код во датотека, а соодветниот дел од списокот во друга датотека;

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

Сепак, овој пристап не е ефикасен. Пример е таканаречениот проблем напред линк.Ако првата изјава е скок до изјавата P, која се наоѓа на самиот крај на програмата, тогаш асемблерот не може да ја преведе. Тој прво мора да ја одреди адресата на операторот P, а за да го направи тоа мора да ја прочита целата програма. Се повикува секое целосно читање на изворната програма премин.Ајде да покажеме како можете да го решите проблемот со врската со изгледот со користење на две додавања:

на првото поминување треба собираати складирајте ги сите дефиниции на симболи (вклучувајќи етикети) во табелата, а на вториот премин, прочитајте го и составете го секој оператор. Овој метод е релативно едноставен, но второто поминување низ оригиналната програма бара дополнително време поминато на операциите на В/И;

● на првото поминување треба конвертиратепрограмата во средна форма и зачувајте ја во табела, а второто поминување изведете го не според оригиналната програма, туку според табелата. Овој метод на склопување заштедува време, бидејќи второто поминување не врши операции на В/И.

Прво поминување.

Прв гол за додавање- изгради табела со симболи. Како што е наведено погоре, друга цел на првото поминување е да се зачуваат сите макро дефиниции и да се прошират повиците како што се појавуваат. Следствено, и дефиницијата на симболот и макро проширувањето се случуваат во едно поминување. Симболот може да биде или етикета,или значење,на кој му е доделено одредено име со помош на директивата -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 знаци.

Броевите се само цели броеви. Има:

Бинарните броеви завршуваат со буквата Б;

Децимални броеви што завршуваат со буквата D;

Хексадецималните броеви завршуваат со буквата H.

RAM меморија, регистри, презентација на податоци

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

Јазикот на собранието зазема средна позиција помеѓу машинските кодови и јазиците на високо ниво. Програмирањето на овој јазик е полесно. Програма на асемблерски јазик поефикасно ги користи можностите на одредена машина (поточно, MP) отколку програма на јазик на високо ниво (што е поедноставно за програмер отколку за асемблер). Ајде да ги погледнеме основните принципи на програмирање во машински ориентирани јазици користејќи го примерот на асемблерски јазик за MP KR580VM80. За програмирање на јазикот се користи општа методологија. Специфичните технички техники за снимање програми се поврзани со карактеристиките на архитектурата и командниот систем на целниот MP.

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

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

Меморија на MP Ports

С З А.Ц. П В

Слика 1

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

А– 8-битен акумулаторски регистар. Тоа е главниот регистар на пратеникот. Секоја операција извршена во ALU вклучува поставување на еден од операндите што треба да се обработат во акумулаторот. Резултатот од операција во ALU, исто така, обично се складира во А.

Б, Ц, Д, Е, Х, Л– 8-битни регистри за општа намена (GPR). Внатрешна меморијапратеник. Дизајниран да ги складира обработените информации, како и резултатите од операцијата. Кога се обработуваат 16-битни зборови, регистрите формираат парови BC, DE, HL, а двојниот регистар се нарекува прва буква - B, D, H. Кај регистерскиот пар, највисок е првиот регистар. Регистрите H и L имаат посебно својство, кое се користи и за складирање податоци и за складирање на 16-битни адреси на RAM-клетките.

FL– регистер за знаменца (регистер на знаци) 8-битен регистар во кој се чуваат пет знаци за резултатот од извршување на аритметички и логички операции во MP. FL формат според сликата

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

Бит P (паритет) – паритет, поставен на 1 ако бројот на единици во битовите од резултатот е парен.

Цифрата за наизменична струја е дополнително носење, дизајнирана да ја складира носечката вредност од тетрадата од низок ред на резултатот.

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

Бит S (знак) – се поставува на 1 ако резултатот е негативен и на 0 ако резултатот е позитивен.

СП– покажувач на стек, 16-битен регистар, дизајниран да ја зачува адресата на мемориската ќелија каде што е запишан последниот бајт вметнат во стекот.

РС– програмски бројач (програмски бројач), 16-битен регистар, дизајниран да ја зачува адресата на следната инструкција што треба да се изврши. Содржината на програмскиот бројач автоматски се зголемува за 1 веднаш по преземањето на следниот инструкциски бајт.

Почетната мемориска област на адресата 0000Н – 07FF ги содржи контролната програма и програмите за демонстрација. Ова е областа на ROM-от.

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

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

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

Стек е специјално организирана област на RAM меморија наменета за привремено складирање на податоци или адреси. Последниот број напишан на магацинот се појавува прво. Покажувачот на стек ја зачувува адресата на последната клетка на стек во која се напишани информациите. Кога се повикува потпрограма, адресата за враќање на главната програма автоматски се зачувува на стекот. Како по правило, на почетокот на секоја потпрограма, содржината на сите регистри вклучени во неговото извршување се зачувува на стекот, а на крајот од потпрограмата тие се враќаат од стекот.

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

Меморијата на MP KR580VM80 е низа од 8-битни зборови наречени бајти.Секој бајт има своја 16-битна адреса, која ја одредува нејзината позиција во низата мемориски ќелии. Пратеникот може да адресира 65536 бајти меморија, која може да биде содржана и во ROM и во RAM меморија.

Формат на податоци

Податоците се зачувуваат во меморијата како 8-битни зборови:

D7 D6 D5 D4 D3 D2 D1 D0

Најмалку значајниот бит е битот 0, најзначајниот бит е битот 7.

Командата се карактеризира со неговиот формат, т.е., бројот на битови доделени за неа, кои се поделени бајт-по-бајт во одредени функционални полиња.

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

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

Првиот бајт од командата го содржи оперативниот код, напишан во мнемоничка форма.

Го определува форматот на командата и дејствијата што мора да ги изврши MP на податоците при неговото извршување и методот на адресирање, а може да содржи и информации за локацијата на податоците.

Вториот и третиот бајт може да содржат податоци за кои се извршуваат операциите или адреси што ја означуваат локацијата на податоците. Податоците за кои се вршат дејствата се нарекуваат операнди.

Формат на команда од еден бајт според слика 2

Слика 4

Во командите на асемблерски јазик, оперативниот код има скратена форма на пишување англиски зборови - мнемоничка нотација. Mnemonics (од грчкиот mnemonic - уметност на меморирање) го олеснува запомнувањето на командите според нивната функционална намена.

Пред извршувањето, изворната програма се преведува со помош на програма за преведување наречена асемблер на јазикот на комбинации на кодови - машински јазик, во оваа форма се става во меморијата на MP и потоа се користи при извршување на командата.


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

Сите кодови на операнди (влез и излез) мора да се наоѓаат некаде. Тие можат да бидат лоцирани во внатрешните регистри на пратеникот (најзгодно и брза опција). Тие можат да бидат лоцирани во системска меморија(најчеста опција). Конечно, тие можат да се лоцираат во I/O уреди (најредок случај). Локацијата на операндите се одредува со инструкцискиот код. Постои различни методи, со кој инструкцискиот код може да определи каде да го земе влезниот операнд и каде да го постави излезниот операнд. Овие методи се нарекуваат методи на адресирање.

За MP KR580VM80, постојат следниве методи за адресирање:

Директно;

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

Индиректно;

Наредени.

Директно адресирањето претпоставува дека (влезниот) операнд се наоѓа во меморијата веднаш по инструкцискиот код. Операндот е обично константа што треба да се испрати некаде, да се додаде на нешто итн. податоците се содржани во вториот или вториот и третиот бајт од командата, при што нискиот бајт на податоци се наоѓа во вториот бајт од командата. и високиот бајт во третиот команден бајт.

Директно (ака апсолутно) адресирањето претпоставува дека операндот (влез или излез) се наоѓа во меморијата на адресата, чиј код се наоѓа во програмата веднаш по инструкцискиот код. Се користи во команди од три бајти.

Регистрирајте се адресирањето претпоставува дека операндот (влез или излез) е во внатрешниот регистар на MP. Се користи во команди од еден бајт

Индиректно (имплицитно) адресирање претпоставува дека внатрешниот регистар на MP не го содржи самиот операнд, туку неговата адреса во меморијата.

Стак адресирањето претпоставува дека командата не содржи адреса. Адресирање на мемориските ќелии користејќи ја содржината на 16-битниот SP регистар (покажувач на стек).

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

Командниот систем MP е комплетна листа на елементарни дејства што пратеникот е способен да ги изврши. MP контролиран од овие команди врши едноставни дејства, како што се елементарни аритметички и логички операции, пренос на податоци, споредба на две вредности итн. Бројот на команди на MP KR580VM80 е 78 (земајќи ги предвид модификациите 244).

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

Пренос на податоци;

Аритметика;

Закачка за мозоци;

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

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


Симболи и кратенки кои се користат при опишување на команди и составување програми

Симбол Намалување
ADDR 16-битна адреса
ПОДАТОЦИ 8-битни податоци
ПОДАТОЦИ 16 16-битни податоци
ПОСТАНИЕ 8-битна В/И адреса на уредот
BYTE 2 Втор бајт од командата
BYTE 3 Трет бајт команда
R, R1, R2 Еден од регистрите: A, B, C, D, E, H, L
Р.П. Еден од регистерските парови: B - го одредува парот BC; D - одредува пар DE; H – го одредува парот HL
RH Прв регистар на парот
Р.Л. Втор регистар на парот
Λ Логичко множење
В Логично дополнување
Модуло за додавање два
М Мемориска ќелија чија адреса ја одредува содржината на регистерскиот пар HL, т.е. M = (HL)

1. Архитектура на компјутер………………………………………………………………………………

    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 Операции за влез/излез на дискот

11.3.1 Пишување датотека на диск

11.3.1.1 Податоци за ASCIIZ

11.3.1.2 Број на датотека

11.3.1.3 Креирање датотека со диск

11.3.2 Читање датотека на дискот

Вовед

Јазикот на склопување е симболична претстава на машинскиот јазик. Сите процеси во персонален компјутер (ПЦ) на најниско хардверско ниво се водат само со команди (инструкции) на машински јазик. Невозможно е вистински да се решат проблемите поврзани со хардверот (или дури, згора на тоа, зависни од хардверот, како што е зголемувањето на брзината на програмата), без познавање на асемблерот.

Асемблерот е пригодна форма на команди директно за компонентите на компјутерот и бара познавање на својствата и можностите на интегрираното коло што ги содржи овие компоненти, имено, микропроцесорот на компјутерот. Така, асемблерскиот јазик е директно поврзан со внатрешната организација на компјутерот. И не е случајно што скоро сите јазични компајлери на високо ниво поддржуваат пристап до асемблериското ниво на програмирање.

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

Во прирачникот се дискутира за програмирање на асемблерски јазик за компјутери базирани на микропроцесори на Intel.

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

    Архитектура на компјутер.

Компјутерската архитектура е апстрактна претстава на компјутер, која ја рефлектира неговата структурна, кола и логичка организација.

Сите модерни компјутери имаат некои заеднички и индивидуални архитектонски својства. Индивидуалните својства се единствени за одреден компјутерски модел.

Концептот на компјутерска архитектура вклучува:

    компјутерски блок дијаграм;

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

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

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

    метод на презентација и формат на компјутерски податоци;

    збир на инструкции за компјутерска машина;

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

    прекини ракување.

Главните елементи на компјутерскиот хардвер: системска единица, тастатура, уреди за прикажување, дискови, уреди за печатење (печатач) и разни комуникациска опрема. Системска единицасе состои од матична плоча, напојување и ќелии за проширување за дополнителни картички. Системската плоча содржи микропроцесор, меморија само за читање (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 (Extended) означува употреба на 32-битен регистар. За работа со бајти, се користат регистри со префикси L (ниско) и H (високо), на пример, AL, CH - означувајќи ги ниските и високите бајти на 16-битните делови од регистрите.

        Регистри за општа намена.

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

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

ECX/CX/CH/CL – бројач(брои регистар), се користи како бројач за бројот на повторувања на јамката.

EDX/DX/DH/DL – регистар на податоци(регистар на податоци), кој се користи за складирање на средно податоци. Во некои тимови, неговата употреба е задолжителна.

Сите регистри во оваа група дозволуваат пристап до нивните „пониски“ делови. Само долните 16- и 8-битни делови од овие регистри може да се користат за само-адресирање. Горните 16 бита од овие регистри не се достапни како независни објекти.

За поддршка на команди за обработка на низи кои овозможуваат секвенцијална обработка на синџири на елементи со должина од 32, 16 или 8 бита, се користат следново:

ESI/SI (регистар на изворен индекс) – индекс извор. Ја содржи адресата на тековниот изворен елемент.

EDI/DI (регистар на дестинација индекс) – индекс приемник(примател). Ја содржи тековната адреса во одредишната линија.

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

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

EBP/BP (основен показател регистар) – регистер на покажувач на база на магацинот. Дизајниран да организира случаен пристап до податоци во стекот.

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

Софтверскиот модел на микропроцесор има шест сегментни регистри: CS, SS, DS, ES, GS, FS. Нивното постоење се должи на специфичната организација и употреба на RAM меморијата од страна на микропроцесорите на Intel. Хардверот на микропроцесорот ја поддржува структурната организација на програмата која се состои од сегменти.За да се наведат сегментите достапни во овој моментсе наменети сегментните регистри. Микропроцесорот ги поддржува следниве типови сегменти:

    Код сегмент.Содржи програмски команди. За да пристапите до овој сегмент, користете го регистарот CS (регистар на отсечен код) - Регистар на код за сегменти. Ја содржи адресата на сегментот на машинската инструкција до кој има пристап микропроцесорот.

    Сегмент на податоци.Содржи податоци обработени од програмата. За да пристапите до овој сегмент, користете го регистарот DS (регистар на податочен сегмент) - сегментен регистар на податоци, кој ја чува адресата на податочниот сегмент на тековната програма.

    Стак сегмент.Овој сегмент е област на меморија наречена стек. Микропроцесорот го организира оџакот според принципот - прво „влез“, прво „надвор“. За да пристапите до стекот, користете го регистарот SS (регистар на сегменти на стек) - регистер за сегменти на стек, која ја содржи адресата на сегментот на стек.

    Сегмент за дополнителни податоци.Обработените податоци може да се лоцираат во три дополнителни податочни сегменти. Стандардно, податоците се претпоставува дека се во податочниот сегмент. Кога користите дополнителни податочни сегменти, нивните адреси мора да бидат експлицитно наведени со помош на специјални префикси за надминување на сегментот во командата. Адресите на дополнителните податочни сегменти мора да бидат содржани во регистрите ES, GS, FS (регистри на податочниот сегмент на проширување).

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

Микропроцесорот содржи неколку регистри кои содржат информации за состојбата и на самиот микропроцесор и на програмата чии команди моментално се вчитани во цевководот. Ова:

Регистар на покажувач на инструкции EIP/IP;

    регистер за знаме ЕФЛАГИ/ЗНАМИЊА.

Користејќи ги овие регистри, можете да добиете информации за резултатите од извршувањето на командата и да влијаете на состојбата на самиот микропроцесор.

EIP/IP (инструкциски показател регистар) – покажувач тимови. Регистарот EIP/IP е широк 32-битен или 16-битен и го содржи поместувањето на следната инструкција што треба да се изврши во однос на содржината на регистарот на сегментот CS во тековниот инструкциски сегмент. Овој регистар не е директно достапен, но може да се промени со помош на инструкции за скок.

ЗНАМЕ/ЗНАМИЊА (Регистар на знаме) – регистрираат знамиња. Големина на бит 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 (ниво на привилегии за влез/излез) – Ниво на привилегија за влез/излез.Се користи во заштитен режим на работа на микропроцесорот за контрола на пристапот до командите за влез/излез, во зависност од привилегијата на задачата.

NT (вгнездена задача) - знаме за вгнездување на задачи.Се користи во заштитен режим на работа на микропроцесорот за снимање на фактот дека една задача е вгнездена во друга.

Системско знаменце:

IF (знаме со прекин) - знаме за прекинување. Кога IF=0, процесорот престанува да реагира на дојдовните прекини; кога IF=1, блокирањето на прекините се отстранува.

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

RF (знаме за биографија) - знаме за продолжување. Се користи при обработка на прекини од регистри за отстранување грешки.

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

AC (проверка на усогласување) - знаменце за контрола на усогласување.Дизајниран да овозможи контрола на усогласувањето при пристап до меморијата.

      Организација на меморијата.

Физичката меморија до која има пристап микропроцесорот се нарекува 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 * сегмент + offset ја дава апсолутната адреса на ќелијата). Ако, на пример, регистарот CS ја складира вредноста 1234h, тогаш адресниот пар 1234h:507h дефинира апсолутна адреса еднаква на 16*1234h+507h =12340h+507h = 12847h. Таквиот пар е напишан како двоен збор и (како за броевите) во „превртена“ форма: првиот збор содржи поместување, а вториот - сегмент, и секој од овие зборови, пак, е претставен во „превртена“ форма. На пример, парот 1234h:5678h би бил напишан вака:| 78 | 56| 34 | 12|.

Овој механизам за генерирање на физичка адреса овозможува софтверот да може да се премести, односно независен од специфични адреси за вчитување во RAM меморијата.

Програмирањето на ниво на машинска инструкција е минималното ниво на кое може да се напишат програмите. Системот на машински инструкции мора да биде доволен за да ги спроведе потребните дејства со издавање инструкции до компјутерскиот хардвер.

Секоја машинска команда се состои од два дела:

  • оперативно - одредување „што да се прави“;
  • операнд - дефинирање на објекти за обработка, „со што да се прави“.

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

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

Во овој случај, потребното поле во линијата е команда или директива.

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

Ако некоја команда или директива треба да се продолжи на следната линија, се користи знакот за назад црта: \.

Стандардно, асемблерскиот јазик не прави разлика помеѓу големи и мали букви при пишување наредби или директиви.

Пример линии на код:

Брои db 1 ;Име, директива, еден операнд
mov eax,0 ;Команда, два операнди
cbw ; Тим

Тагови

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

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

Точка може да се користи како прв знак на етикетата, но некои компајлери не препорачуваат користење на овој знак. Имињата на резервирани асемблери (директиви, оператори, имиња на команди) не можат да се користат како ознаки.

Првиот знак во етикетата мора да биде буква или посебен знак (но не и број). Максимална должинаознаки – 31 знак. Сите етикети што се напишани на линија што не содржи директива за асемблер мора да завршуваат со две точки: .

Тимови

Тим му кажува на преведувачот какво дејство треба да изврши микропроцесорот. Во податочниот сегмент, командата (или директивата) дефинира поле, работен простор или константа. Во сегментот на код, командата одредува дејство, како што е поместување (mov) или додавање (додавање).

Директиви

Асемблерот има голем број на оператори кои ви дозволуваат да го контролирате процесот на склопување и листање. Овие оператори се нарекуваат директиви . Тие дејствуваат само за време на процесот на склопување на програмата и, за разлика од командите, не генерираат машински код.

Операнди

Операнд – објект на кој се извршува машинска команда или изјава за програмски јазик.
Инструкцијата може да има еден или два операнди или воопшто да нема операнди. Бројот на операнди е имплицитно одреден со инструкцискиот код.
Примери:

  • Нема враќање на операнди ;Враќање
  • Еден операнд inc ecx ;Зголеми ecx
  • Два операнди додаваат eax,12; Додадете 12 на eax

Ознаката, командата (директивата) и операндот не мора да започнуваат на која било одредена позиција во линијата. Сепак, се препорачува да се напишат во колона за да се олесни читањето на програмата.

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

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

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

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

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

Коментарите се одделени од извршната линија со знак; . Во овој случај, се што е напишано после точка-запирка и до крајот на редот е коментар. Користењето коментари во програмата ја подобрува нејзината јасност, особено кога целта на множеството команди е нејасна. Коментарот може да содржи какви било знаци за печатење, вклучувајќи празни места. Коментарот може да ја опфаќа целата линија или да следи команда на истата линија.

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

Програма напишана на асемблерски јазик може да се состои од неколку наречени делови модули . Секој модул може да има дефинирани еден или повеќе сегменти на податоци, стек и код. Секоја комплетна асемблер програма мора да вклучува еден главен или главен модул од кој започнува неговото извршување. Модулот може да содржи кодни сегменти, податочни сегменти и сегменти на стек, декларирани со користење на соодветни директиви. Пред да декларирате сегменти, мора да го наведете моделот на меморија користејќи ја директивата .MODEL.

Пример за програма „не прави ништо“ на асемблерски јазик:

686p
.МОДЕЛ РАМЕН, STDCALL
.ПОДАТОЦИ
.КОД
СТАРТ:

РЕТ
КРАЈ ПОЧЕТ

Оваа програма содржи само една команда на микропроцесорот. Оваа команда е RET. Обезбедува дека програмата правилно завршува. Во принцип, оваа команда се користи за излез од процедура.
Остатокот од програмата се однесува на работата на преведувачот.
.686P - Командите за заштитен режим на Pentium 6 (Pentium II) се дозволени. Оваа директива го избира поддржаниот сет на инструкции за асемблер, што го означува моделот на процесорот. Буквата P означена на крајот од директивата го информира преведувачот дека процесорот работи во заштитен режим.
.MODEL FLAT, stdcall - модел со рамна меморија. Овој модел на меморија се користи во операционата сала Виндоус систем. stdcall
.DATA е програмски сегмент кој содржи податоци.
.CODE е програмски блок кој содржи код.
СТАРТ - етикета. Во асемблер, ознаките играат голема улога, што не може да се каже за современите јазици на високо ниво.
КРАЈ СТАРТ - крај на програмата и порака до преведувачот дека извршувањето на програмата треба да започне со ознаката СТАРТ.
Секој модул мора да содржи директива КРАЈ за да го означи крајот изворен кодпрограми. Сите линии што ја следат директивата КРАЈ се игнорираат. Ако ја испуштите директивата КРАЈ, се генерира грешка.
Ознаката наведена по директивата КРАЈ му го кажува на преведувачот името на главниот модул од кој започнува извршувањето на програмата. Ако програмата содржи еден модул, ознаката по директивата КРАЈ може да се изостави.




Врв