Основни компоненти на асемблерски јазик и структура на наставата. Формат на податоци и структура на команди на асемблерски јазик. Во дисциплината „Системско програмирање“

Вовед.

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

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

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

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

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

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

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

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

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

Одземање (

множење (

Поделби (

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не мора да го запишувате). Ако првата цифра од хексадецимален број е 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). Оперативните кодови се поделени во групи во зависност од бројот и видот на операнди. Типот на команда го одредува бројот на групата и ја одредува постапката што се повикува да ги обработи сите команди во таа група.

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

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

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

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

дадениот симбол не е дефиниран или е дефиниран повеќе од еднаш;

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

● нема оператор

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

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

НАЦИОНАЛЕН УНИВЕРЗИТЕТ ВО УЗБЕКИСТАН ИМЕНА ПО МИРЗО УЛУГБЕК

ФАКУЛТЕТ ЗА КОМПЈУТЕРСКА ТЕХНОЛОГИЈА

На тема: Семантичко парсирање на датотека EXE.

Завршено:

Ташкент 2003 година.

Предговор.

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

Структура на датотеката EXE (семантичко парсирање).

Структура на датотеката COM.

Принципот на дејствување и ширење на вирусот.

Расклопувач.

Програми.

Предговор

Професијата програмер е неверојатна и единствена. Во денешно време е невозможно да се замисли науката и животот без најновата технологија. Сè што е поврзано со човековата активност не може без компјутерска технологија. И ова придонесува за неговиот висок развој и совршенство. Иако развојот на персоналните компјутери започна не толку одамна, за тоа време беа направени колосални чекори во софтверските производи и овие производи ќе бидат широко користени долго време. Областа на знаење поврзано со компјутери претрпе експлозија, како и соодветната технологија. Ако не ја земеме предвид комерцијалната страна, тогаш можеме да кажеме дека нема странци во оваа област на професионална дејност. Многу луѓе развиваат програми не за профит или приход, туку од своја слободна волја, од страст. Се разбира, тоа не треба да влијае на квалитетот на програмата, а во овој бизнис, така да се каже, постои конкуренција и побарувачка за квалитетно извршување, стабилна работа и исполнување на сите современи барања. Тука, исто така, вреди да се забележи појавата на микропроцесори во 60-тите години, кои дојдоа да заменат голем број комплети светилки. Постојат некои видови на микропроцесори кои се многу различни еден од друг. Овие микропроцесори се разликуваат еден од друг по нивната длабочина на бит и вградените системски команди. Најчести се: Intel, IBM, Celeron, AMD итн. Сите овие процесори се поврзани со напредната архитектура на процесорите на Intel. Ширењето на микрокомпјутерите предизвика преиспитување на ставовите кон асемблерскиот јазик од две главни причини. Прво, програмите напишани на асемблерски јазик бараат значително помалку меморија и време за извршување. Второ, познавањето на асемблерскиот јазик и добиениот машински код обезбедува разбирање на архитектурата на машината, што е малку веројатно да се обезбеди кога се работи на јазик на високо ниво. Иако повеќето софтверски професионалци се развиваат на јазици на високо ниво како што се Pascal, C или Delphi, што е полесно кога пишувате програми, најмоќните и најефикасните софтвернапишано целосно или делумно на асемблерски јазик. Јазиците на високо ниво беа дизајнирани да избегнуваат посебни технички карактеристикиспецифични компјутери. И асемблерскиот јазик, пак, е дизајниран за специфичните специфики на процесорот. Затоа, за да напишете програма за асемблерски јазик за одреден компјутер, мора да ја знаете неговата архитектура. Деновиве погледот на главната софтверски производе датотека EXE. Со оглед на позитивни страниОва значи дека авторот на програмата може да биде сигурен во нејзиниот интегритет. Но, често ова е далеку од случајот. Има и расклопувач. Со помош на расклопувач, можете да дознаете прекини и програмски кодови. Нема да биде тешко за човек кој е добро упатен во асемблерот да ја преработи целата програма по негов вкус. Можеби тука се јавува најнерешливиот проблем - вирусот. Зошто луѓето пишуваат вирус? Некои го поставуваат ова прашање со изненадување, некои со гнев, но сепак и понатаму има луѓе кои се заинтересирани за оваа задача не од гледна точка на предизвикување каква било штета, туку како интерес за системско програмирање. Вирусите се напишани од различни причини. Некои луѓе сакаат системски повици, други го подобруваат своето знаење за асемблерот. Сето ова ќе се обидам да го објаснам во мојот работа на курсот. Исто така, кажува не само за структурата на датотеката EXE, туку и за јазикот на асемблирањето.

^ асемблерски јазик.

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

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

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

Невозможно е вистински да се решат проблемите поврзани со хардверот (или дури, згора на тоа, зависни од хардверот, како што е зголемувањето на брзината на програмата), без познавање на асемблерот.

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

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

Типичен модерен компјутер (базиран на i486 или Pentium) се состои од следните компоненти (Слика 1).

Ориз. 1. Компјутер и периферни уреди

Ориз. 2. Блок дијаграм персонален компјутер

Од сликата (слика 1) е јасно дека компјутерот е составен од неколку физички уреди, од кои секој е поврзан со една единица, наречена системска единица. Ако размислуваме логично, јасно е дека тој ја игра улогата на некој вид координативен уред. Ајде да погледнеме внатре во системската единица (нема потреба да се обидувате да влезете во мониторот - нема ништо интересно таму, а покрај тоа, тоа е опасно): отворете го куќиштето и видете неколку табли, блокови, жици за поврзување. За да ја разбереме нивната функционална цел, да го погледнеме блок дијаграмот на типичен компјутер (сл. 2). Не бара апсолутна точност и е наменет само да ја прикаже целта, меѓусебната поврзаност и типичниот состав на елементите на модерен персонален компјутер.

Ајде да разговараме за дијаграмот на сл. 2 во малку неконвенционален стил.
Вообичаено е човек, кога ќе наиде на нешто ново, да бара некои асоцијации кои можат да му помогнат да го разбере непознатото. Какви асоцијации предизвикува компјутерот? На пример, јас често поврзувам компјутер со самата личност. Зошто?

Кога некој создавал компјутер, некаде длабоко во себе мислел дека создава нешто слично на себе. Компјутерот има органи за примање информации од надворешниот свет - тастатура, глувче и магнетни дискови. На сл. 2 овие органи се наоѓаат десно од системските автобуси. Компјутерот има органи кои ги „варат“ добиените информации - тоа се Процесороти RAM меморија. И, конечно, компјутерот има говорни органи кои ги произведуваат резултатите од обработката. Ова се исто така некои од уредите на десната страна.

Модерни компјутери, се разбира, е далеку од човечки. Тие можат да се споредат со суштества кои комуницираат со надворешниот свет на ниво на голем, но ограничен сет на безусловни рефлекси.
Овој сет на рефлекси формира систем на машински команди. Без разлика колку високо ниво комуницирате со компјутер, тоа на крајот се сведува на здодевна и монотона низа на машински команди.
Секоја машинска команда е еден вид стимул за возбудување на еден или друг безусловен рефлекс. Реакцијата на овој стимул е секогаш недвосмислена и „тврдена“ во микрокомандниот блок во форма на микропрограма. Оваа микропрограма спроведува активности за имплементација на машинска команда, но на ниво на сигнали доставени до одредени логикакомпјутер, а со тоа контролира различни потсистеми на компјутерот. Ова е таканаречениот принцип на контрола на микропрограмата.

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

Така, иако надворешно е полиглот, компјутерот разбира само еден јазик - јазикот на машинските инструкции. Се разбира, за комуникација и работа со компјутер, не е неопходно да се знае овој јазик, но скоро секој професионален програмер порано или подоцна се соочува со потреба да го проучува. За среќа, програмерот не мора да се обидува да го разбере значењето на различни комбинации на бинарни броеви, бидејќи уште во 50-тите, програмерите почнаа да користат симболичен аналог на машинскиот јазик за програмирање, кој беше наречен асемблерски јазик. Овој јазик точно ги одразува сите карактеристики на машинскиот јазик. Затоа, за разлика од јазиците на високо ниво, асемблерскиот јазик е различен за секој тип на компјутер.

Од сето погоре, можеме да заклучиме дека бидејќи асемблерскиот јазик е „мајчин“ за компјутер, најефективната програма може да се напише само во него (под услов да е напишана од квалификуван програмер). Има едно мало „но“ овде: ова е многу трудоинтензивен процес кој бара многу внимание и практично искуство. Затоа, во реалноста, тие главно пишуваат програми во асемблер што треба да ги обезбеди ефективна работасо хардвер. Понекогаш програмските делови кои се критични во однос на времето на извршување или потрошувачката на меморија се запишуваат во асемблер. Последователно, тие се формализирани во форма на потпрограми и се комбинираат со код на јазик на високо ниво.

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

Овие регистри може да се поделат во две големи групи:

^ 16 регистри на корисници;

16 системски регистри.

Програмите на асемблерски јазик многу интензивно користат регистри. Повеќето регистри имаат одредена функционална намена.

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

Осум 32-битни регистри кои програмерите можат да ги користат за складирање податоци и адреси (исто така наречени регистри за општа намена (GPR)):

шест сегментни регистри: cs, ds, ss, es, fs, gs;

статус и контролни регистри:

Знамиња регистрираат знамиња/знамиња;

Регистар на команден покажувач eip/ip.

Ориз. 3. Кориснички регистри на микропроцесорите i486 и Pentium

Зошто многу од овие регистри се прикажани со коси црти? Не, ова не се различни регистри - тие се делови од еден голем 32-битен регистар. Тие можат да се користат во програмата како посебни објекти. Ова беше направено за да се обезбеди функционалност на програмите напишани за помлади 16-битни модели на микропроцесори на Intel, почнувајќи од i8086. Микропроцесорите i486 и Pentium имаат претежно 32-битни регистри. Нивниот број, со исклучок на регистрите на сегменти, е ист како оној на i8086, но димензијата е поголема, што се рефлектира во нивните ознаки - тие имаат
префикс e (Проширено).

^ Регистри за општа намена
Сите регистри во оваа група ви дозволуваат пристап до нивните „пониски“ делови (види Сл. 3). Гледајќи ја оваа бројка, забележете дека само долните 16 и 8-битни делови од овие регистри може да се користат за само-адресирање. Горните 16 бита од овие регистри не се достапни како независни објекти. Ова беше направено, како што забележавме погоре, за компатибилност со помладите 16-битни модели на Intel микропроцесори.

Да ги наведеме регистрите кои припаѓаат на групата регистри за општа намена. Бидејќи овие регистри се физички лоцирани во микропроцесорот во аритметичка логичка единица (ALU), тие се нарекуваат и ALU регистри:

eax/ax/ah/al (акумулаторски регистар) - батерија.
Се користи за складирање на средни податоци. Некои команди бараат употреба на овој регистар;

ebx/bx/bh/bl (Основен регистар) - базен регистар.
Се користи за складирање на основната адреса на некој објект во меморијата;

ecx/cx/ch/cl (Регистар на брои) - бројач регистар.
Се користи во тимови кои вршат некои повторувачки дејства. Неговата употреба е често имплицитна и скриена во алгоритмот на соодветната команда.
На пример, наредбата за организирање циклус на јамка, покрај тоа што ја пренесува контролата на команда која се наоѓа на одредена адреса, ја анализира и ја намалува вредноста на регистарот ecx/cx за еден;

edx/dx/dh/dl (Регистар на податоци) - регистар на податоци.
Исто како и регистарот eax/ax/ah/al, складира средни податоци. Во некои команди неговата употреба е задолжителна; За некои команди ова се случува имплицитно.

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

esi/si (регистар на изворен индекс) - изворен индекс.
Овој регистар во синџирните операции ја содржи моменталната адреса на елементот во изворниот синџир;

edi/di (Destination Index register) - индекс на примачот (примач).
Овој регистар во синџирните операции ја содржи тековната адреса во синџирот на дестинација.

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

esp/sp (Stack Pointer register) - регистер на покажувачи на стек.
Содржи покажувач кон врвот на оџакот во тековниот сегмент на стек.

ebp/bp (Регистар на базен покажувач) - регистер на базен покажувач на рамката на магацинот.
Дизајниран да организира случаен пристап до податоци во стекот.

Стак е програмска област за привремено складирање на произволни податоци. Се разбира, податоците може да се складираат и во податочен сегмент, но во овој случај, за секој привремено складиран податок, мора да се креира посебна мемориска ќелија со име, што ја зголемува големината на програмата и бројот на употребени имиња. Практичноста на оџакот лежи во фактот што неговата област е повторно употреблива, а складирањето на податоците на стекот и нивното вадење од таму се врши со помош на ефективни команди за push и pop без да се наведат имиња.
Стакот традиционално се користи, на пример, за зачувување на содржината на регистрите што ги користи програмата пред да се повика потпрограма, која, пак, ќе ги користи регистрите на процесорот „за свои цели“. Оригиналната содржина на регистрите се појавува од оџакот откако ќе се врати потпрограмата. Друга вообичаена техника е да се пренесат потребните параметри на потпрограмата преку стекот. Потпрограмата, знаејќи по кој редослед се поставени параметрите на оџакот, може да ги земе од таму и да ги користи за време на неговото извршување. Карактеристична карактеристикаСтекот е единствен редослед по кој се преземаат податоците содржани во него: во кое било време, само горниот елемент е достапен на стекот, т.е. елементот неодамна турнат на оџакот. Повлекувањето на горниот елемент од оџакот го прави следниот елемент достапен. Елементите на магацинот се наоѓаат во мемориската област доделена за стекот, почнувајќи од дното на стекот (т.е. од неговата максимална адреса) со секвенцијално намалување на адресите. Адресата на горниот, достапен елемент е зачувана во регистарот на покажувачи на стек SP. Како и секоја друга област на програмска меморија, оџакот мора да биде дел од некој сегмент или да формира посебен сегмент. Во секој случај, адресата на сегментот на овој сегмент е сместена во регистарот на стек сегменти SS. Така, парот на регистри SS:SP ја опишува адресата на достапната клетка на стек: SS ја зачувува адресата на сегментот на стекот, а SP го складира поместувањето на последните податоци зачувани на стекот (сл. 4, а). Забележете дека во почетната состојба, покажувачот на стек SP покажува на ќелија која лежи под дното на стек и не е вклучена во неа.

Сл. 4. Организација на стек: а - почетна состојба, б - по вчитување на еден елемент (во овој пример, содржината на регистарот AX), в - по вчитување на вториот елемент (содржина на регистарот DS), г - по растоварување на еден елемент, e - по растоварување на два елементи и враќање во нивната првобитна состојба.

Вчитувањето во оџакот се врши со посебна команда за работа со стек (туркање). Оваа инструкција прво ја намалува содржината на покажувачот на стекот за 2, а потоа го става операндот на адресата во SP. Ако, на пример, сакаме привремено да ја зачуваме содржината на регистарот AX на магацинот, треба да ја извршиме командата

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

ќе го стави оџакот во состојбата прикажана на сл. 1.10, в. Сега стекот ќе складира два елементи, а само горниот, на кој покажува покажувачот на стекот SP, ќе биде достапен. Ако по некое време треба да ја вратиме оригиналната содржина на регистрите зачувани на стекот, мора да ги извршиме командите pop (push) за да се растоварат од стекот:

поп ДС
поп секира

Колку треба да биде оџакот? Зависи од тоа колку интензивно се користи во програмата. Ако, на пример, планирате да складирате низа од 10.000 бајти на оџакот, тогаш стекот мора да биде барем оваа големина. Треба да се има на ум дека во некои случаи оџакот автоматски се користи од системот, особено при извршување на командата за прекин на int 21h. Со оваа команда, процесорот прво ја турка повратната адреса на стекот, а потоа DOS ја турка содржината на регистрите и другите информации поврзани со прекинатата програма на стекот. Затоа, дури и ако програмата воопшто не користи стек, тој сепак мора да биде присутен во програмата и да има најмалку неколку десетици зборови во големина. Во нашиот прв пример, доделивме 128 зборови на магацинот, што секако е доволно.

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

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

Постојат четири типа на асемблер изјави:

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

макрокоманди - реченици на програмски текст форматиран на одреден начин, заменети за време на емитувањето со други реченици;

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

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

^ Синтакса на собранието

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

Ориз. 5. Формат на собраниска реченица

Ориз. 6. Формат на директивата

Ориз. 7. Формат на команди и макроа

На овие слики:

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

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

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

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

^ Како да користите синтаксни дијаграми? Многу е едноставно: сè што треба да направите е да најдете и потоа да ја следите патеката од влезот на дијаграмот (лево) до неговиот излез (десно). Ако постои таква патека, тогаш реченицата или конструкцијата е синтаксички точна. Ако не постои таква патека, тогаш компајлерот нема да ја прифати оваа конструкција. Кога работите со синтаксни дијаграми, обрнете внимание на насоката на премин означена со стрелките, бидејќи меѓу патеките може да има некои што може да се следат од десно кон лево. Во суштина, синтаксните дијаграми ја рефлектираат логиката на работата на преведувачот при парсирање на влезните реченици на програмата.

Прифатливи знаци при пишување текст на програмата се:

Сите писма: A-Z, a-z. Во овој случај, големите и малите букви се сметаат за еквивалентни;

Броеви од 0 до 9;

Знаци ?, @, $, _, &;

Сепаратори,. ()< > { } + / * % ! " " ? \ = # ^.

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

Лексемите се:

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

^Команди на асемблерот.

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

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

Долниот ред од оваа табела ги прикажува вредностите на знаменцата откако ќе се изврши командата. Се користат следните ознаки:

1 - откако ќе се изврши командата, се поставува знамето (еднакво на 1);

0 - откако ќе се изврши командата, знамето се ресетира (еднакво на 0);

r - вредноста на знамето зависи од резултатот на командата;

Откако ќе се изврши командата, знамето не е дефинирано;

простор - откако ќе се изврши командата, знамето не се менува;

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

r8, r16, r32 - операнд во еден од регистрите со големина на бајт, збор или двоен збор;

m8, m16, m32, m48 - бајт со големина на мемориски операнд, збор, двоен збор или 48 бита;

i8, i16, i32 - директна големина на операнд бајт, збор или двоен збор;

a8, a16, a32 - релативна адреса (офсет) во сегментот на кодот.

Команди (по азбучен ред):

*Овие команди се детално опишани.

ДОДАЈ
(ДОДАТОК)

Додаток

^ Команден дијаграм:

додадете дестинација, извор

Цел: додавање на два изворни и одредишни операнди со големина бајт, збор или двоен збор.

Работен алгоритам:

додајте ги изворните и одредишните операнди;

напишете го резултатот од собирањето на примачот;

постави знамиња.

Состојба на знаменца по извршување на командата:

Апликација:
Командата add се користи за додавање два целобројни операнди. Резултатот од собирањето се става на адресата на првиот операнд. Ако резултатот од додавањето оди подалеку од границите на операндот на примачот (се јавува прелевање), тогаш оваа ситуација треба да се земе предвид со анализа на знамето cf и последователната можна употреба на командата adc. На пример, да ги додадеме вредностите во регистарот со оски и областа на меморијата ch. Кога додавате, земете ја предвид можноста за прелевање.

Регистрирајте плус регистар или меморија:

|000000dw|modregr/rm|

Регистар AX (AL) плус непосредна вредност:

|0000010w|--податоци--|податоци ако w=1|

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

|100000sw|mod000r/m|--податоци--|податоци ако BW=01|

ПОВИК
(ПОВИК)

Повикување постапка или задача

^ Команден дијаграм:

Цел:

пренесување на контролата на блиска или далечна процедура со зачувување на адресата на повратната точка на оџакот;

префрлување задачи.

Работен алгоритам:
определен од типот на операндот:

Near label - содржината на командниот покажувач eip/ip се турка на оџакот и новата адресна вредност што одговара на етикетата се вчитува во истиот регистар;

Далечна ознака - содржината на командниот покажувач eip/ip и cs се турка на оџакот. Потоа во истите регистри се вчитуваат нови адресни вредности што одговараат на далечната ознака;

R16, 32 или m16, 32 - дефинирајте регистар или мемориска ќелија која содржи поместувања во тековниот сегмент на инструкции на кој се пренесува контролата. Кога контролата се пренесува, содржината на командниот покажувач eip/ip се турка на оџакот;

Мемориски покажувач - дефинира мемориска локација која содржи покажувач од 4 или 6 бајти кон повиканата процедура. Структурата на таков покажувач е 2+2 или 2+4 бајти. Толкувањето на таков покажувач зависи од режимот на работа на микропроцесорот:

^ Состојба на знаменца по извршување на командата (освен префрлување задачи):

извршувањето на командата не влијае на знаменцата

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

Код на објектот (четири формати):

Директно адресирање во сегмент:

|11101000|дисп-ниско|ниско-високо|

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

|11111111|mod010r/m|

Индиректно адресирање помеѓу сегментите:

|11111111|mod011r/m|

Директно адресирање помеѓу сегментите:

|10011010|поместување-ниско|офсет-високо|сег-ниско|сег-високо|

CMP
(Спореди ги операнди)

Споредба на операнд

^ Команден дијаграм:

cmp операнд 1, операнд 2

Цел: споредба на два операнди.

Работен алгоритам:

изврши одземање (операнд1-операнд2);

во зависност од резултатот, поставете ги знаменцата, не менувајте ги операндот1 и операндот2 (односно, не се сеќавајте на резултатот).

Апликација:
Оваа командасе користи за споредување на два операнди со одземање без промена на операндите. Врз основа на резултатите од командата, се поставуваат знаменца. Командата cmp се користи со командите за условен скок и со командата за сет бајт по вредност setcc.

Код на објектот (три формати):

Регистрирај се или меморија со регистар:

|001110dw|modregr/m|

Непосредна вредност со регистарот AX (AL):

|0011110w|--податоци--|податоци ако w=1|

Непосредна вредност со регистар или меморија:

|100000sw|mod111r/m|--податоци--|податоци ако sw=0|

ДЕК
(Операндот го намалува за 1)

Намалување на операнд за еден

^ Команден дијаграм:

дек операнд

Цел: Намалете ја вредноста на операндот во меморијата или регистрирајте се за 1.

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

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

Регистрирај се: |01001reg|

^ Регистрирај се или меморија: |1111111w|mod001r/m|

DIV
(Поделете непотпишано)

Непотпишана поделба

Тимски преглед:

див делител

Цел: Изведете операција за делење помеѓу две неозначени бинарни вредности.

^ Оперативен алгоритам:
Наредбата бара два операнди - дивиденда и делител. Дивидендата е наведена имплицитно и нејзината големина зависи од големината на делителот, што е наведено во командата:

ако делителот е со големина на бајт, тогаш дивидендата мора да биде лоцирана во регистарот на секира. По операцијата, количникот се става во al, а остатокот во ah;

ако делителот е со големина на збор, тогаш дивидендата мора да се наоѓа во регистерскиот пар dx:ax, при што делот од дивидендата од низок ред се наоѓа во ax. По операцијата, количникот се става во секира, а остатокот во dx;

ако делителот е со двоен збор по големина, тогаш дивидендата мора да се наоѓа во регистерскиот пар edx:eax, при што делот од дивидендата со низок ред се наоѓа во eax. По операцијата, количникот се става во eax, а остатокот во edx.

^ Состојба на знаменца по извршување на командата:

Апликација:
Командата врши целобројна поделба на операндите, произведувајќи го резултатот од делењето како количник и остатокот од делењето. При извршување на операција за поделба, може да се појави исклучок: 0 - грешка во делењето. Оваа ситуација се јавува во еден од двата случаи: делителот е 0 или количникот е преголем за да се вклопи во регистарот eax/ax/al.

Код на објектот:

|1111011w|mod110r/m|

ИНТ
(Прекине)

Повикување на рутинска услуга за прекин

^ Команден дијаграм:

int interrupt_number

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

^ Оперативен алгоритам:

турнете ги знаменцата на регистерските ознаки/знамињата и адресата за враќање на оџакот. При пишување повратна адреса, прво се запишува содржината на сегментниот регистар cs, а потоа содржината на командниот покажувач eip/ip;

ресетирајте ги знаменцата if и tf на нула;

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

^ Состојба на знаменца по извршување на командата:

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

int 3 - има сопствена индивидуална оперативна шифра 0cch и зафаќа еден бајт. Оваа околност го прави многу погодно за употреба во различни софтверски дебагери за поставување точки на прекин со замена на првиот бајт од која било команда. Микропроцесорот, наидувајќи на команда со оперативен код 0cch во низата наредби, ја повикува програмата за обработка на прекини со вектор број 3, која служи за комуникација со софтверскиот дебагер.

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

Код на објектот (два формати):

Регистрирај се: |01000рег|

^ Регистрирај се или меморија: |1111111w|mod000r/m|

J.C.C.
JCXZ/JECXZ
(Скокни ако услов)

(Скокни ако CX=Нула/Скокни ако ECX=Нула)

Скокни ако условот е исполнет

Скокни ако CX/ECX е нула

^ Команден дијаграм:

ознака jcc
jcxz етикета
jecxz етикета

Цел: транзиција во тековниот команден сегмент во зависност од некоја состојба.

^ Команден алгоритам (освен jcxz/jecxz):
Проверка на состојбата на знаменцата во зависност од оптичкиот код (тоа ја одразува состојбата што се проверува):

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

ако условот што се проверува е неточен, тогаш префрлете ја контролата на следната команда.

Алгоритам за командата jcxz/jecxz:
Проверка на условот дека содржината на регистарот ecx/cx е еднаква на нула:

доколку состојбата се проверува

Структура на команди во асемблерски јазик Програмирањето на ниво на машински команди е минималното ниво на кое е можно компјутерско програмирање. Системот за команда на машината мора да биде доволен за спроведување на бараните дејства со издавање инструкции на машинската опрема. Секоја машинска инструкција се состои од два дела: оперативен, кој одредува „што да се прави“ и операнд, кој ги одредува објектите за обработка, односно „што да се прави“. Инструкција за машина за микропроцесор, напишана на јазик на собранието, е единечна линија која ја има следната форма: операнд(и) команда/директива на ознака; коментари Етикетата, командата/директивата и операндот се одделени со барем еден знак за празно место или таб. Операндите на командата се одделени со запирки.

Структура на команда на асемблерски јазик Командата за асемблер му кажува на преведувачот каква акција треба да изврши микропроцесорот. Директивите за склопување се параметри наведени во текстот на програмата кои влијаат на процесот на склопување или на својствата на излезната датотека. Операндот ја одредува почетната вредност на податоците (во податочниот сегмент) или елементите на кои се врши командното дејство (во сегментот на кодот). Инструкцијата може да има еден или два операнди или да нема операнди. Бројот на операнди е имплицитно одреден со инструкцискиот код. Ако некоја команда или директива треба да се продолжи на следната линија, се користи знакот за назад црта: "" . Стандардно, асемблерот не прави разлика помеѓу големи и мали букви кога пишува команди и директиви. Примери на директиви и команди Брои db 1 ; Име, директива, еден операнд mov eax, 0 ; Команда, два операнди

Идентификаторите се низи од валидни знаци кои се користат за означување на имиња на променливи и имиња на етикети. Идентификаторот може да се состои од еден или повеќе од следниве знаци: сите букви од латинската азбука; броеви од 0 до 9; специјални знаци: _, @, $, ? . Точка може да се користи како прв знак на етикетата. Резервираните имиња на асемблерите (директиви, оператори, имиња на команди) не можат да се користат како идентификатори. Првиот знак на идентификаторот мора да биде буква или посебен знак. Максимална должинаИдентификаторот има 255 знаци, но преведувачот ги прифаќа првите 32 и ги игнорира останатите. Сите етикети што се напишани на линија што не содржи директива за асемблер мора да завршуваат со две точки „:“. Ознаката, командата (директивата) и операндот не мора да започнуваат на која било одредена позиција во линијата. Се препорачува да се запишат во колона за поголема читливост на програмата.

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

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

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

Модели на меморија Пред да декларирате сегменти, треба да го наведете моделот на меморија користејќи директива. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Основни мемориски модели на асемблерски јазик: Мемориски модел Адресирање на код Адресирање на податоци операционен системКод и податоци за преплетување МАЛКИ блиску до MS-DOS Прифатливи МАЛО БЛИЗИРА MS-DOS, Windows без СРЕДНО ДАЛЕКУ БЛИЗИРА MS-DOS, Windows Нема КОМПАКТЕН БЛИЗУ ДАЛЕКУ MS-DOS, Windows Нема ГОЛЕМ ДАЛЕКУ MS-DOS, Windows нема ОГРОМНИ ДАЛЕКУ MS-DOS, Windows нема БЛИЗИРА на Windows 2000, Windows XP, Windows прифатливо РАМЕН БЛИЗУ NT,

Модели со меморија Малиот модел работи само во 16-битни MS-DOS апликации. Во овој модел, сите податоци и код се наоѓаат на еден физички сегмент. Големината на програмската датотека во овој случај не надминува 64 KB. Малиот модел поддржува еден код сегмент и еден податочен сегмент. Податоците и кодот се адресираат како блиску кога се користи овој модел. Медиумскиот модел поддржува повеќе кодни сегменти и еден податочен сегмент, при што сите референци во сегментите на кодот стандардно се сметаат за далеку, а референците во сегментот на податоци се сметаат за блиски. Компактниот модел поддржува неколку податочни сегменти кои користат далечно податочно адресирање (далеку) и еден код сегмент кој користи блиско адресирање (блиску). Големиот модел поддржува повеќе сегменти на код и повеќе сегменти на податоци. Стандардно, сите референци на код и податоци се сметаат за далеку. Огромниот модел е речиси еквивалентен на моделот со голема меморија.

Модели на меморија Рамниот модел претпоставува несегментирана програмска конфигурација и се користи само во 32-битни оперативни системи. Овој модел е сличен на малиот модел по тоа што податоците и кодот се наоѓаат во еден сегмент, но тој е 32-битен. Да се ​​развие програма за рамен модел пред директивата. модел стан треба да постави една од директивите: . 386,. 486,. 586 или. 686. Изборот на директивата за избор на процесор го одредува множеството инструкции достапни при пишување програми. Буквата p по директивата за избор на процесор значи заштитен режим на работа. Адресирањето на податоците и кодот е блиску, а сите адреси и покажувачи се 32-битни.

Модели за меморија. Модификатор MODEL memory_model, calling_convention, OS_type, stack_parameter Параметарот на модификаторот се користи за дефинирање на типовите сегменти и може да ги земе следните вредности: користете 16 (сегментите од избраниот модел се користат како 16-битни) користете 32 (сегменти од избраниот модел се користат како 32-битни). Параметарот calling_convention се користи за одредување на начинот на пренесување параметри при повикување постапка од други јазици, вклучително и јазици на високо ниво (C++, Pascal). Параметарот може да ги земе следните вредности: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Модели за меморија. Модификатор MODEL memory_model, calling_convention, OS_type, stack_parameter Параметарот OS_type е стандардно OS_DOS и вклучен овој моментова е единствената поддржана вредност за овој параметар. Параметарот stack_parameter е поставен на: NEARSTACK (SS регистерот е еднаков на DS, податоците и областите на магацинот се распределени во истиот физички сегмент) FARSTACK (SS регистерот не е еднаков на DS, податочните и областите на магацинот се распределени во различни физички сегменти). Стандардната вредност е NEARSTACK.

Пример за програма што не прави ништо. 686 P. МОДЕЛ РАМЕН, STDCALL. ПОДАТОЦИ. CODE START: RET END START RET - команда на микропроцесорот. Обезбедува дека програмата правилно завршува. Остатокот од програмата се однесува на работата на преведувачот. . 686 P - Командите за заштитен режим на Pentium 6 (Pentium II) се дозволени. Оваа директива го избира поддржаниот сет на инструкции за асемблер, што го означува моделот на процесорот. . MODEL FLAT, stdcall - модел со рамна меморија. Овој модел на меморија се користи во оперативниот систем Windows. stdcall - се користи постапката за повикување на конвенцијата.

Пример за програма што не прави ништо. 686 P. МОДЕЛ РАМЕН, STDCALL. ПОДАТОЦИ. ШИФРА ЗА ПОЧЕТОК: ПОВТОРУВАЊЕ КРАЈ СТАРТ. ПОДАТОЦИ е програмски сегмент кој содржи податоци. Оваа програмане го користи стекот, па сегментот. STACK недостасува. . CODE е програмски сегмент кој содржи код. СТАРТ - етикета. КРАЈ СТАРТ - крај на програмата и порака до компајлерот дека извршувањето на програмата треба да започне со ознаката СТАРТ. Секоја програма мора да содржи директива КРАЈ за да го означи крајот изворен кодпрограми. Сите линии што ја следат директивата КРАЈ се игнорираат.Ознаката наведена по директивата КРАЈ му го кажува на преведувачот името на главниот модул од кој започнува извршувањето на програмата. Ако програмата содржи еден модул, ознаката по директивата КРАЈ може да се изостави.

Преведувачи на асемблерски јазици Преведувач - програма или технички средства, кој конвертира програма претставена на еден од програмските јазици во програма на целниот јазик, наречена објектен код. Покрај поддршката за мнемоника на машински инструкции, секој преведувач има свој сет на директиви и макро алатки, честопати некомпатибилни со ништо друго. Главните типови на преведувачи на асемблерски јазици: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - слободно дистрибуиран асемблерот со повеќе премини напишан од Tomasz Gryshtar (полски), NASM (Netwide Assembler) - бесплатен асемблерот за архитектурата Intel x 86, создаден од Сајмон Татам со Џулијан Хол и моментално се развива од мал тим програмери во Source. Ковач. нето.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Translating a program in Microsoft Visual Studio 2005 1) Создадете проект со избирање на File->New- > Проектно мени И"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Преведување на програмата во Microsoft Visual Studio 2005 2) Во дрвото на проектот (View->Solution Explorer) додадете"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Преведување на програмата во Microsoft Visual Studio 2005 3) Изберете го типот на датотеката Code C++, но наведете го името со наставката. asm:

Преведување на програмата во Microsoft Visual Studio 2005 5) Поставете параметри на компајлерот. Десен-клик на менито Custom Build Rules во проектната датотека...

Преведете ја програмата во Microsoft Visual Studio 2005 и изберете Microsoft Macro Assembler во прозорецот што се појавува.

Превод на програмата во Microsoft Visual Studio 2005 Проверете со десното копче во датотеката hello. asm проектно дрво од менито Својства и инсталирајте Општо-> Алатка: Мајкрософт Макро Асемблер.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Преведување на програмата во Microsoft Visual Studio 2005 6) Компилирајте ја датотеката со избирање Build->Build hello. прј."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Програмирање во Windows OS Програмирањето во Windows OS се заснова на употреба на функции API (Application Program Interface, т.е., софтверска апликација интерфејс). Нивниот број достигнува 2000. Програмата Windows во голема мера се состои од такви повици. Сите интеракции со надворешни уредии ресурсите на оперативниот систем се јавуваат, по правило, преку такви функции. операциона сала Виндоус системкористи модел на рамна меморија. Адресата на која било мемориска ќелија ќе биде одредена од содржината на еден 32-битен регистар. Постојат 3 типа програмски структури за Windows: дијалог (главниот прозорец е дијалог), конзола или структура без прозорци, класична структура (прозорец, рамка).

Јавете се Функции на Windows API Во датотеката за помош, секоја API функција е претставена како тип функција_име (FA 1, FA 2, FA 3) Тип – тип на повратна вредност; ФАкс – листа на формални аргументи по редоследот по кој се појавуваат.На пример, int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Оваа функцијаприкажува прозорец со порака и копче за излез (или копчиња). Значење на параметрите: ж. Wnd е дескриптор на прозорецот во кој ќе се појави прозорецот за пораки, lp. Текст - текст што ќе се појави во прозорецот, lp. Наслов - текст во насловот на прозорецот, у. Тип - тип на прозорец; особено, можете да го одредите бројот на копчиња за излез.

Повикување на функциите на Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Речиси сите параметри на функцијата API се всушност 32-битни цели броеви: HWND е 32-битен цел број, LPCTSTR е 32-битен покажувач на низа, UINT е 32-битен цел број. Наставката „А“ често се додава на името на функцијата за да се пресели во поновите верзии на функцијата.

Повикување на функциите на Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Кога користите MASM, мора да додадете @N N на крајот од името - бројот на бајти што усвоените аргументи ги зафаќаат на оџакот. За Win 32 API функциите, овој број може да се дефинира како број на аргументи n помножен со 4 (бајти во секој аргумент): N=4*n. За да повикате функција, користете ја инструкцијата CALL за асемблерот. Во овој случај, сите функциски аргументи се пренесуваат до него преку стекот (наредба PUSH). Насока на предавање аргументи: ЛЕВО НАДЕСНО - ДОЛО ГОРЕ. Аргументот u прво ќе се притисне на магацинот. Тип. Повикот до наведената функција ќе изгледа вака: Порака повик. Кутија. A@16

Повикување на функциите на Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Резултатот од извршувањето на која било API функција е обично цел број што се враќа во регистарот EAX. Директивата OFFSET претставува „поместување во сегмент“, или, преведено во јазични термини на високо ниво, „покажувач“ на почетокот на линијата. Директивата EQU, како #define во SI, дефинира константа. Директивата EXTERN му кажува на преведувачот дека функцијата или идентификаторот е надворешен од овој модул.

Пример за програма „Здраво на сите!“. . 686 P. МОДЕЛ РАМЕН, STDCALL. STACK 4096. ПОДАТОЦИ MB_OK EQU 0 STR 1 DB "Мојата прва програма", 0 STR 2 DB "Здраво на сите!", 0 HW DD ? НАДВОРЕШНА порака. Кутија. A@16: БЛИЗУ. КОД СТАРТ: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Порака. Кутија. A@16 РЕТ КРАЈ СТАРТ

Директивата INVOKE Преведувачот на јазикот MASM исто така ви овозможува да ги поедноставите повиците на функции со помош на макро алатка - директивата INVOKE: INVOKE функција, параметар1, параметар2, ... Нема потреба да додавате @16 на повикот на функцијата; параметрите се пишуваат точно по редоследот по кој се дадени во описот на функцијата. Со макро средства на преведувачот, параметрите се ставаат на оџакот. За да ја користите директивата INVOKE, мора да имате опис на прототипот на функцијата користејќи ја директивата PROTO во форма: Порака. Кутија. ПРОТО: DWORD, : DWORD Ако програмата користи многу функции на Win 32 API, препорачливо е да се користи директивата вклучување C: masm 32includeuser 32. inc

Тема 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)



Врв