Здавалка
Главная | Обратная связь

Сегменттік регистрлер



Микропроцессордың программалық моделінде алты сегменттік регистрлер бар: cs, ss, ds, es, gs, fs. Микропроцессор аппараттық түрде программаныњ құрылымдыќ ±йымдасуын, сегменттер деп аталатын ‰ш бµлік т‰рінде ќолдайды. Жадыны м±ндай ұйымдастыру сегменттік деп аталады. Микропроцессор келесі түрдегі сегменттерді қолдайды:

1. Код сегменті. Программа командаларынан тұрады. Бұл сегментке қатынау үшін cs регистрі қолданылады (code segment regіster) — кодтың сегменттік регистрі. Микропроцессор қатынай алатын, машиналық командалардан құрылған сегмент адресінен тұрады (яғни бұл командалар микропроцессор конвейеріне жүктеледі).

2. Деректер сегменті. Программамен өңделетін деректерден тұрады. Бұл сегментке қатынау үшін ds регистрі қолданылады (data segment regіster) — деректердің сегменттік регистрі, мұнда ағымдағы программаның деректер сегментінің адресі сақталады.

3. Стек сегменті. Бұл сегмент стек деп аталатын жады аймағынан тұрады. Стекпен жұмысты микропроцессор келесі принцип бойынша ұйымдастырады: бұл аймаққа жазылған соңғы элемент бірінші болып таңдалады. Бұл сегментке қатынау үшін стек сегментінің адресінен тұратын ssрегистрі қолданылады (stack segment regіster) — стектің сегменттік регистрі.

4. Қосымша деректер сегменті.Кµптеген машиналыќ командалардыњ орындалу алгоритмдері айќын емес т‰рде олармен µњделетін мєліметтер, адресі ds сегменттік регистрінде болатын мєліметтер сегментінде орналасќан деп ±йѓарады. Егер программаға бір мєліметтер сегменті жеткіліксіз болса, онда таѓы ‰ш ќосымша мєліметтер сегментін ќолдану м‰мкіндігі бар. Бірақ адресі ds сегменттік регистрінде сақталатын негізгі мєліметтер сегментінен өзгешелігі, қосымша деректер сегментін қолданған кезде олардың адрестерін командада сегменттерді ќайта аныќтаудыњ арнайы префикстері кµмегімен айќын т‰рде кµрсету ќажет болады. Қосымша мєліметтер сегменттерінің адрестері es, gs, fsрегистрлерінде болуы керек.

Басқару және жаѓдайлар регистрлері

Микропроцессорға әрқашанда микропроцессордыњ жєне командалары берілген мезетте конвейерге ж‰ктелген программаныњ жаѓдайы туралы аќпараттан т±ратын бірнеше регистрлер енгізілген. Бұл регистрлерге жататындар:

- eflags/flagsжалаулар регистрі;

- eip/ip команданы кµрсеткіш регистрі.

Бұл регистрлерді қолдана отырып, командалардың орындалу нәтижелері жайында ақпарат алуға жєне микропроцессордыњ µзініњ жаѓдайына єсер етуге болады. Бұл регистрлердің таѓайындалуы жєне құрамы:

eflags/flags (flag regіster) — жалаулар регистрі. Разрядтылығы eflags/flags — 32/16 бит. Берілген регистрдің бµлек биттерінің белгілі функционалдық тағайындамалары бар, оларды жалаулар деп атаймыз. Бұл регистрдің кіші бөлігі і8086 үшін арналған flags регистрінің жұмысына ұқсас.

eflags/flags регистрініњ жалауларын үш топқа бөлуге болады:

1- 8 жаѓдай жалаулары. Бұл жалаулар машина командасының орындалуына байланысты өзгеріп отырады. Eflags регистрініњ жаѓдай жалаулары арифметикалық және логикалық операциялардыњ орындалу нәтижесініњ ерекшеліктерін бейнелейді. Бұл есептеу процесінің жаѓдайын талдауѓа және оған шартты кµшу немесе ішкі программаларды шақыру командалары кµмегімен єсер етуге мүмкіндік береді.

2- 1 басқару жалауы. Dfдеп белгіленеді (Dіrectory Flag). Ол eflags регистрінің 10-шы битінде болады жєне тізбектелген командалармен қолданылады. dfбелгісінің мәні бұл операциялардағы өңделетін элементтердің бағытын анықтайды: жолдың басынан соңына қарай (df = 0) немесе керісінше, жолдың соңынан басына қарай (df= 1). dfбелгісімен жұмыс істеу үшін арнайы командалар бар: cld (df белгісін нөлдеу) және std (df белгісін тағайындау). Бұл командаларды қолдану dfбелгісін алгоритмімен сәйкестендіруге және жолдармен жұмыс жасау кезіндегі санауыштың мәнін үлкейтуге және кішірейтуге мүмкіндік береді;

3- 5 жүйелік жалаулар. Б±л жалаулар енгізу/шығаруды, жасырынатын үзулерді, жµндеу, есептер мен 8086 виртуалды режимініњ арасындағы ауысуларды басқарады. Қолданбалы программаларға бұл жалауларды ќажет болмаса µзгерту ±сынылмайды, өйткені ол көп жағдайларда программаныњ жұмысыныњ үзулуіне әкеліп соғады.

Кесте

Жаѓдайлар жалаулары

Жалау мнемоникасы Жалау eflags-тағы биттің нөмірі Мазмұны және тағайындалуы
cf Тасымал жалауы (Carry Flag)   1 — арифметикалық операция нәтиженің үлкен битінен тасымал жасады. Операндтың өлшеміне байланысты 7, 15 немесе 31-ші биттер үлкен болып табылады. 0 — тасымал болѓан жоќ.
pf Жұптық жалауы (Parity Flag)     1—нәтиженің 8 кіші разрядтарының құрамында бірліктердіњ жұп сандары бар (бұл жалау кез келген µлшемді операндтыњ тек 8 кіші разрядтары ‰шін). 0 — нәтиженің 8 кіші разрядтарының құрамында бірліктердіњ тақ саны бар.
af Қосымша тасымал жалауы (Auxiliary carry Flag)   Тек BCD-сандарымен жұмыс істейтін командалар үшін. Нєтиженіњ кіші тетрадасынан ќарыз алу фактісін тіркейді: 1 – ќосу операциясы нєтижесінде 3-нші разрядтан ‰лкен разрядќа тасымал жасалды немесе алу операциясы кезінде ‰лкен тетрада мєнінен кіші тетраданыњ 3-нші разрядына ќарыз болды; 0 – нєтиженіњ кіші тетрадасыныњ 3-нші разрядына (нан) тасымалдар мен ќарыздар болѓан жоќ.
zf Нөлдік жалауы (Zero Flag) 1 — егер команда нәтижесі нөлге тең болса; 0 — егер команда нәтижесі нөлге тең болмаса.
sf Таңба жалауы(Sіgn Flag).     Нәтиженің үлкен битінің жаѓдайын бейнелейді (8, 16 немесе 32-разрядтық операндтар ‰шін сєйкес 7, 15 немесе 31 биттер). 1— нәтиженің үлкен биті 1-ге тең. 0— нәтиженің үлкен биті 0-ге тең.
of Толу жалауы (Overflow Flag)     Арифметикалық операциялардаѓы мєнді биттіњ жоѓалу фактісін тіркеу ‰шін ќолданылады 1 - операция нєтижесінде нєтиженіњ ‰лкен белгілік битіне (нен) (8, 16 немесе 32 разрядты операндтар ‰шін сєйкес 7, 15 немесе 31 биттер) тасымал (ќарыз) болады; 0 - операция нєтижесінде нєтиженіњ ‰лкен белгілік битіне (нен) тасымал (ќарыз) болмайды;
Iopl Енгізу-шығарудыњ айрыќша ќ±ќыќтарыныњ деңгейі (Input/Output Privilege Level). 12, 13 Есептердіњ айрыќша ќ±ќыќтарына байланысты енгізу-шығару командаларына р±ќсат алуды баќылау ‰шін микропроцессордың қорғалған режимінде ќолданылады.
Nt Есептің ќабаттасу жалауы (Nested Task) Бір есептіњ екіншісіне ќабаттасу фактісін тіркеу ‰шін микропроцессордыњ қорғалған ж±мыс режімінде қолданылады.

Кесте

Жүйелік жалаулар

tf Трассировка жалауы (Trace Flag)   8 Микропрцессордың қадам бойынша жұмысын ұйымдастыру үшін арналған: 1 — Єрбір машиналыќ команда орындалып болѓаннан кейін микропроцессор 1 нµмірімен ‰зуді генерациялайды. Программаларды жµндегіштермен жµндеген кезде ќолданылуы м‰мкін; 0 — қалыпты жұмыс.
if Үзу жалауы (Interrupt enable Flag)   9 Аппараттық үзулерді (ІNTR кірісі бойынша үзулер) р±ќсат ету немесе тыйым салу (б‰ркемелеу) үшін арналған; 1— аппараттық үзулерге рұқсат етілген; 0—аппараттық үзулерге тыйым салынѓан.
rf Қалыпқа келтіру белгісі (Resume Flag) 16 Жµндеу регистрлерінен келіп түсетін үзулерді өңдеу үшін қолданылады.
vm Виртуалды 8086 жалауы (Virtual 8086 Mode)     17 Микропроцессордыњ 8086 виртуалды режимінде жұмыс істеу белгісі; 1 — процессор 8086 виртуалды режимінде жұмыс істейді; 0 — процессор нақты немесе қорғалған режимде жұмыс істейді.
ас Тегістеуді бақылау жалауы (Alignment Check)     18 Жадыға қаратпа жасаѓан кездегі тегістеуді баќылауды р±ќсат етуге арналѓан.

 

eіp/іp (Іnstructіon Poіnter regіster) — командалар көрсеткіші.
eіp/іp регистрінің разрядтылыѓы 32/16 бит болады жєне командалардыњ аѓымдаѓы сегментінде cs сегменттік регистрінің құрамына ќатысты келесі орындалатын команданыњ ыѓысуынан т±рады. Бұл регистр тікелей программалаушымен қолданылмайды, бірақ оның мәндерін жүктеу және өзгерту, шартты жєне шартсыз кµшу, процедураларды шаќыру жєне процедуралардан оралу командаларынан т±ратын басқарудыњ єрт‰рлі командаларымен жасалады. Үзулердің пайда болуы да eіp/іp регистрінің жањартылуына әкеледі.

Негізгі әдебиеттер: 5[16-36], 38[33-44], 3[7-12].

Қосымша әдебиеттер: 19[10-15].

Бақылау сұрақтары:

1.ЭЕМ-ның архитектурасы түсінігіне не кіреді?

2. Сегменттердіњ адрестері туралы ақпарат ќандай регистрлерде болады?

3. Циклдар санын есептеу үшін ќандай регистрлерді қолдануға болады?

4. Орындалатын программаны адрестеу үшін ќандай регистрлерді қолданады?

 

Дәріс 3. Ассемблер программалау тілі. Ассемблер тіліндегі программаның құрылымы. I 8086 микропроцессорында сегменттерді қолдану

Ассемблер – машиналық кодтарда жазылған программаларды көрсететін машиналы-бағытталған тіл. Ол программалаушыға келесі мүмкіндіктерді береді:

- машиналық командалардың символдық белгілеулерін қолдану (мнемокод);

- жады ұяшықтарына және регистрлерге символдық аттар меншіктеу;

- сандарды жазу үшін арифметикалық, логикалық өрнектерді және әртүрлі санаќ жүйелерін қолдану жєне т.б.

Ассемблер тілінде программаны жасау бірнеше кезењдерден т±рады:

1. Программаныњ бастапќы мєтінін дайындау.

2. Программаны ассемблерлеу (объектті коды алу).

3. Программаны жинаќтау (программаныњ орындалатын файлын алу).

4. Программаны тексеру.

Ассемблер тілінде программаныњ мєтіні бір немесе бірнеше мєтіндік файлдарѓа жазылады. Файлдардыњ аттары мен олардыњ кењейтілулері кез келген болуы м‰мкін,біраќ та программаныњ мєтіні бар файлдар ‰шін *.asm, ал т±раќтылар мен жања типтердіњ аныќтамалары бар файлдар ‰шін *.inc кењейтілулерін ќолдану ќабылданѓан. Мєтіндік файлдарды дайындауда стандартты мєтіндік редакторларды ќолдану кезінде редакторланатын файлдарды ASCII форматындаѓы кєдімгі файлдар т‰рінде саќтау ќажет.

Ассемблер тілінде жазылған программаны компьютер тіліне транслятор аударады. Ол да ассемблер деп аталады. Ассемблерлеуден кейін *.obj кењейтілулерлі бар объектті модульдердіњ файлдары алынады. Объектті файлдарды алу ‰шін командалыќ жолда программаныњ мєтіні бар файлдыњ атын кµрсетіп, ассемблердіњ сєйкес баѓдарламасын орындау ќажет (Microsoft фирмасыныњ masm жєне ml, Borland фирмасыныњ tasm, tasmx немесе basm баѓдарламалары):

masm prog1.asm

tasm prog1.asm

Кµптеген жаѓдайларда файл атыныњ алдына опциялар беру ќажет.

Объектті модульдерді бір файлѓа біріктіру процесі жинаќтаушы программасымен іске асырылады (мысалы, Microsoft фирмасыныњ link, Borland фирмасыныњ tlink). Нєтижесінде *.exe немесе *.com кењейтілуі бар орындалатын файл алынады.

Программаны тексеру кезінде єрт‰рлі жµндегіштерді ќолдануѓа болады. Ќазіргі кездегі жµндегіштер программаныњ орындалу процесінде жалпы міндетті регистрлердіњ немесе айнымалылардыњ мєндерін баќылауѓа, µзгертуге м‰мкіндік береді. Сондай аќ, жадыныњ єрт‰рлі бµліктерін кµруге болады. Оларѓа Microsoft фирмасыныњ сw - Code View, Borland фирмасыныњ td, td286, td386 - TurboDebugger жµндегіштерін жатќызуѓа болады.

Ассемблер тілінде жазылған программа єрќайсысы єдетте бір жолды алатын операторлар тізбегінен тұрады. Операторлар 2 топќа бөлінеді: командалар және директивалар (псевдокомандалар). Трансляция барысында командалар машиналық кодқа аударылады, ал директиваны трансляциялау бірден іске аса береді.

Ассемблер тілінде жазылған программа келесі түрде болады:

[ Белгі :] Мнемокод [Операндтар] [; Т‰сініктемелер]

Тік жақшаларѓа команданыњ міндетті емес µрістері орналастырылѓан. Командалардыњ келтірілген µрістері бір-бірінен бос орын немесе ТАВ – табуляция белгісі арқылы ажыратылады. Белгі µрісі басқа командалар қатынас жасай алатын атауды, мысалы, басќаруды беру командалары, командаға меншіктеу үшін арналған. Белгіні аныќтаѓан кезде латын алфавитініњ єріптерін (a-дан z-ке дейін жєне A-дан Z-ке дейін), цифрлар (0-ден 9-ѓа дейін), сондай-аќ ‘_’, ’?’, ’@’, ’$’ символдарын ќолдануѓа болады. Белгі қос нүктемен аяқталуы керек. Цифр бірінші символ ретінде ќолданыла алмайды. Бірінші символ ретінде @ символын ќолдану да ±сынылмайды, µйткені ассемблер тілінде кейбір алдын-ала аныќталѓан т±раќтылар мен аттар осы символдан басталады.

Мнемокод µрісі орталық процессордың командаларынан тұрады. Б±л µріс міндетті болып табылады. Б±л µріс пен м‰мкін болатын белгі арасындаѓы бµлгіш ретінде кез келген санды бос орындар ќолданылады.

Операндтар µрісінде өңделуге тиіс мәліметтердің орны жайлы ақпарат жазылады. Кейбір жағдайларда, мысалы операндтар үнсіздік бойынша берілсе (жолдыќ командалар, ХLAT және т.б) немесе мүлдем керек болмаса (NOP командасы) бұл µріс бос болады. Екі операнды бар командаларда біріншісі – нәтиже қабылдағышы, екіншісі– ақпарат көзі болып табылады. Т‰сініктемелер µрісінде программа жұмысын т‰сіндіретін текст орналасады. Егер бірінші позицияда үтірлі нүкте көрсетілсе, т‰сініктеме бүкіл жолды алуы мүмкін.

Псевдокомандалар келесі түрде жазылады:

[Идендификатор] Псевдокоманда [Операндтар] [; Т‰сініктемелер]

Тік жақшаларѓа псевдокоманданыњ міндетті емес µрістері орналастырылѓан. Псевдкомандалардыњ µрістері бір-бірінен бос орын немесе табуляция белгісі арқылы ажыратылады.

Программаның бастапќы мәтіні трансляцияны аяќтайтын END директивасымен аяқталады.

Адрес шинасы арқылы микропроцессор р±ќсат алатын физикалыќ жады, жедел жады (немесе жедел есте сақтау құрылғысы - ЖЕСҚ) деп аталады. Ең төменгі деңгейде компьютерлік жадыны биттер массиві ретінде қарастыруға болады. Бір бит 0 немесе 1 мәнін сақтай алады. ЖЕСҚ ұяшықтар тізбегі – байттар т‰рінде ±йымдастырылѓан. Бір байт 8 биттен тұрады. Әр байтқа физикалық деп аталатын µзініњ бірегей адресі (оныњ нөмірі) сәйкес келеді. Физикалық адрестердіњ мєндер диапазоны микропроцессордыњ адрес шинасыныњ разрядына тәуелді. I486 және Pentium үшін ол 0-ден 232 - 1 (4 Гбайт) аралығында жатады.

Сегменттеу – есептерді бір-бірініњ єсерінен ќорѓау ‰шін бір есеп шегінде де, б‰кіл ж‰йеніњ шегінде де бірнеше тєуелсіз адрестік кењістіктердіњ болуын қамтамасыз ететін адрестеу механизмі. Сегменттеу механизмінің негізінде, аппараттыќ дењгейде ќолдау табатын тєуелсіз жады блогы болып табылатын сегмент т‰сінігі жатыр.

Кез келген программаны орындаған кезде микропроцессордыњ ж±мысы жасалатын жадыныњ бірнеше жерін бµлуге болады. Сегменттерді ќолдану i80х86 микропроцессорларыныњ ерекшелігі болып табылады жєне оныњ бірнеше маќсаттары бар.

Біріншіден, 16 разрядты i8086 микропроцессоры ‰шін сегменттерді ќолдану 216 байттан (64 Кбайт) кµп жады облыстарымен ж±мыс істеуге м‰мкіндік берді.

Екіншіден, сегменттерді ќолдану, программада немесе программалар арасындаѓы байланыспаѓан бµліктерді ќорѓау немесе, тым болмаѓанда оќшаулауѓа єрекет жасау болды. Жады ±яшыѓыныњ адресін білу ‰шін б±л адрестіњ екі ќ±рамын білу керек – сегмент басыныњ адресі жєне сегмент ішіндегі б±л жады ±яшыѓыныњ салыстырмалы ыѓысуын. Сегмент басы адрестері сегментті регистрлерде саќталады, сондыќтан м±ндай регистрлердіњ ішіндегісін µзгерте отырып, жадыныњ єрт‰рлі жерлеріне р±ќсат алуѓа болады (мысалы, дисплейдіњ бейнежадысына). Сегменттерді ќолдану концепциясы i8086 ‰лкен микропроцессорлардыњ ќорѓалѓан ж±мыс режимінде де дамыды, сегмент басы адрестері, олардыњ ±зындыѓы жєне б±л сегменттерге р±ќсат алу ќ±ќыќтары ж‰йелік кестелердіњ арнайы ќ±рылымдарында болады, ал сегментті регистрде тек ќана кестеніњ ішіндегі б±л ќ±рылымныњ индексі саќталады. Б±л, бір сегменттерді басќаларынан оқшаулауға жєне программадан олардыњ кейбіреулеріне р±ќсат алуды айтарлыќтай шектеуге м‰мкіндік берді, өйткені тек сегменттік регистрдің ішіндегісін өзгертіп қана қоймай ол көрсетіп тұрған құрылымды да өзгерту керек. Мұндай өзгеру тек қана белгілі жағдайларда ғана орындалатын артыќ дєрежелі командалар көмегімен жасалуы мүмкін (мысалы, қолданушының программасында емес, операциялық жүйеде). Сегменттердің мұндай модификациясы кезінде сегменттердің өлшемдері үздіксіз көбейді (i8086 үшін 64 Кбайттан, i80486 үшін 4Гбайтқа дейін ).

Үшіншіден, сегменттерді қолданғанда программа, егер тек ќана сегмент басы адресін өзгертіп (оны жадыда басқа жерге жазып) және осы адреске қатысты салыстырмалы ығысуларды өзгертпесе ғана орындалады. Бұл, қажеттілік бойынша программаны жадыда, тіпті оның орындалу процесінде де тасымалдауға мүмкіндік береді.

Жадыны сегменттеудің мүмкіндіктері микропроцессорда қолданылатын физикалық жадының мүмкін болатын өлшемін анағұрлым асырады (i80x86 микропроцессорларының наќты жұмыс режимі үшін сегменттер көмегімен жадының физикалық көлемі ішіндегі кез келген жады ұяшығына оңай рұқсат алуға болады, қорғалған режимде адрестелетін жадының ең үлкен жіберілетін көлемі – виртуалды жады, мысалы, 64 Тбайтты, ал жадының физикалық көлемі бар болғаны 4 Гбайтты құрайды).

Кейбір жағдайларда жадыны сегменттеуді қолдану пайдалы болмайды, сондықтан микропроцессордың үлкен модельдерінде (i80386 бастап) ұзындығы 4 Гбайтқа дейін жады сегменттерімен жұмыс істеуге болады, демек барлық рұқсатты физикалық жады бір сегмент түрінде қарастырылады.

Микропроцессордың реалды жұмыс режимінде кез келген программа 4 сегментпен жұмыс істейді:

1. Код сегменті

2. Мәліметтер сегменті

3. Стек сегменті

4. Толықтаушы мәліметтер сегменті.

I80386 және одан үлкен микропроцессорлар үшін тағы да екі ќосымша мәліметтер сегменті пайда болады.

Бұл сегментердің жадыда орналасуына ешқандай шектеулер енгізілмейді. Мысалы, барлық сегменттер бір адрестен басталуы мүмкін, осылайша бір бірімен жасырынады. Сегменттер жадыда тікелей бірінен кейін бірі жасырынбай орналасуы мүмкін немесе олардың арасында бос аралықтар болуы мүмкін.

Әр программа жалпы жағдайда кез келген сегменттер санынан тұруы мүмкін, бірақ ол тек қана негізгі үш сегментке – код, мәліметтер және стек ғана тікелей р±ќсат ала алады. Операциялық жүйе программа сегменттерін жедел жадыда белгілі бір физикалық адрестер бойынша орналастырады, сонан соң осы адрестер мәнін анықталған жерлерге орнықтырады. Нақты режимде бұл адрестер сәйкес сегменттік регистрлерге, ал қорғалған режимде олар арнайы ж‰йелік дескрипторлық кестелер элементтеріне орналастырылады. Сегмент ішінде программа адрестерге сегмент басына қатысты сызықты, яғни 0-ден бастап сегмент өлшеміне тең болатын адреспен аяқтап, ќаратпа жасайды. Микропроцессордыњ сегмент ішіндегі мєліметтерге р±ќсат алу ‰шін ќолданатын б±л салыстырмалы адрес, немесе ыѓысу, тиімді деп аталады.

Физикалық адрес деп, микропроцессордыњ адресінің шинасына берілетін жады адресі т‰сініледі. Оның басқаша аты – сызықты адрес. Атаулардаѓы б±л ќосарлылыќ жедел жадыны ±йымдастырудыњ параќтыњ моделініњ болуымен себепті. Бұл атаулар адресті парақтық түрлендіру µшірілген кезде ѓана синонимдер болып табылады ( нақты режимде парақтық адрестеу әрдайым өшірулі).

Нақты режимде физикалық адрестің ќалыптасуы

Нақты режимде физикалық жадыны адрестеу мханизмініњ келесі сипаттамалары бар:

- физикалық адрестің өзгеру диапазоны 0-ден 1 Мбайтқа дейін. Бұл шама I8086 адресінің шинасыныњ 20 линиясы болуымен анықталады;

- сегменттің ењ ‰лкен өлшемі 64 Кбайт. Ол I8086-ның 16-разрядты архитектурасымен түсіндіріледі. Осылайша, 16-разрядты регистрлерде болатын ењ ‰лкен мєн 216-1 ќ±райды.

Жедел жадыныњ нақты бір физикалық адресіне ќарапта жасау ‰шін сегменттіњ басыныњ адресін (сегменттік ќ±раманы) жєне сегменттіњ ішіндегі ыѓысуды аныќтау керек. Сегменттер жадыда параграфтар (параграф – 16 байттық жады көлемі) шекарасында орналасады, сондықтан сегмент басының адресінде соңғы цифр 0-ге тең болады. Мысалы: 10000h, FFF0h. Осылайша, сегменттік регистрде тек ќана сегмент басының физикалық адресінің үлкен 16 битін сақтау жеткілікті. 20 биттік адрестің жетіспейтін кіші нольдік 4 биті сегменттік регистрдегі мәнді солға 4 разрядқа жылжытумен алынады. Алынған 20 биттік мән – сегмент басына сәйкес келетін физикалық адрес болып табылады. Екінші компонент – ығысу, 16 биттік мән болып табылады. Бұл мән командада айќын немесе жалпы міндет регистрлерініњ бірінде жанама т‰рде болуы м‰мкін. Бұл екі кұраушы микропроцессорда аппараттық деңгейде ќосылады, нәтижесінде µлшемі 20 биттік жадыныњ физикалық адресі алынады. Физикалық адресті ќалыптастырудыњ берілген механизмі программалық қамтаманы қозғалмалы етуге мүмкіндік береді. i486 немесе Pentium (32 бит) микропроцессорыныњ адрес шинасыныњ µлшемі мен наќты режимніњ физикалыќ адресініњ 20 биттік мєнініњ сәйкес келмейтінін ескеру керек. Микропроцессор нақты режимде болса, адрес шинасының ‰лкен 12 линияларына р±ќсат жоќ, алайда белгілі жағдайларда бірінші мегабайттан кейін жатќан жедел жадыныњ бастапќы 64 Кбайтымен ж±мыс істеу м‰мкіндігі бар.

Нақты режимде сегменттер адрестері сегментті регистрлерде, ал ығысу адрестері – код сегменті үшін IP регистрінде, мәліметтер сегменті үшін BX, SI, DI регистрлерінің бірінде, стек сегменті үшін SP, BP регистрлерінің бірінде және мәліметтердің қосымша сегменті үшін DI регистрінде сақталатындықтан, микропроцессор мәліметтер сегментіне қатынас жасайтын жады адрестерін мына формулалармен есептейді:

(DS)x16 + BX немесе

(DS)x16 + SI немесе

(DS)x16 + DI

код сегментіне:

(CS)x16 + (IP)

стек сегментіне:

(SS)x16 + SP немесе

(SS)x16 + BP

мәліметтің қосымша сегментіне:

(ES)x16 + DI.

Компьютерде барлық есептеулер екілік кодта жүргізіледі және экранға шыѓарѓанда жадыдағы мәлімет 16-лық кодта көрсетіледі. Жадыда әр байт адрестелінеді. Сөзге қатынас кіші байттың адресі бойынша жүргізіледі. Мысалы: мынадай сөз массиві берілген: DW 0110h , 0220H , 0330h, 0440h. Жадыда ол: DS:0000 10 01 20 02 30 03 40 04 т‰рінде беріледі.

Негізгі әдебиет : 5[46,120-125], 8[21-32], 7[40-50].

Бақылау сұрақтары:

1. Программалаушыға ассемблер қандай мүмкіндіктер береді?

2. Ассемблер тілінде жазылған команда қандай түрде болады?

3. Ассемблер тілінде псевдокоманда қандай түрде болады?

4. Тиімді адрес қалай анықталады?

5. Нақты режимде физикалық адрес қалай есептелінеді?

 

Дәріс 4. Мәліметтерді сипаттау. Адрестеу режімдері

Мәліметтерді сипаттау

Мәліметтерді анықтау үшін ассемблердің негізгі 3 директивасы ќолданылады: байттарды жазу үшін db (define byte, байтты анықтау), сөздерді жазу үшін dw(define word, сөзді анықтау) және қосарланған сөздерді жазу үшін dd(define double, қосарланған сөзді табу):

size dw 256 ; size ұяшығына 256 ондыќ саны жазылады

setb7 db 80h ;setb7 ұяшығына 180h он алтылыќ саны жазылады

Массивтерге орын алып қою үшін dup(duplicate, дубльдеу) операторы қолданылады.

Rawdata dw 300 dup (1) ; 1 санымен толтырылған

;300 сөз резервтелінеді

string db 80 dup ('') ; '' белгісімен толтырылған

; 80 байт резервтелінеді

Кµрсетілгендерден басќа, df(define farword, 6 байттық µрісті анықтау), dq(define quadword, төрттік сөзді анықтау) және dt (define teraword, 10 байттық айнымалыны анықтау) директивалары бар, бірақ олар сирек қолданылады.

Адрестеу режимдері

Командаларда бір немесе екі операнд, немесе мүлдем операндтар болмауы мүмкін. Командалардыњ кµпшілігі, бірі – операнд-бастама, екіншісі – таѓайындау операнды болатын екі операндты ќажет етеді.

Команданыњ операндтарын беру тєсілдері адрестеу режимдерін анықтайды.

Мәліметтерге қатынас 3 типке бөлінеді:

- тікелей мәліметтерге қатынас;

- регистрлердегі мәліметтерге қатынас;

- жадыдағы мәліметтерге қатынас.

Бір операнд регистрде немесе жадыда орналасуы мүмкін, ал екіншісі міндетті түрде регистрде немесе тікелей командада болуы керек. Тікелей операнд тек ќана операнд-бастама бола алады.

Екі операндтық машиналық командада келесі операндтар ‰йлесімдері болуы мүмкін:

- регистр—регистр;

- регистр—жады;

- жады—регистр;

- тікелей операнд—регистр;

- тікелей операнд—жады.

Тікелей адрестеу(тікелей операнд) – операнд команданыңөзінде беріледі, яғни оның мәні командалардыњ машиналық кодында жазылады.

Мысалы:

mov ах, 5

Ассемблер ах регистріне тікелей 5мәнін ж‰ктейтін movкомандасына сәйкес келетін машиналық кодты генерациялайды. 5 мєні mov командасының ассемблерленген машина кодында жазылады. Көптеген жағдайларда тікелей мєліметтер немесе жалѓыз операнд, немесе екі операндтыњ екіншісі болып келеді.

Регистрлік адрестеу — операнд регистрдіњ бірінде орналасады.

Мысалы: mov ax, bx

Регистрлер ретінде келесілер қолданыла алады:

- 32- разрядты регистрлер: ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP; - 16-разрядты регистрлер АХ, ВХ, СХ, DX, SI, DI, SP, ВР; - 8-разрядты регистрлер АН, AL, BH, BL, CH, CL, DH, DL;

- сегменттік регистрлер CS, DS, SS, ES, FS, GS.

Жадыда операндтарды адрестеудіњ негізгі түрлері. Адрестеудіњ барлыќ т‰рлерініњ мақсаты — процессорѓа тиімді адрес деп аталатын 16 биттік тањбасыз мєнді есептеуге кµмектесу. Тиімді адрес, cs, ds, es, ss тµрт сегменттік регистрлердіњ бірімен адрестелетін базалыќ сегменттен бастап ығысуды көрсетеді. Сегменттік регистр мен ығысу, ары ќарай жадыда байттыњ жаѓдайын бір маѓыналы аныќтайтын 20-биттік физикалық адреске т‰рленетін 32 биттік логикалыќ адресті т‰зеді. Адрестеу режимінің жалпы саны микропроцессордыњ архитектурасымен анықталады (құжат бойынша 8088 микропроцессорында операндтарды адрестеудіњ 24 режимі бар).

Жадыда операндтарды адрестеудіњ негізгі түрлері: тура, жанама, базалық, индекстік, базалық-индексті.

Тура адрестеу кезінде командада сәйкес операндтыњ жадыдаѓы орналасу басына сєйкес келетін ыѓысу кµрсетіледі. Тура адрестеуді қолданѓанда сегментті ќайтадан анықтауға болады (ќайта таѓайындау).

;Сегмент құжаты

meml dw 0 ; жады сµзі нµлден т±рады

mem2 db 230 ; жады байты 230 саќтайды

;Команда сегменті

inc meml ; meml сөзінің ќ±рамы 1-ге үлкейеді

mov DX, meml ; meml сөзінің ќ±рамы DX-ке ж‰ктеледі

mov AL, mem2 ; mem2 байтыныњ ќ±рамы AL-ге ж‰ктеледі

Тура адрестеу кезінде айнымалы атыныњ сєйкес ыѓысуына ќосылатын айнымалы немесе т±раќтыдан т±ратын амал қолдануға болады. Осылайша, ќ±рама айнымалыныњ µрістеріне ќаратпа жасауѓа болады (мысалы, к‰рделі айнымалыныњ µрістеріне р±ќсат алуды ќамтамасыз етуге болады).

Кез келген ±яшыќ адресі екі компоненттен тұрады: сегменттік адрес және ығысудан. Сегменттік адрестер DS, ES, CS және SS сегменттік регистрлерінде сақталады. Процессор ќандай регистрден сегменттік адресті алу керектігін сегментті ауыстыру префиксі көмегімен біле алады. Префикстердіњ бірнеше топтары болады: қайталау, адрес өлшемі, операнд өлшемі, сегмент ауыстыру.

Егер assume директивасында мєліметтер сегментініњ ES регистріне сәйкестігі кµрсетілсе

assume ES:data

(бұл жағдайда мєліметтер сегменті командалар сегментінің алдында орналасу керек), онда бұл сегменттіњ µрісіне ќаратпа жасау командалары ES сегменті ‰шін ауыстыру префиксін ќосумен трансляцияланады.

Сегментті ауыстыру префиксі бірќатар жаѓдайларда программада айќын т‰рде көрсетілуі керек. Мұндай жағдай, мысалы, егер мєліметтер, резидентті ‰зулерді µњдеушілерге тєн, командалар сегментінде орналасса туындайды. Мұндай мєліметтерге ќаратпа жасау ‰шін, егер оны алдын ала командалар сегментіне икемдесе, єрине, DS регистрін қолдануға болады, бірақ адрестеуді, ќажетті т‰рде икемделген CS регистрі арқылы орындаѓан ќолайлы. Егер команда сегментінде mem атты мєліметтер µрісі болса, онда бұл µрістен оқу командасы келесі түрде беріледі:

mov AX,С S:mem1

Егер программадан тыс жадыѓа ќаратпа жасау керек болса: үзу векторларына, жүйелік кестелерге, бейнебуферге жєне т.б., алдымен сегментті регистрлердіњ біреуін икемдеп алу ќажет, сосын ±яшыќтарѓа олардыњ ыѓысулары бойынша адрестеуге болады.

Экранның жоғарғы сол жағына бірнеше символдарды, мысалы, екі леп белгісін шығару керек болсын. Бұл операцияны келесі командалар кµмегімен орындауға болады:

mov AX, 0B800h ;Бейнебуферінің сегменттік адресі

mov ES, AX ;Оны ES-ке жібереміз

mov byte ptr ES: 0, ' ! ' ;Символды экранның 1-і орнына

;жібереміз

mov byte ptr ES:2, ' ! ' ;Символды экранның 2-і орнына

;жібереміз

mov ES:0,'!' командасы трансляция қатесін беретінін байќайыќ, µйткені ассемблер бұл сµйлемді 21Һ байтын бейнебуферге тасымалдау командасы, немесе 0021h сөзін тасымалдау командасы ретінде трансляциялау ќажет пе, оны анықтай алмайды.

Қажетті жағдайда бейнебуферге жазу ‰шін DS регистрін қолдануға болады:

mov AX , 0B800h ;Бейнебуфердіњ сегменттік

mov DS, AX ;адресі DS-те

mov byte ptr DS:0,'!' ;Символды бейнебуферге

Команда кодына сегментті ауыстыру префиксі енгізілмейді, бірақ DS: жазбасы қажет, өйткені mov 6,10 жазу кезінде қате шығады (10 санын 6 санына тасымалдау).

Mov DS:6, 10

командасы 10 санын 6 салыстырмалы адресі бойынша жібереді.

Жанама адрестеу

Жанама адрестеуде сегменттегі сәйкес операндтыњ ыѓысуы микропроцессор регистрлерінің бірінде сақталады. Осылайша, микропроцессор регистрінің аѓымдаѓы ќ±рамы командада қолданылатын операндтың орындаушы адресін анықтайды.

Синтаксистік т‰рде командада б±л адрестеу режимі регистрдіњ атын квадратты жаќшаѓа [ ] алумен кµрсетіледі.

mov ax, [ecx] командасы есх регистрінде сақталатын ыѓысумен мєліметтер сегментінен адрес бойынша сµздіњ ќ±рамын ах регистріне көшіреді.

Жанама адрестеу кезінде 18086 микропроцессоры ‰шін тек қана [ВХ], [SI], [DI], [ВР]регистрлерін ќолдануѓа болады.Бастапќы үш регистрлер ‰шін олардыњ ќ±рамы мєліметтер сегментіне ќатысты ыѓысу болып табылады (демек, DS сегменттік регистрініњ аѓымдаѓы мєні адрестіњ екінші ќ±рамасын аныќтайды). [ВР]регистрі адресті есептеу үшін стек сегментінде ығысуды анықтайды. ВХ немесе ВР регистрлерін қолдану кезінде адрестеуді базалық, ал SI немесе DI қолдану кезінде - индекстік деп атайды.

Жанама адрестеуді регистр арқылы қолдануын көрсету ‰шін жоѓарыда кµрсетілген мысалды т‰рлендірейік:

mov AX, OB800h ;Бейнебуфердіњ сегменттік

mov ES, AX ;адресі ES-те

mov BX, 2 0 0 0 ; Экранның ортасына ығысу

mov byte ptr ES : [BX] , ‘!’ ;Экрандағы символ

Егерде жанама адрестеу ВХ, SI немесе DI регистрлерініњ бірінің көмегімен орындалса, онда DS арқылы адрестелетін сегмент т‰сініледі, сондықтан б±л регистр арқылы адрестеу кезінде DS: белгілеуін түсіруге болады:

mov AX, 0B800h ;Бейнебуфердіњ сегменттік адресі

mov DS, AX ;DS-те

mov BX, 2000 ;Экранның ортасына ығысу

mov byte ptr [BX] , ' ! ' ;Экрандағы символ

Бұл фрагмент алдыңғыға қарағанда жадыны ‰немдеу маѓынасында тиімді. Соњѓы команданыњ кодында сегментті ауыстыру префиксі болмаѓандыќтан, ол 1 байтќа кем орын алады.

ВХ, SI және DI регистрлері бұл қолдануда тең мєнді, сондықтан олардың кез келгенін қолдануға болады:

mov DI, 2000 ;экранның ортасына ығысу

mov byte ptr [DI] , ' ! ' ;Экрандағы символ

ВР регистрі арнайы стекпен жұмыс істеуге арналған жєне жанама адрестеу режимдерінде б±л регистр арќылы адрестеу кезінде стек сегменті т‰сініледі, басќаша айтќанда, сегменттік регистр ретінде, ‰нсіздік бойынша SS регистрі қолданылады.

Базалық адрестеумен команда жадыда аз орын алады (өйткені оѓан ±яшыќ адрестері кірмейді) және тура адрестеу командасына қарағанда тез орындалады. Сондықтан базалық адрестеу, берілген адрес бойынша кµп рет ќаратпа жасауѓа тура келген жаѓдайларды, єсіресе, циклда, тиімдірек болып саналады.

I80386 жоѓары микропроцессорлар ‰шін жанама индексті адрестеу жєне база бойынша жанама адрестеу кењейтілген. Индекстік регистрлер ретінде барлық мєліметтер регистрлерін қолдануға болады - [ЕАХ], [ЕВХ], [ЕСХ], [EDX],және де үш индексті регистрлер - [ЕВР], [ESI], [EDI].Бұл жағдайда т±раќты, немесе байт, немесе ќос сµз болуы мүмкін, жєне б±л т±раќты тањбасы бар сан ретінде қарастырылады.

[ЕВР] регистрінен басқа барлыќ регистрлер ‰шін адресті есептеу кезінде DS сегменттік регистрінің аѓымдаѓы ќ±рамы, ал [ЕВР]регистрі ‰шін - SSсегменттік регистрінің ќ±рамы қолданылады.

Жылжымалы регистрлік жанама адрестеу (базалық және индексті).Операндтыњ салыстырмалы адресі ВХ, ВР, SI немесе DI регистрінің ќ±рамы және жылжу, ығысу немесе ауыстыру деп аталатын командада кµрсетілген т±раќтыныњ ќосындысы ретінде анықталады. Жылжу,сан немесе адрес болуы мүмкін.Базалық адрестеу кезіндегі сияқтыВХ, SI және DI регистрлерін қолдану барысында DS арқылы адрестелетін сегмент, ал ВР қолданғанда стек сегменті т‰сініледі.

Ыѓысумен жанама адрестеуді ќолдануды бейнебуферге тура шыѓару мысалында қарастырайық:

mov AX, 0B800h ;Бейнебуфердіњ сегменттік

mov ES, AX ;адресі ES-те

mov DI, 80*2*24 ;Экранның төменгі жолына ығысу

mov byte ptr ES: [DI] , 'О' ;Символды экранѓа

mov byte ptr ES: 2 [DI] , 'К' ;Символды келесі

;позицияға жазамыз

mov byte ptr ES : 4 [DI], ' ! ' ;Символды келесі

;позицияға жазамыз

Бұл мысалда базалық ретінде DI регистрі алынған. Оған жадыныњ базалыќ салыстырмалы адресі енгізіледі, бұл жағдайда бейнебуферде экранныњ соњѓы жолыныњ басына ыѓысу. Б±л адресті экранныњ жолы бойынша ыѓысуды алу маќсатымен жањарту, процессормен орындаушы адресті есептеу кезінде DI базалыќ регистрініњ ќ±рамына ќосылатын, 2 жєне 4 т±раќтылары кµмегімен жасалады.

4[ВХ] орнына [ВХ+4], 4+[ВХ] немесе [BX]+4 деп те жазуѓа болады.

Жылжу массив адресімен берілгендегі, ал регистрде бұл массивтегі адрестелетін элементтіњ индексі орналасқан мысалды ќарастырайыќ. 10000 сөзден т±ратын массивті натурал сандар қатарымен толтыру керек болсын.

; құжат сегменті

array dw 10000

;команда сегменті

mov SI, 0 ;Массивтегі элемент индексініњ бастапќы мєні

mov AX, 0 ;Бірінші толтырушы-сан

mov СХ,10000 ;Циклдағы қадамдар саны

fill: mov array[SI], AX ;Массив элементіне санды енгізу

inc AX ;Толтырушы-санныњ инкременті

add SI, 2 ;Массивтегі келесі сөзге ығысу

loop fill ;fill белгісіне оралу

Цикл fill белгісімен белгіленген командадан басталады. Бұл командада нµлге тењ АХ құрамы жады ұяшыѓына көшіріледі. Оның адресі array массиві адресінің және SI индексті регистрінің ќ±рамыныњ ќосындысы ретінде анықталады. Нєтижесінде массивтің бірінші сөзіне 0 енгізіледі. Ары қарай АХ құрамы 1-ге, ал SI регистрінің құрамы 2-ге арттырылады және loop командасымен fill белгісіне кµшу орындалады, одан кейін циклдыњ денесі АХ жєне SI регистрлерініњ жања мєндерінде ќайталанады. Loop командасымен саналатын циклдаѓы ќадамдар саны СХ регистрініњ бастапќы ќ±рамымен аныќталады.

Индексті-базалық адрестеу. Операндтыњ салыстырмалы адресі келесі регистрлер жұптарының құрамыныњ ќосындысы ретінде анықталады:

[ВХ] [SI] (DS : [ВХ] [SI] т‰сініледі)

[ВХ] [DI] (DS:[BX][DI] т‰сініледі)

[ВР] [SI] (SS:[BP][SI] т‰сініледі)

[ВР] [DI] (SS:[BP][DI] т‰сініледі)

Регистрлердің бірінде массив адресі, ал басќасында - индексі орналасады.

Алдыңғы мысалды индексті-базалық адрестеуді енгізумен қарастырайық:

;Мєліметтер сегменті

array dw 10000

;Командалар сегменті

mov BX, offset array ;Базалық регистрде массивтің базалық адресі

mov SI, 0 ;Массивтегі элемент индексінің бастапќы мєні

mov AX, 0 ;Бірінші толтырушы-сан

mov CX,10000 ;Циклдағы қадамдар саны

fill: mov [BX][SI],AX ;Санды массивке жібереміз

inc AX ;Толтырушы-санныњ инкременті

add SI, 2 ;Массивтегі келесі сөзге ығысу

loop fill ;fill белгісіне

Массив элементіне санды енгізу командасы қысқа және тезірек орындалғандықтан тиімділік артады, µйткені бұл адресті әрдайым жадыдан оқу ќажет емес.

Жылжымалы индексті-базалық адрестеу. Операндтыњ салыстырмалы адресі екі регистрлердің ќ±рамы және жылжудың ќосындысы ретінде анықталады.

Мұнда да кµрсетілген регистрлер жұптары қолданылады, бірақ олардың көмегімен алынѓан нєтижелік адресті командада кµрсетілген т±раќтыныњ мєніне жылжытуѓа болады. Т±раќты индекс болуы м‰мкін (онда регистрлердіњ бірінде жадыныњ базалыќ адресі болуы керек), біраќ та базалыќ адрес те бола алады. Соњѓы жаѓдайда регистрлер индекстіњ ќ±рамаларын саќтау ‰шін ќолданыла алады.

Мєліметтер сегментінде пернетаќтаныњ жоѓарѓы ќатарыныњ латын жєне орыс символдарыныњ коды жазылѓан 24 байттан тұратын массив анықталды делік:

sims db " QWERTYUIOP{}”

db "ЙЦУКЕНГШЩЗХЪ”

;Командалар сегменті

mov BX,12 ; Жолдағы байттар саны

mov SI,6

mov DL, syms[BX][SI]

Б±л командалар тізбегі DL регистріне екінші қатардағы индексі 6-ѓа тењ элементті, яғни Г єрпініњ ASCII кодын енгізеді. Сол қорытындыны регистрлердің біріне индекс емес, массив адресін енгізу арқылы да алуѓа болады:

mov BX, offset sym

mov SI, 6

mov DL,12 [BX] [SI]

Жанама масштабты адрестеу (микропроцессор I80386 және жоғары)

Жанама адрестеудіњ таѓы бір қосымша мүмкіндігі I80386 және одан жоғары микропроцессорларда қолданылады - индексті адрестеу кезінде индексті регистрдің құрамын масштабты кµбейткіш – 1, 2, 4, 8 сандарына ќосымша көбейтуге болады (1 кµбейткішін ќолдану индексті адрестеуге сєйкес келеді). Мұндай қадам, кµбейткішке еселікті элементтері бар массив элементтеріне (мысалы, сµздерден жєне ќос сµздерден т±ратын массивтер элементтеріне) р±ќсат алуды ыќшамдатады. Мұндай жағдайларда индексті регистрге элемент нµмірі жазылады және ќажетті кµбейткіш көрсетіледі.

Негізгі әдебиеттер: 5[125-135], 7[74-82], 4[98-110].

Қосымша әдебиеттер: 18[113-118].

Бақылау сұрақтары:

1.Мєліметтерді анықтау үшін ассемблердің қандай негізгі үш директивалары қолданылады?

2. Ассемблердегі жолды қалай баяндау керек?

3. Мєліметтерге ќарапта жасау қандай типтерге бөлінеді?

4. Жадыдағы операндтарды адрестеудіњ негізгі түрлерін атаңыз.

5. Массивтермен жұмыс істеу ‰шін адрестеудіњ қандай тәсілдерін қолданған ыңғайлы?

 

Дәріс 5. Микропроцессордың командалары. Жіктелуі. Мәліметтерді сілтеу командаларының жиынтығы

Микропроцессордың командалар ж‰йесі 130 шамасында машина командасын сақтайды. Әр жаңа микропроцессор моделінің пайда болуымен олардың саны, ереже бойынша өседі. Машиналыќ командалар және олардың функционалдық топтары 2 суретте кµрсетілген:

 

 

 

2 сурет – Машиналыќ командалар және олардың функционалдық топтары

Мәліметтерді сілтеу командалар тобы келесілерден т±рады:

1. мәліметтерді сілтеу командалары;

2. портқа енгізу-шығару командалары;

3. көрсеткіштермен және адрестермен жұмыс істеу командалары;

4. мәліметтерді т‰рлендіру командалары;

5. стекпен жұмыс істеу командалары.

Мәліметтерді сілтеу командалары

Бұл топқа келесі командалар кіреді:

mov <тағайындау операнды>, <операнд-бастама>

xchg <1_операнд>, <2_операнд>

mov командасымен бірінші операндтың орнына екінші операндтың мєні тасымалданады. Бұл команда жалауларды µзгертпейді.

movАХ, 500 ; АХ :=500

movBL, DH ; BL:=DH

Талап: тасымалданатын операндтардың µлшемдері (типтері) бір-біріне сәйкес келетінін қадағалау керек.

Келесілерді орындауѓа болмайды:

1. бір жадыдан екінші жадыға тасымалдауѓа болмайды (аралыќ буфер ретінде осы кезењде р±ќсатты кез келген жалпы міндет регистрін ќолдану керек);

2. сегменттік регистрге жадыдан тікелей мєнді ж‰ктеуге (аралыќ объект ќолдану керек: жалпы міндет регистрі немесе стек).

3. бір сегменттік регистр құрамын басқа сегменттік регистрге ауыстыруѓа. Бұл, командалар ж‰йесінде сәйкес операция кодыныњ жоқтығымен түсіндіріледі. Бірақ м±ндай єрекеттіњ қажеттілігі жиі туындайды. Мұндай тасымалдауды орындау үшін, аралыќ ретінде барлық жалпы міндет регистрлерін қолдануға болады. es регистрін ds регистріндегі мєнмен инициализациялау мысалы:

mov ax, ds

mov es, ax

Бірақ бұл операцияны орындаудың басқа да тәсілі бар. Ол стекті жєне push және pop командаларын қолдану:

push ds ; ds регистрініњ мєнін стекке орналастыру

pop es ; es-ке стектен сан жазу

4. cs сегменттік регистрін тағайындау операнды ретінде қолдануға болмайды, µйткені cs:ip ж±бы келесі орындалатын команда адресін сақтайды. cs регистрінің құрамын mov командасымен өзгерту, сілтеу операциясын емес, көшу операциясын білдірер еді.

Дербес компьютерде сөз µлшемді сандар жадыда «аударылған» күйінде, ал регистрлерде – қалыпты түрде сақталады. MOV командасы м±ны ескереді жєне жады мен регистрлер арасындағы сµзді тасымалдау кезінде оларды өзі «аударады»:

Q dw 1234h ; Q: 34h, Q+l: 12h

MOV AX, Q. ; AH=12h, AL=34h

Келесідей айнымалылар баяндамасы бар болсын:

X DB ?

Y DW ?

Әдетте, MOV командасында операндтардың біреуінің типі (өлшемі) оңай танылады, ол тасымалданатын шаманың өлшемін анықтайды. Мысалы:

MOV ВН, 0 ;байтты жіберу (ВН - байттыќ регистр)

MOV х,0 ;дәл солай (х – байтты айнымалының аты)

MOV SI ,0 ;сөзді жіберу (SI – сөз µлшемді регистр)

MOV Y, 0 ;дәл солай (Y – айнымалы-сөздіњ аты ретінде баяндалѓан)

Мұнда екінші операнд (0) бойынша оның өлшемін анықтауға болмайтынын атап өтейік: нөл байт та (00h), сөз де (0000h) болуы мүмкін.

Егер екі операндтың да өлшемдерін анықтауѓа болатын болса, онда бұл өлшемдер беттесуі қажет (не байттар, не сөздер), кері жағдайда ассемблер қатені тіркейді. Мысалы:

MOV DI, ES ;сөзді жіберу

MOV СН, Х ;байтты жіберу

MOV DX, AL ;қате (DX – сөз, AL – байт)

MOV BH, 300 ; қате (ВН – байт, ал 300 байт бола алмайды)

Операндтардың өлшемдерін сәйкестендіруге қатысты барлық күдікті жағдайларда ptr операторын қолдану қажет.

mov ax, word ptr [bx] ; егер [bх] жадыдағы сөзді адрестесе

inc byte ptr [bx] ; егер [bx] жадыдағы байтты адрестесе

dec dword ptr [bx] ; егер [bx] жадыдағы ќос сөзді адрестесе

mov word ptr [bx], 0 ; егер [bx] жадыдағы сөзді адрестесе

PTR (pointer, көрсеткіш) келесі түрде жазылады:

<тип> PTR <амал>

мұндағы <тип> - бұл BYTE, WORD немесе DWORD (басқа да варианттар бар), ал амал тұрақты немесе адрестік болуы мүмкін.

Егер т±раќтылы амал көрсетілсе, онда оператор бұл амалдыњ мәні (сан) ассемблермен кµрсетілген типті (өлшемді) шама ретінде қарастырылуы тиіс екендігін «хабарлайды»; мысалы, BYTE PTR 0 – бұл 0 байт ретінде, ал WORD PTR 0 – бұл 0 сөз ретінде (BYTE PTR 300 – қате жазу, себебі 300 санының байт болуы мүмкін емес). Бұл жағдайда PTR операторы т±раќтылы амалдарѓа жататынын атап өтейік.

Егер де PTR-де адрестік амал көрсетілсе, онда оператор, амалдыњ мәні болып табылатын адрес ассемблермен кµрсетілген типті ұяшыќ адресі ретінде қабылдануы тиіс екендігін «хабарлайды». Мысалы: WORD PTR A – А адресі сөзді білдіреді (А және А+1 адресті байттар). Бұл жағдайда PTR операторы адрестік амалдарѓа жатады.

Сондай-ақ, бұл операторды операндтардың өлшемін мєжб‰рлі т‰рде ауыстыру керек болған кезде пайдалану қажет. Мысалы, 0ffh мәнін flp өрісінің екінші байтына жіберу керек:

; мєліметтер сегменті

flp dw 0

; код сегменті

mov byte ptr (flp+1), 0ffh

flp өрісінің word типті екендігіне қарамастан, ассемблерге өрісті байтты деп алуын хабарлаймыз да, екінші операндтыњ тиімді адресініњ мєнін flp ыѓысуы ќосылѓан бір ретінде есептеледі.

Портқа енгізу-шығару командалары

Машиналы командалардың операндтары енгізу-шығару порттарында орналасуы мүмкін. Әрбір енгізу-шығару құрылғысының, әрбір жүйелік құрылғының бір немесе бірнеше регистрлері болады, оларға қол жеткізу енгізу-шығарудың адрестік кеңістігі арқылы орындалады. Бұл регистрлердің разрядтылыѓы 8, 16 немесе 32 бит. Енгізу-шығарудың адрестік кеңістігі оперативті жадының кеңістігінен физикалық тәуелсіз және енгізу-шыѓарудыњ 216 , немесе 65536 адрестерін ќ±райтын шектеулі кµлемі болады. Осылайша, енгізу-шығару порты түсінігін енгізу-шығарудың адрестік кеңістігінде белгілі бір адресі бар 8, 16 немесе 32-разрядты аппараттық регистр ретінде анықтауға болады. Жүйенің құрылғылармен ењ тµменгі дењгейдегі барлық жұмысы енгізу-шығару порттарын қолданумен орындалады. Компьютер құралдарын басқарудың ыќшамдалѓан, концептуалды с±лбасы келесі түрде болады (3 сурет):

 
 

 

 


 

3 сурет – Компьютер құралдарын басқарудың концептуалды с±лбасы

 

Порттармен жұмыс істеу үшін екі команда қолданылады: in және out.

in аккумулятор, порт_нөмірі — порт_нөмірі нөмірлі порттан аккумуляторға енгізу;

out порт, аккумулятор – порт_ нөмірі нөмірлі портқа аккумулятордың құрамын шығару.

Стекпен жұмыс істеу командалары

Стек – бұл, программа мєліметтерін уақытша сақтау үшін арнайы бөлінетін жады облысы. Стектің маңыздылығы, оған программа құрылымында бөлек сегмент қарастырылғандығымен анықталады.

Стекпен жұмыс істеу үшін үш регистр арналған:

ss — стектің сегментті регистрі;

sp/esp — стек көрсеткішінің регистрі;

bp/ebp — стек кадры базасыныњ көрсеткішініњ регистрі.

Стектіњ өлшемі микропроцессор жұмысының режиміне байланысты және 64 Кбайтпен шектеледі (немесе ќорѓалѓан режимде 4 Гбайт).

Стекпен жұмыс істеудің ерекшеліктері:

- стекте мєліметтерді жазу мен оқу LIFO принципіне сәйкес орындалады (Last In First Out — «соңғы болып келді, бірінші болып кетті»);

- стекке мєліметтерді жазу кезінде ол кіші адрестер жағына қарай өседі. Бұл ерекшелік стекпен жұмыс жасау командаларының алгоритмінде негізі ќаланѓан;

- жадыны адрестеу үшін esp/sp және ebp/bp регистрлерін қолданған кезде, ассемблер оның құрамындағы мәндер ss сегментті регистріне қатысты ығысуды білдіреді деп автоматты түрде санайды.

Стекпен жұмыс жасауды ұйымдастыру үшін жазу мен оқудың арнайы командалары бар.

push бастама — бастама мәнін стек тµбесіне жазу.

Бұл команданың жұмыс істеу алгоритмі:

1) (sp) = (sp) - 2; sp мәні 2-ге азаяды;

2) ss: sp ж±бымен кµрсетілген адрес бойынша бастамадан мән жазылады.

pop таѓайындау — таѓайындау операндымен көрсетілген орынға стек тµбесінен мәнді жазу. Бұл жағдайда мән стектіњ тµбесінен «алынады».

Бұл команданың жұмыс істеу алгоритмі:

1) таѓайындау операндымен көрсетілген орынға стектіњ тµбесінен мәнді жазу;

2) (sp) = (sp) + 2; sp мәнінің артуы.

Негізгі әдебиет: 5[129-152], 9[42-46].

Қосымша әдебиет: 19[78-88].

Бақылау сұрақтары:

1. Ассемблер командаларының сыныпталуын атаңыз.

2. Мєліметтерді сілтеу тобына кіретін командаларды атап өтіңіз.

3. Стекпен жұмыс жасау үшін жіберу командаларын атаңыз.

4. Операндтардың өлшемдерін сәйкестеуге қатысты барлық күдікті жағдайларда қандай операторды қолдану қажет?

 

Дәріс 6. Микропроцессор командалары. Басқаруды беру командалар жиынтығы. Циклдар

Басқаруды беру командалары cs және eip/ip регистрлерінің құрамын өзгертеді жєне нәтижесінде микропроцессор орындау үшін программаның келесі командасын емес, программаның басқа бµлігіндегі команданы таңдайды. Бұл жағдайда микропроцессор ішіндегі конвейер тазартылады.

Программада өтуді ұйымдастыруды қаматамасыз ететін микропроцессордың командаларын әрекет ету принципі бойынша үш топқа бөлуге болады:

1. Басқаруды шартсыз беру командалары:

- шартсыз өту командасы;

- процедураны шақыру және процедурадан қайту (шығу);

- программалық үзулерді шақыру және программалық үзулерден қайту;

2. Басқаруды шартты беру командалары:

- салыстыру командасының нәтижесі бойынша өту командалары;

- белгілі бір жалаудыњ жаѓдайы бойынша өту командасы;

- есх/сх регистрінің құрамы бойынша өту командасы;

3. Циклды басқару командалары:

- есх/сх санауышпен циклды ұйымдастыру командасы;

- қосымша шарт бойынша мерзімнен бұрын циклдан шығу мүмкіндігі бар есх/сх санауышпен циклды ұйымдастыру командасы.

Басқаруды беру қажет орын белгімен анықталады. Белгі – бұл жадының белгілі бір ұяшығын білдіретін, басқаруды беру командаларында операнд ретінде қолданылуға арналған символдық атау.

Айнымалы сияқты ассемблер трансляторы кез-келген белгіге үш атрибут береді:

- осы белгі баяндалған код сегментінің аты;

- ығысу – белгі баяндалған код сегментінің басынан байтпен өрнектелетін ара қашықтық;

- белгі типі немесе арақашықтық атрибуты. Соңғы атрибут екі мән қабылдай алады:

- near – б±л белгіге өту тек осы белгі баяндалған код сегментінің шегінде ѓана мүмкін. Физикалық түрде бұл – белгіге өту үшін eip/ip регистрінің құрамын өзгерту жеткілікті деген сөз;

- far – бұл белгіге өту тек басқаруды сегментаралық беру нәтижесінде мүмкін, ол үшін eip/ip регистрініњ ќ±рамымен қатар, cs регистрінің де құрамын өзгерту қажет.

Әрбір команданың трансляция кезінде командалар адресініњ санауышына тењ адресі болады. Адрестіњ санауышы тек ќана қандай да бір машиналық ұсынысты генерациялайтын бастапќы программаныњ жолдарынан кейін µседі (сонымен бірге резервтеу директиваларынан және мєліметтер сегментінде мєліметтерді инициализациялаудан кейін).

Ассемблер трансляторы бұл санауышпен жұмыс істеудің екі мүмкіндігін ұсынады:

- ыѓысу атрибутына транслятор, олар пайда болѓан команданыњ адрес санауышыныњ мєнін меншіктейтін белгілерді ќолдану;

- командалар адресініњ санауышын белгілеу ‰шін арнайы $ символын қолдану. Бұл символ программаның кез-келген жерінде адрес санауышыныњ сандық мєнін қолдануға мүмкіндік береді. Классикалық мысал:

. . .

. data

; сегментте жолдың ұзындығын есептеу

Str_Mes db " ЖК-де жұмыс істесең – ассемблерді үйрен" , '$'

Len_Msg = $-Str_Mes

. . .

Ассемблерлеуден кейін Len_Msg мєні жолдың ұзындығына тең болады.

Адрес санауышыныњ мєнін алумен ќатар, TASM компиляторы қажетті жағдайда адрес санауышын керекті абсолютті мєнге орнатуѓа м‰мкіндік беерді. Бұл ORG директивасының көмегімен орындалады:

ORG амал

ORG директивасы адрес санауышыныњ мєнін береді. Амал оны ассемблер трансляцияныњ бірінші µтуінде абсолютті санѓа т‰рлендіре алатындай болуы керек.

Шартсыз көшу 5 т‰рде ќолданылуы м‰мкін jmpкомандасының көмегімен жүзеге асады. Кµшу келесідей болуы м‰мкін:

- тура қысқа (-128 . . .+127 байттар шегінде);

- тура жақын (ағымдағы командалар сегменті шегінде);

- тура алыс (команданың басқа сегментіне);

- жанама жақын (кµшу адресімен ±яшыќ арќылы ағымдағы командалар сегменті шегінде);

- жанама алыс (кµшу адресімен ±яшыќ арќылы басқа командалар сегментіне).

Єртүрлі көшулермен программалардыњ ќ±рылымын қарастырайыќ.

Тура қысқа (Short) көшу

Командасында кµшу ќажет белгі айќын т‰рде кµрсетілетін кµшу тура деп аталады. Белгі сол программалық сегментте болуы керек, б±л жағдайда онымен белгіленген команда jmp-ға дейін де, кейін де бола алады. Қысқа көшу командасы жадының 2 байтын алады. Бірінші байтта – операцияның коды (EBh), ал екінші байтта – көшу нүктесіне ығысу жазылады. Көшу нүктесіне дейінгі ара қашықтық кезекті командадан, демек jmp командасынан кейінгі командадан саналады. Кµшу алѓа да, артќа да жасалатындыќтан, ыѓысу тањбасы бар сан ретінде ќарастырылады, демек кµшу ењ кµбі 127 байт алѓа немесе 128 байт артќа жасалуы м‰мкін. Тура қысқа көшу келесідей рєсімделеді:

Code segment

...

jmp short go ; Код ЕВ dd

...

go:

...

code ends

Тура жақын (near) немесе ішкі сегменттік көшу. Бұл көшудіњ алдыңғы көшуден айырмашылығы – көшу нүктесіне ыѓысуѓа б‰тін сµз бµлінеді







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.