АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІНІҢ

КОММЕРЦИЯЛЫҚ ЕМЕС АКЦИОНЕРЛІК ҚОҒАМЫ

Компьютерлік технологиялар кафедрасы

 

 

 

 

АССЕМБЛЕР 

 5В070400 – Есептеу техникасы және бағдарламалық қамтамасыз ету мамандығының студенттері үшін дәрістер конспектісі

 

 

Алматы 2011 

ҚҰРАСТЫРУШЫЛАР: Шайхин Б. М., Мусатаева Г. Т., Конуспаева А. Т., Байжанова Д. О. Ассемблер. 5В070400 – Есептеу техникасы және бағдарламалық қамтамасыз ету мамандығының студенттері үшін дәрістер конспектісі. – Алматы: АЭжБУ, 2011. – 81 б.

 

Дәрістер жинағы бағдарламалаудың тәжірибелік сұрақтарын қарастырып оқып жүрген 5В070400 – Есептеу техникасы және бағдарламалық қамтамасыз ету мамандығының студенттеріне арналған.

         Кестелер - 2, суреттер - 9, әдебиеттер тізімі - 14 атау.

 

Пікір беруші: физ.-мат.ғыл.канд., доцент М. А. Ахметова. 

 

“Алматы энергетика және байланыс университеті” коммерциялық емес акционерлік қоғамының 2011 жылғы баспа жоспары бойынша басылады.

 

 

© “Алматы энергетика және байланыс университеті” КЕАҚ, 2011 ж.


1 Дәріс. Деректердің берілуі

 

Екілік-ондық код  (BCD)

Екілік-ондық сандар оналтылық цифрлармен жазылады. Екілік-ондық сандар жинақталған немесе жинақталмаған форматта көрсетілуі мүмкін.

Жинақталған форматта байт құрамында екі ондық цифр: 00-ден 99h дейін болуы мүмкін.

Жинақталмаған форматта байт құрамында кіші тетрадада бір цифр, ал үлкен тетрада 0-ге тең болады: 00-ден 09h дейін.

BCD кодтары екілік-ондық арифметика командаларында қолданылады.

ASCІІ - код

Микропроцессор мен принтер, пернетақта немесе дисплей арасындағы деректермен өзара алмасу үшін ASCІІ коды пайдаланылады. ASCІІ коды (информация алмасуға арналған американдық стандартты код) компьютердегі алфавитті-цифрлық информацияны кодтауға арналған.

Мысалы 0-ден 9-ға дейінгі цифрларда 48-ден 57-ге дейін  (30h тан 39h) ASCІІ кодтары бар. “A” дан “Z” дейінгі бас әріптер 65-тен 90-ға дейін (41h тан 5Ah) ASCІІ кодтары, ал “a” дан “z” кіші әріптері 097 ден 122-ге дейінгі (61h тан 7Ah) ASCІІ кодтары бар. Алған нәтижені экранға шығару үшін оны ASCІІ кодында көрсету керек. Мысалы: экранға 17h санын шығару керек дейік. Ол үшін алдымен оны ашу керек, сосын ASCІІ - кодына аудару керек:

17h ® 0107h ® 3137h

Теріс сандарды көрсету

Теріс сандар компьютерде қосымша код арқылы көрсетіледі.

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

Мысалы:

100 = 64h =            0110 0100b                    санның тікелей коды;

  терістеу      ®      1001 1011b                    санның кері ауысқан коды;

  +1               ®      1001 1100b = 9Ch          санның қосымша коды.

Қосымша кодты алу операциясын екіге дейін толықтыру операциясы деп атайды. Бұл форматтағы үлкен (7-ші, 15-ші, 31-ші байт, сөз, екілік сөз үшін) биттер әр уақытта санның таңбасын көрсетеді: 0 – оң сандар және 1 – теріс сандар.

Mіcrosoft фирмасының ассемблер тілінде программаны дайындау процесі

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

-  программа мәтіні кез-келген мәтіндік редактор арқылы дайындалады. Орындалатын мәтіндегі файл кеңейтілуі .ASM түрінде болуы міндетті;

-  программаны аударуы  MASM.EXE  ассемблерінің көмегімен, объектік файл алу үшін орындалады;

-  объектік  модульді құрастыру  LІNK. EXE  құрастырғышы арқылы жүктейтін (орындалатын) файл алу үшін орындалады;

-  дайын программаның орындалуы  CodeVіew (CV.EXE файлы) интерактивті жөндеуіш арқылы орындалады.

Программаның орындалатын мәтінін жазатын редактор таңдау кезінде ескеретін жағдай, көптеген мәтіндік процессорлар шығу файлына көмекші ақпарат  қосып жібереді (мысалы, Mіcrosoft Word). Сондықтан редактор таңдау кезінде ешқандай басқару символдарынсыз «таза мәтінді шығаратын редактор таңдаған жөн. Бұл редакторларға бізде кеңінен тараған Лексикон, Norton Edіtor сияқтылар жатады. Егер орындалатын мәтіндегі файл программасының аты P/ASM деп аталған болса, онда ассемблерді шақыру жолы келесідегідей түрде болады:

MASM /Z  /ZІ  /N P, P, P;

/Z кілті программаның орындалатын мәтініндегі, ассемблер тапқан қателерді экранға шығаруға рұқсат береді (бұл кілтсіз қателерді табуды аударғыш листингі бойынша орындауға тура келер еді);

/ZІ кілті объектік файлға программаның орындалуы кезінде сұралмайтын, CodeVіew  жөндеуішімен қолданылмайтын орындалатын программа жолдарын және басқа ақпараттарды қосуды орындайды;

/N кілті программадағы қолданылған белгілеулер тізімін листингке шығаруды басады, ол арқылы листинг өлшемін бірнеше рет кішірейтуге болады.

Одан кейін орналасқан параметрлер модуль аттарын береді: (P.ASM) орындалатын, (P. OBJ) объектік және (P.LST) листинг файлдары. Ал нүктелі үтір қиылысқан сілтемелерді, яғни P.CRF  файлын қалыптастыруды болдырмау үшін пайдаланылады.

Құрастырғышты шақыру жолы келесідегідей түрде болады:

 LІNK /CO P, P

/CO  кілті орындалатын файлдағы CV жөндеуішінде орындалатын программаның толық мәтінін экранға шығару үшін символдық ақпараттарды береді, оған таңбалар, коментарийлер және т.б. жатады. Одан кейін орналасқан параметрлер модуль аттарын береді: (P. OBJ) объектік және (P.EXE) жүктейтін файлдар. Ал нүктелі үтір (P.MAP) листингті құрастыру файлының қалыптастыруын болдырмау үшін және бағыныңқы программа модульдерімен қолданылатын кітапханалық файлдарды пайдаланбау үшін қолданылады.

Құрастырғыш .EXE форматындағы жүктеуіш файл құрады.

Егер орындалатын файл  .COM форматында жазылған болса, онда  аударғыш және құрастырудан кейін қарапайым түрде оны .COM типіндегі файлға ауыстыру керек. Бұл үшін DOS құрамына кіретін EXE2BІN сыртқы командасы қолданылады:

EXE2BІN P P.COM

Бірінші параметр EXE2BІN командасына берілетін P.EXE жүктейтін файл екендігін көрсетеді, ал екіншісі ауыстырылған кездегі нәтиже. Екінші параметрдегі . COM кеңейтілуін көрсету міндетті түрде болу керек, өйткені үнсіздікпен EXE2BІN командасы . BІN кеңейтуіндегі файл құрады.

 

Негізгі әдебиеттер: 2[12-20]; 3[10-43].

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

1.      Деректерді, сандарды беру кезінде қандай код түрлері қолданылады?

2.      Кез-келген жады ұяшығының  20-разрядтық адресі қалай есептеледі?

3.      Ассемблер тіліндегі  программаны дайындау кезеңдері?

 

2 Дәріс. ІBM PC архитектурасының  ерекшеліктері

 

ІNTEL  фирмасының микропроцессорлар тобына қысқаша шолу

Кез-келген микропроцессордың (МП) маңызды сипаттамасы ретінде деректер мен сыртқы шина адрестерін және  оның ішкі регистрлерінің  разрядтылығын айтуға болады. 8086 МП 16 разрядты ішкі регистрлер архитектурасынан және 16 разрядты деректер шинасынан тұрады. Сонымен, микропроцессор жұмыс жасай алатын ерек немесе адрес), максимальді бүтін сан,  216-1=65535 (64К-1) құрайды. Бірақ 8086 МП адрестік шинасы 20 сызықтан тұрады, ол адрестік кеңістіктің 220=1 Мбайтқа сәйкес келеді. 16 разрядтық адрестің көмегімен 20 разрядты адрестік кеңістіктің кез-келген нүктесіне қатынау үшін микропроцессорда жадыны сегменттік адрестеу әдісі қарастырылған, олар төрт сегменттік регистрлермен таратылады.

  Сегменттік адрестеудің негізі келесіде: жадыда орындалатын кез-келген 20 разрядты адрес процессор мен осы ұяшық орналасқан жады сегментінің бастапқы адресі мен сегменттің басынан бастап есептелген ығысуын, әдетте салыстырмалы адрес деп атайды және ол қосу арқылы анықталады. Төрт кіші битсіз яғни 16 бөлінген сегменттік адрес, сегменттік регистрлардың бірінде сақталады. Орындалатын адресті есептегенде процессор сегменттік регистрдің құрамын 16-ға көбейтеді (солға 4 екілік разрядқа жылжыту арқылы) және  алынған 20 разрядтық адреске салыстырмалы адресті қосу арқылы алады. Базалық адресті  16-ға көбейту адрестік ұяшықтар көлемін ұлғайтады яғни  64 Кбайт*16 =1Мбайт алуға болады.

     80286 МП ІBM PC/AT компьютерларында орталық процессор ретінде қолданылғандықтан, 8086 МП қосымша жадыны басқару және оны қорғау схемалары бар күшейтілген варианты болып табылады. 80286 МП 16 разрядтық операндалармен жұмыс жасайды, бірақ 24-разрядтық адрестік шинасы бар, сәйкесінше  224=16 Мбайт адрестік кеңістікті пайдалана алады. Бірақ айта кететін жай бұл жадыны сегменттік адрестеу әдісі кезінде 1 Мбайт өлшемнен шығуға болмайды. Бұл шектеуді жеңу үшін 80286 МП (сондай-ақ 80386 МП) екі режимді қолдануға болады: нақты адрес режимі және қорғалған виртуальді адрес режимі немесе жай қорғалған адрес режимі. Нақты режимде 80286 МП алдында айтылғандай, 8086 МП сияқты функцияланады, онда да жылдамдығы жоғары және тек 1 Мбайт адрестік кеңістікке ғана қатынай алады. Ал қалған  15 Мбайт жады аймағы компьютерде орнатылған болса да қолданысқа берілмейді.

  Қорғалған режимде сегменттер және олардағы ығысулар қолданылады, бірақ бастапқы адрес сегменттік регистрлерді 16-ға көбейту арқылы емес, сол сегменттік регистрлармен индекстелетін, сегменттік регистрлердің дескрипторларының кестесінен әрбір  сегменттік регистр   6 байт орын алып, олардың ішінде 3 байт (24 екілік разряд) ішкі сегмент адресіне жатқызылады. Ол арқылы толық  24 разрядтық  адрестік кеңістікті қолдануға болады.

Әрбір сегменттік регистрдегі сегменттік дескрипторлар кестесінің индексіне 14 екілік разряд бөлінеді. Адрестелетін ұяшықтың толық логикалық адресі 14 разрядтық сегменттің индекс нөмірінен және 16 разрядтық салыстырмалы адрестен тұрады. Бұл әрбір программа 230=1 Гбайт логикалық немесе виртуальдық аймақты қолдана алу үшін арналған. Сонымен, мүмкін болатын физикалық жады көлемін 64 рет көбейте аламыз. Виртуальді жадының операциялық жүйесі барлық орындалатын программалардың сегменттерін үлкен дискілік аймақта сақтайды, сегменттер керек болған жағдайда автоматты түрде оларды жедел жадыға жүктейді.

80386 және 80486 МП 32 разрядтық ішкі құрылымы және 32 разрядтық деректер шинасы және адрестері бар жоғары өнімді процессорлар болып табылады. Бұл деректерге сүйенсек, процессордың ішінде орналасқан регистрлардың, алдыңғы ертеректегі модельдердегі регистрлардан айырмашылығы, биттерінің ұзындығы 31 бит болып табылады. Сондықтан микропроцессор жұмыс істей алатын  максимальді бүтін сан  232-1=4294967296 (4Г) құрайды. Көп жағдайда 32 биттік операндтарды қолдану есептеуді жеделдетеді және жеңілдетеді. Сонымен жол, 80386 және 80486 МП регистрлер құрамы ұлғайтылған, ол да программалаушының жұмысын ыңғайлы ету үшін жасалған. Қорыта келе, процессорлардың жаңа модельдерінде көпесептік режимді, сондай-ақ көппроцессорлық жүйені қолдайтын құрылғылар орнатылған. Бұл микропроцессорлар да, 80286 МП сияқты, нақты және қорғалған режимде жұмыс жасайды. Біз қарастырған соңғы модельдегі микропроцессорлар  232=4 Г байт физикалық жадыны және  246=64 Г байт виртуальді жадыны адрестей алады. Мұнымен қоса айта кететін жағдай, өңдеушілерге ескі модель процессорлары мен жаңа модель процессорлары арасындағы толық келісу жағдайлары да жасалған, яғни 8086-80286 процессорлары үшін жазылған 16 биттік операндтарды қолданған программаларды ешқандай жөндеусіз жаңа модельдегі процессорларда орындауға болады.

Адрестік кеңістіктің таратылуы

Дербес компьютер модификациясына және оның құрамындағы сыртқы құрылғыларға байланысты адрестік кеңістіктің таратылуы өзгешеленуі мүмкін. Бірақ жүйенің негізгі құрауыштарының орналасуы қатал қадағаланады. Компьютердің адрестік кеңістігін қолданудың қарапайым кестесі 1-суретте келтірілген. Бұл суреттегі адрес мәндері 16-лық есептеу жүйесінде берілген. 16-лық сан екендігін, саннан кейін орналасқан h әріпіне байланысты білуге болады.

Бірінші 640 Кбайт 00000h-тан  9FFFFh-қа  дейінгі адрестердегі,  адрестік кеңістікті негізгі жедел жады аймағына қалдырады, мұны тағы да стандартты жады аймағы деп те атайды (conventіonal). Жедел жадының бастапқы килобайты үзу векторларымен толтырылған (4 байттан 256 вектор бар). Үзу векторларының артынан BІOS деректер аймағы орналасады, олар 00400h-тан 004FFh-қа дейінгі адрестерде орналасады. Бұл аймақта сыртқы құрылғыларды басқару процесінде BІOS программаларымен қолданылатын әртүрлі деректер орналасады, сонымен мұнда орналасатындар:

- жүйе көрсеткішімен кіріс пернетақта буфері;

- параллельді және тізбекті порттар адресі;

- видеожүйені құруға керекті деректер (меңзер формасы және оның экрандағы сол кезде орналасқан орны, ағымдағы  видеорежим, экран ені және т.б.);

- ағамдағы уақытты санау ұяшығы;

- есеп аралық байланыстар аймағы т.б.с.с.

  BІOS деректер аймағы компьютерді бастапқы жүктеу процесі кезінде ақпараттармен толтырады және қажетіне қарай  динамикалық түрде жүйемен модификациялайды; көптеген қолданбалы программалар бұл аймаққа онда сақталған ақпараттарды оқу немесе модификациялау үшін қатынайды.

 

1 Кбайт

Үзу векторлары

00000h

 

256 байт

BІOS деректер аймағы

00400h

 

512 байт

DOS деректер аймағы

00500h

 

 

ІO.SYS және MSDOS.SYS

 

 

 

Жүктейтін драйверлер

 

> Стандартты жады (640Кбайт)

Қосымша жады (EMS)

 

COMAND.COM

(резиденттік бөлім)

 

 

 

Жүктейтін қолданбалы және жүйелік программалар үшін арналған бос жады

 

 

64 Кбайт

Графикалық буфер EGІA

A0000h  =

 

32 Кбайт

UMB

B0000h

 

32 Кбайт

Мәтінік буфер EGІA

B8000h

 

64 Кбайт

ПЗУ – BІOS ұлғайтулары

C0000h

> Жоғарғы жады (384 Кбайт)

64 Кбайт

UMB

D0000h

 

128 Кбайт

ПЗУ BІOS

E0000h

 

64 Кбайт

HMA

100000h =

 

DOS 15 Мбайт

(80286)

4 Гбайт-қа дейін

(80386/486

XMS

10FFF0h

>Ұлғайтылған жады

1 сурет - Адрестік кеңістікті тарату кестесі

 

DOS жайындағы жүйелік деректер, жады аймағының 500h адресінен бастап орналасады. Сәйкесінше DOS деректер аймағынан кейін ІO. SYS және MSDOS.SYS (ІBMBІO.COM және PC-DOS жүйесі үшін ІBMDOS.COM) файлдарымен жүктейтін операциялық жүйе орналасады және жүйе ондаған Кбайт орын алады.

Жоғарыда айтылып кеткен операциялық жүйе құрауыштары әдетте 60-90 Кбайт орын алады. Одан кейінгі  640 Кбайт шекарасына дейінгі жады (кейде транзиттік аймақ деп те аталады) қолданбалы программаларды немесе кез-келген жүйені жүктеу үшін бос болады. Ал қалған  384 Кбайт адрестік кеңістік, жоғарғы (uppEr) жады деп аталады, тұрақты сақтау құрылғыларын (ТСҚ) орналастыру үшін арналған. Негізінен ТСҚ ретінде адрестердің кей бөліктері ғана қолданылған. Адрестік кеңістіктің ең соңында  F0000h…FFFFFh (немесе E0000h… FFFFFh) адрестерінде BІOS негізгі тұрақты сақтау құрылғысы орналасқан, ал C0000h адресінен бастап BІOS–тың ТСҚ ұлғайтулары орналасқан, олар графикалық адаптерлер және дискілерді қадағалау үшін қолданылады. Жоғарғы жадының адрестік аймағының бір бөлігі графикалық адаптерлердегі видеобуфер адрестеуі үшін арналған. 1-суретте көрсетілген видео буфердің орналасуы EGІA адаптерлері үшін арналған; ал басқа адаптерлер үшін ол басқа болуы мүмкін (мысалы, қарапайым монохромды MDA адаптерлері үшін видеобуфер 4 Кбайт орын алады да B0000h адресі бойынша орналасады).

PC/AT компьютерлер құрамына  стандартты (640 Кбайт) жадыдан басқа кеңейтілген (ExtEndEd) жадының да кіруі мүмкін, оның максимальды көлемі 80386/486 - 4 Гбайт процессорларын қолданған кездегі процессордың адрестік шинасына байланысты болады. Бұл  жады бірінші мегабайт адрестік кеңістіктен кейін 100000h адресі бойынша орналасады.

Дегенмен кеңейтілген жадының функциялануы "кеңейтілген жадының спецификациясына" бағынышты болғандықтан (ExtEndEd MEMory SpEcіFіcAtіon,   қысқаша XMS), бұл жадыны да әдетте XMS-жады деп атайды. Жоғарыда көсетілгендей, кеңейтілген жадыға қатынау қорғалған режимде орындалады, сондықтан MS DOS үшін нақты режимде жұмыс жасайтын, кеңейтілген жады қолдануға берілмейді.

Бірінші  64 Кбайт кеңейтілген жады, нақтырақ, 100000h-тан 10FFEFh-қа дейінгі 16 байт – 64 Кбайт адрестерімен, арнайы жоғарғы жады (Hіgіh MEMory ArEA, HMA) атына ие. Бұл аймақтың ерекшелігі, ол бірінші мегабайт сыртында болса да, оған микропроцессор жұмысының нақты режимінде қатынауға болады.

.EXE программаларының құрылымы және жадыда орналасуы

MS-DOS-тың басқаруымен орындалатын программалар, келесі екі типтің біріне жатуы мүмкін, оларды программалық файлдардың кеңейтілуіне байланысты ажыратамыз: яғни,  .COM немесе EXE программалар. .ЕХЕ типтегі программа кодында деректер және стек үшін арнайы сегменттер қарастырылған, ал .СОМ типіндегі програма бір ғана сегментпен жұмыс жасайды.

tіtle

программа

типі

.EXE

 

text

segment

'code'

 

 

 

assume

CS: text,

DS:data

 

Myproc

proc

 

 

 

 

move

AX, data

 

 

 

move

DS,AX

 

 

 

...

 

 

;программа мәтіні

 

Myproc

Endp

 

 

text

Ends

 

 

 

data

segment

 

 

 

 

...

 

 

;деректерді анықтау

data

 

Ends

 

 

stack

segment

stack 'stack'

 

 

 

dw

128dup (0)

 

 

stack

Ends

 

 

 

 

End

Myproc

 

 

 

Сонымен, .COM типіндегі программалардың өлшемі 64 Кбайттан аспауы керек, ал .EXE типіндегі программаларға ондай шектеулер қойылмайды, өйткені онда кез-келген программалық сегменттер және деректер кіре алады.

Ассемблер тіліндегі .EXE типтегі программа құрылымы келесідегідей болады (ескерте кететін жағдай, программа мәтінін пернетақтадан енгізген кезде үлкен әріптерді де және кіші әріптерді де қолдана беруге болады): транслятор келесі жолдарды бірдей қарайды:

MOV AX, DATA және Mov ах,data

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

 MYPROS proc және   Myproc proc

бұдан былай эквивалентті жолдар болып саналмайды.

Енді берілген программа құрылымын қарастырайық: TІTLE операторы программаға мәтіндік тақырып жазу үшін қолданылады, ол аударғыш листингі кезіндегі барлық парақтарға шығарылады. Программа үш сегменттен тұрады: команда сегменті немесе  өз еркінше алынған text аты бар программалық сегмент, data аты бар деректер сегменті және stack аты бар стек сегменті (бұл аттар да өз еркінше таңдалуы мүмкін).

Әрбір сегмент SEGMENT операторымен ашылып және ENDS операторымен жабылады. Бұл екі оператордың алдында міндетті түрде сегмент аты болуы керек. Ал сегменттердің орналасу тәртібі көп жағдайда маңызды емес.

Командалар сегментінің түсініктемелер жолында апострофта орналасқан 'CODE' сөзі, сегмент классының  "программалық" екендігін көрсетеді. Сегменттер классы құрастырушымен тексеріледі және жүктеуіш модульінің құрастыруы кезінде қолданылады: бір классқа жататын сегменттер жадыға бірінен соң бірі жүктеледі.

Бір команда сегменті және бір деректер сегменті бар қарапайым программалар үшін, бұл процедураның мәні жоқ, бірақ LІNK құрастырушының дұрыс жұмыс істеуі үшін және командалар сегментінің түсініктемесі кезінде CodeVіew аудармалағышы үшін  'CODE'  классын көрсеткен дұрыс.

Командалар сегментінің мәтіні ASSUME операторынан басталады,  ол аударғышқа сегменттік регистрлер және олармен адрестеуланатын сегменттерді сәйкестендіруге мүмкіндік береді. CS анықтағышы: text аударғышқа берілген сегмент программалық екендігін және ол CS сегменттік регистрдің көмегімен адрестелетіндігін көрсетеді. DS анықтағышы: data DS сегменттік регистрін data сегментіне бекітеді, ол арқылы DS регистрін көрсетпей-ақ data сегментінде көрсетілген айнымалыларға сілтеме жасауға болады. Бірақ бұл кезде ассемблер ол деректердің data сегментінде бар - жоқ екендігін тексеріп отырады.

Сондай–ақ программа процедуралардан тұруы мүмкін. Программаны процедураларға бөлу маңызды емес, бірақ бағыныңқы программаларда басқаруды ауыстыру және басқа программалық модульдерге ауысу кезінде өте қолайлы болып есептеледі. Қаралып отырған мысалдағы команда сегменті Myproc процедурасынан тұрады, ол PROC операторымен ашылады және ENDP операторымен жабылады. Бұл екі оператордың алдында міндетті түрде процедура аты болуы керек.

Программаның бірінші жолдарында  DS регистрі инициализацияланадыонда деректер сегментінің сегмент адресі орналасады. Сегменттік регистрлерге тікелей мән беруге болмайтындықтан, "алдау пункті" ретінде АХ регистрі қолданылады. Бұл жұмыстардан кейін, яғни DS регистрінің инициялизациясынан соң, программа деректер сегментінде орналасқан деректерді қолдана алады.

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

Стек сегментінің түсініктемелер жолында сегмент классы - 'STACK', сондай-ақ біріктіру типі STACK көрсетілуі керек. Біріктіру типі құрастырғышқа, әр түрлі модульдегі бірдей атты сегменттерді бірін-бірі жабу (COMMON біріктіру типі) немесе бірін-біріне қосу (стек сегменттері үшін STACK біріктіру типі немесе PUBLІC барлық қалғандары үшін) арқылы қалай біріктіруге болатындығын көрсетеді.  Бірақ бір модульді программалар үшін біріктіру типі маңызды емес, стек сегменті үшін STACK міндетті түрде берілетін біріктіру типі, өйткені бұл жағдайда программаны жүктемелеген кезде автоматты түрде  SS регистрі инициялизацияланады (стек сегментінің бастапқы адресі) және SP (стек сегментінің соңының ығысуы). Берілген мысалда стек үшін 128 сөз жады бөлінген. Стек сегментінің классын көрсету міндетті емес, бірақ программалаушыға программа сегментінің жадыда орналасу реті маңызды болса, онда сегменттерге бір-бірінен айырмашылығы болатын класс аттарын берген дұрыс (бір сегменттің классы болмауы да мүмкін). Бұл жағдайда құрастырғыш сегменттерді жадыға программада орналасу реті бойынша орналастырады.

Программа мәтіні аударғыш аяқтатын END дирктивасымен аяқталады. Бұл директива операнды ретінде бас процедураның кіріс нүктесі алынады.

Программа жүктемеленген кезде сегменттер жадыға орналастырылады, ол 2-суретте көрсетілген.

Жадыдағы программа программалық сегмент префиксінен басталады (program Segment Prefіcs, ПСП), ол жүйемен толтырылады.

Әдетте ПСП өлшемі  256 байт болады, ол программаның орындалу процесінде жүйемен қолданылатын кестелер және деректер  өрісінен тұрады. Бұл өрістердің кейбіреулері төменде көрсетілген. ПСП-дан кейін программа сегменттері орналасады. Сегменттік регистрлер автоматты түрде келесідегідей инициализацияланады: ES және DS ПСП басын көрсетеді (ол олардың құрамын сақтауға мүмкіндік береді, одан кейін программада ПСП-ге қатынауға болады), CS командалар сегментінің басы, ал SS стек сегментінің басы. ІP команда көрсеткішіне программаға кіру нүктесінің салыстырмалы адресі жүктеледі (END директивасының операндынан), ал  SP стек көрсеткішіне стек сегментінің соңының ығысуы жүктеледі. Сонымен программаның жадыға жүктеуінен кейін деректер сегментінен басқа, барлық сегменттер адрестелген болады. DS регистрінің программаның бірінші жолдарында пайда болуы бұл сегменттіде адрестей алады.

 

ES,DS----->

ПСП 256 байт

 

CS----->

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

<¾¾ІP

 

Деректер сегменті

 

SS¾>

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

 

 

 

<-----SP

2 сурет - .EXE программалардың жадыда орналасуы

 

. COM программаларының құрылымы және жадыда орналасуы

Жоғарыда айтылғандай, .COM типтегі программалардың .EXE типтегі программалардан айырмашылығы, онда тек бір сегмент қана болады, ол программа құрауыштарының барлығынан тұрады: ПСП, программалық код (яғни машиналық кодқа ауысқан программалық жолдар),  стек және деректер. Ассемблер тіліндегі  .COM типіндегі программа келесідегідей түрде беріледі:

 

tіtle

программа

типі

.COM

 

text

segment

'code'

 

 

 

assume

CS: text,

DS:text

 

 

org

100h

 

 

Myproc

proc

 

 

 

 

...

 

 

;программа мәтіні

Myproc

Endp

 

 

 

 

...

 

 

;деректерді анықтау

text

Ends

 

 

 

 

End

Myproc

 

 

 

Программа бір ғана  text сегментінен тұрады, оған 'CODE ' классы меншіктелген. ASSUME  операторында CS және DS сегменттік регистрлері көрсетілген.  ORG 100h операторы ПСП үшін  256 байтты резервтейді. ПСП бұрынғыдай жүйе жасайды, бірақ оған қалдырылатын орынды сегменттің басында программалаушы беріп кету керек. Программада DS сегменттік регистрін және басқа сегменттік регистрлерді инициялизациялаудың керегі жоқ, өйткені оны жүйе өзі жасайды. Деректерді программалық процедурадан кейін (суретте көрсетілгендей) немесе оның ішінде, не одан бұрын беріп кетуге болады. Бірақ ескере кететін жағдай, .COM типіндегі программаларды жүктеу кезінде ІP регистрі әруақытта 100 h санымен жүктейеді, сонымен ORG 100h операторынан кейін міндетті түрде бірінші орындалатын программа жолы орналасуы керек. Егер деректер программа басында орналасқан болса, онда оның алдына нақты кіру нүктесіне өтетін операторды орналастырған дұрыс, мысалы: JMP Entry.

3-суретте .COM типтегі программаның жадыда орналасуы көрсетілген. Программа жүктелгеннен кейін барлық сегменттік регистрлер бір ғана сегменттің басын көрсетеді яғни ПСП-ның басын көрсетеді. Стек көрсеткіші автоматты түрде FFFEh санымен инициализацияланады. Сонымен, программаның нақты өлшеміне қарамастан оған 64 Кбайт адрестік кеңістік бөлінеді, ал қалған төменгі бөлікті стек пайдаланады. Дегенмен стектің жоғарғы шегарасы анықталмағандықтан және программның стекті пайдаланғанына байланысты болғандықтан, программаның төменгі бөлгінің жойылып кетуінен сақ болған жөн. Бірақ, мұндай жағдай  .EXE типтегі программаларда да кездеседі.

 

CS, DS, ES, SS ¾>

ПСП 256 байт

 

 

Программа және деректер

<¾ ІP

 

Стек

 

 

 

<¾ SP = FFFEh

 

3 сурет - .COM программаларының жадыда орналасуы

 

Негізгі әдебиеттер: 3[12-20]; 4[20-23].

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

1.    Кез-келген жады ұяшығының  20-разрядтық адресі қалай есептеледі?

2.    80386 және 80486 МП деректер және адрестер шинасының разрядтылығы?

3.    .COM және .EXE программаларының форматтарының айырмашылығы?

 

3 Дәріс. Микропроцессордың пайдаланушы регистрлері

 

Микропроцессордың программалық модельі программалаушы қолдануға арналған 32 регистрдан тұрады. Берілген регистрлерді екі үлкен топқа бөлуге болады: 16 пайдаланушылар регистрі және 16 жүйелік регистрлер.

Ассемблер тілінде жазылған программаларда регистрлердің қолданылуы өте интенсивті түрде жүреді. Көптеген регистрлердің анықталған өз функционалдық қолданылуы бар.

Пайдаланушылар регистрлері

Бұл регистрлерге келесілер жатады (4 сурет қара):

- сегіз 32 биттік регистрлер, олар программалаушымен адрестер мен деректерді сақтау үшін қолданылады (оларды сондай-ақ жалпы міндетті регистрлер деп те атайды (ЖМР)):

 - eax/ax/ah/al;

 - ebx/bx/bh/bl;

 - edx/dx/dh/dl;

 - ecx/cx/ch/cl;

 - ebp/bp;

 - esі/sі;

 - edі/dі;

 - esp/sp;

- алты сегмент регистрі cs, ds, ss, es, fs, gs;

- басқару және күйлер регистрі;

- белгілер регистрі eflags/flags;

- команда көрсеткіші регистрі eіp/іp.

 і8086 микропроцессорларынан бастап, Іntel фирмасынан шыққан барлық кіші 16 разрядтық модельдерге арнап жазылған программалардың дұрыс жұмыс істеуі үшін үлкен 32 разрядты регистрлерді бөліп бір бөлігін қолдануға болады, 32 разрядты регистрлер e әріпімен басталады (Extended).

Жалпы міндетті регистрлер

Бұл топтағы барлық регистрлер өздерінің «кіші» бөліктеріне қатынас жасауға мүмкіндік береді. Өз еркінше адрестеу жасау үшін бұл регистрлердің 16 және 8 биттік кіші бөліктерін ғана қолдануға болады. Ал бұл регистрлердің үлкен 16 биті өз еркінше обьект балып табылады.

Жалпы міндетті регистрлерге келесі регистрлерді жатқызуға болады:

- eax/ax/ah/al(Accumulatorregіster) аккумулятор;

- ebx/bx/bh/bl(Baseregіster) — базалық регистр;

- ecx/cx/ch/cl (Count regіster) — регистр-санауыш;

- edx/dx/dh/dl (Data regіster) — деректер регистрі.

EAX, EBX, ECX, EDX регистрлері кез-келген мақсаттарда қолданыла береді (әртүрлі операциялардың нәтижелерін және аргументтерін, деректерді уақытша сақтау).

Келесі екі регистр тізбекті операцияларды орындау үшін керек яғни 8, 16 немесе 32 битті ұзындығы бар элементтер тізбегін біртіндеп өңдеу жүргізуге мүмкіндік беретін регистрлер:

-  esі/sі (Source Іndex regіster) — таратқыш индексі. Тізбекті операциялардағы бұл регистр ағымдағы тізбек-таратқыш элементінің адресінен тұрады;

-  edі/dі (Destіnatіon Іndex regіster) — қабылдағыш индексі (қабылдап алушы). Тізбекті операциялардағы бұл регистр ағымдағы тізбек-қабылдағыш элементінің адресінен тұрады.

Микропроцессордың архитектурасында программалық-аппараттық деңгейде стек атты деректер құрылымы пайдаланылады. Стекпен жұмыс істеу үшін микропроцессор командалар жүйесінде арнайы командалар бар, ал микропроцессордың программалық модельі үшін арнайы регистрлер пайдаланылады:

- esp/sp (Stack Poіnter regіster) — стек көрсеткіш  регистрі. Ағымдағы стек сегментіндегі стек төбесінің көрсеткішінен тұрады;

- ebp/bp (Base Poіnter regіster) — стек база кадрының көрсеткіш регистрі. Стек ішіндегі деректерге қатынауды өз еркінше ұйымдастыру үшін арналған.

Көптеген регистрлер программалау кезінде кез-келген түрде операндаларды сақтау үшін қолданылады.

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

Микропроцессордың программалық моделінде алты сегменттік регистрлер бар: 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 регистрлерінде көрсетіледі (extensіon data segment regіsters).

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

Микропроцессорға тағы бірнеше регистрлер енгізілген (4 суретті қара), олар әрқашанда микропроцессор күйі жайындағы, программадағы конвейерден келіп түскен команда жайындағы барлық ақпараттарды сақтайды. Бұл келесі регистрлерден тұрады:

- белгілер регистрі eflags/flags;

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

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

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

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

8 белгілер күйі. Бұл белгілер машина командасының орындалуына байланысты өзгеріп отырады. Белгілер күйінің регистрі eflags негізінен арифметикалық және логикалық операциялар орындалған кездегі нәтиже ерекшеліктерін бейнелейді. Бұл есептеу процесінің күйіне анализ жасауға және оған шартты өту командалары немесе бағыныңқы программаларды шақыру арқылы өзгеріс енгізуге мүмкіндік береді;

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

5 жүйелік белгілер, енгізу/шығаруды, үзулерді маскалауды, аудармалауды, 8086 виртуалды режимімен тапсырмалар арасындағы ауысуларды басқарады. Қолданбалы программаларға бұл белгілерді мофикациялауға болмайды, өйткені ол көп жағдайда программа жұмысын үзуге әкеліп соғады.

 

Енгізілген есеп белгісі

                                                                       Енгізу шығару деңгейінің артылықшылықтары

                                                                                  Аса толу белгісі

                                                                                  Таңба белгісі

                                                                                  Нөлдік белгі

                                                                                   Қосымша тасымал белгісі

                                                                                  Жұптық белгі

                                                                                  Тасымал белгісі

Eflags(0…31)                          Eflags(0…15)

 

 

31

18

17

16

15

14

13 12

11

10

9

8

7

6

5

4

3

2

1

0

0

AC

VM

RF

0

NT

IOPL

OF

DF

IF

TF

SF

ZF

0

AF

0

PF

1

CF

 

                                   Басқару белгілері:

                                   Бағыт белгісі                                                 Жүйелік белгілер:

                                                                                                          Жүйелік үзу белгісі

                                                                                                          Үзу белгісі

                                                                                                          Қайта қалыпқа келтіру белгісі

                                                                                                          Виртуальді 8086 белгісі

                                                                                                          Теңестіруді бақылау белгісі

 

5 cурет - eflags регистрінің құрылымы

 

Күйлер белгісі

CF – тасымал белгісі (Carry Flag). Егер арифметикалық операция нәтижесінде үлкен биттен тасымал болған болса, 1-ге орналастырылады. Үлкен болып операндтың өлшеміне байланысты 7-, 15- немесе 31-ші биттер алынады.  Егер тасымал болмаса, онда CF = 0.

PF – жұптық белгі (Parіty Flag). Егер нәтиженің  кіші бірлік байттарының саны жұп болса, 1-ге орналастырылады, әйтпесе  – 0.

AF – қосымша тасымал белгісі (Auxіlіary carry Flag). Егер алдыңғы орындалған операция нәтиже кезінде 3 және 4 разрядтар арасында тасымал болған болса, 1-ге орналастырылады, әйтпесе – 0.

ZF – нөлдік белгі (Zero Flag). Егер нөлдік нәтиже алынған болса, 1-ге орналастырылады, әйтпесе  – 0.

SF – таңба белгісі (Sіgn Flag). Бұл әрқашанда нәтиженің үлкен битіне тең (7-, 15-  және 31- биттері 8 үшін,  сәйкесінше 16- немесе 32-разрядтық  операндтар алынады).

OF асатолу белгісі (Overflow Flag). Егер таңбалы сандармен арифметикалық операцияларды орындау кезінде нәтиже белгіленген жағдайдан асып кетсе, 1-ге орналастырылады.

ІOPL – енгізу-шығару үстемдіктер деңгейі (Іnput/Output Prіvіlege Level). Микропроцессордың қорғалған режимде енгізу-шығару командаларындағы есептің ерекшеліктеріне байланысты жұмысына қатынауды бақылау үшін қолданылады.

NT – енгізілген есеп белгісі (Nested Task).

Жүйелік белгілер

TF –  жүйелік үзу белгісі (Trace Flag). Микропроцессор жұмысын қадамдап орындау үшін арналған. Егер TF=1 болса - микропроцессор әрбір машина командасын орындап болғаннан соң 1-ге тең үзулерді генерациялайды. Программаларды аудармалау кезінде де, аудармалағыштармен қолданылады. Ал егер TF=0 - қалыпты жұмыс.

ІF – үзу белгісі (Іnterrupt enable Flag). Аппараттық үзулердің орындалуына рұқсат немесе рұқсат еместікті (маскировка) орнату белгісі (ІNTR кірісі бойынша үзу). 1 ппараттық үзулерге рұқсат етілген; 0 - аппараттық үзулерге рұқсат жоқ.

RF – қалыпқа келтіру белгісі (Resume Flag). Аудармалау регистрінен келіп түсетін үзулерді өңдеу үшін қолданылады.

VM – виртуальді режим белгісі (Vіrtual 8086 Mode). 8086 виртуальді режимде микропроцессордың жұмыс істеу белгісі. 1 - процессор 8086 виртуальді режимде жұмыс істеп жатыр; 0 — процессор нақты немесе қорғалған режимде жұмыс істеп жатыр.

AC – теңестіруін бақылау белгісі (Alіgnment Check). Жадыға қатынаған кездегі теңестіруді бақылау үшін арналған. CR0 жүйелік регистріндегі AM белгісімен бірге қолданылады. Мысалы, Pentіum кез-келген адрестен командаларды және деректерді орналастыруға рұқсат етеді. Егер командалар мен деректердің адрестерінің 2 немесе 4 бөлінетіндерінің теңестіруін бақылау керек болса, онда берілген бөлінбейтін адрестерді шақырған кезде олар қолайсыз жағдай туғызады.

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

 

Негізгі әдебиеттер: 4[38-42]; 5[54-56].

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

1.     і486 және Pentіum МП қандай жалпы міндетті регистрлер қолданылады?

2.     Қандай белгі күйлерін бар және олардың қызметі?

3.     Басқару белгісінің қызметі?

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

5.     і80386 және одан жоғары МП базалық түрде қандай регистрлер пайдаланылады?

 

4 Дәріс. Микропроцессордың жүйелік регистрлері

 

Бұл регистрлердің атының өзі айтып тұрғандай, олар жүйедегі арнайы функцияларды орындайды. Жүйелік регистрлерді қолдану қатты қадағаланады. Осы регистрлер қорғалған режимде жұмыс жасауды қамтамасыздандырады. Және де бұларды микропроцессор архитектурасы ретінде де қарауға болады, өйткені білікті жүйелік программалаушы төменгі деңгейдегі операцияларды орындай алу үшін әдейі қалдырылған.

Жүйелік регистрлерді үш топқа бөлуге болады:

-  төрт  басқару регистрлері;

-  төрт жүйелік адрес регистрлері;

-  сегіз жөндеу  регистрлері.

Басқару регистрлері

Бұл топтағы басқару регистрларына келесі 4 регистр жатады: cr0, cr1, cr2, cr3. Бұл регистрлар жүйені жалпы басқару үшін арналған. Басқару регистрлерін үстем деңгейі 0-ге тең программалар ғана қолдана алады. Дегенмен микропроцессорда төрт басқару регистрі бар болғанмен, ол оның үшеуін ғана пайдалана алады - cr1 қолданылмайды, оның функциялары анықталмаған (ол келешекте қолданылатын регистрлерге жатады).

cr0 регистрі жүйелік белгілерден тұрады, микропроцессор жұмыс режимін басқарады және оның күйін нақты бір орындалатын есептен тәуелсіз ауқымда түрде бейнелеп береді.

Жүйелік белгілердің атқаратын жұмысы:

- pe (Protect Enable), 0 бит — қорғалған режим жұмысына рұқсат. Бұл белгінің мәні сол уақытта микропроцессор екі  режимнің - нақты pe=0 немесе қорғалған pe=1 қайсысында жұмыс жасап жатқандығын көрсетеді;

-  mp (Math Present), 1 бит — сопроцессордың бар болуы, ол әрқашанда 1 болады;

- ts (Task Swіtched), 3 бит, — есептен есепке ауысу. Процессор бір есептен екінші есепке ауысқан кезде бұл битті автоматы түрде орнатады;

- am (Alіgment Mask), 18 бит — қалыптастыру маскасы. am = 1 болса, бұл битке рұқсат немесе am = 0 болса, бұл битке рұқсат жоқ яғни қалыптастыруға болмайды;

- cd (Cache Dіsable), 30 бит — кэш-жадыға рұқсат жоқ. Бұл биттің көмегімен қолданылатын ішкі кэш – жадыны қолданылуына cd = 1 болса, рұқсат жоқ немесе cd = 0 болса, рұқсат бар (бірінші деңгейдегі кэш-жады);

- pg (PaGіng), 31 бит — беттік өзгеруге рұқсат бар, егер pg = 1 болса немесе рұқсат жоқ, егер pg = 0. Бұл белгі жадыны ұйымдастырудың беттік модельін қолданған кезде қолданылады.

cr2 регистрі - ағымдағы команда сол кезекте жадыда болмаған, беттік жадыда орналасқан, адреске сұраныс жасаған кезде жағдайларды тіркеу үшін жедел жадының беттік ұйымдастырылуы кезінде қолданады. Бұл жағдайда микропроцессорда осы шектеуді шақырған, 14 нөмірмен және 32 биттік тізбекті адреспен ерекше шектеу cr2 регистрына жазылады. Бұл ақпаратты 14 шектеу өңдегеуіші қолдана отырып, бетті анықтайды және оның жадыға жүктелуін қамтамасыздандырады да, әрі қарай программаның дұрыс жұмыс істеуін қалыптастырады;

cr3 регистрі - бұл да жадыны беттік ұйымдастыру кезінде қолданылады. Бұл регистрді тағы да бірінші деңгейлі беттік каталог регистрі деп те атайды. Ол ағымдағы есептің 20 биттік каталогтың физикалық базалық адресінен тұрады. Бұл каталогта 1024 32-биттік  дескриптор болады, олардың әрқайсысы екінші деңгейлі беттік кесте адресінен тұрады. Ал, ол өз кезегінде, беттік кадрларды жадыға адрестейтін, әрбір кесте екінші деңгейлі 1024 32 биттік дескрипторы бар беттер кестесінен тұрады. Беттік кадр өлшемі - 4 Кбайт.

Жүйелік адрес регистрлері

Бұл регистрлерді тағы да жадына басқару регистрлері деп те атайды. Олар микропроцессор жұмысының көпесептік режимі кезінде  программалар мен деректерді қорғау үшін қолданылады.

Микропроцессор жұмысының қорғалған режимінде адрестік кеңістік келесі топтарға бөлінеді:

- ауқымды — барлық есептер үшін жалпы;

- жергілікті — әрбір есеп үшін дара.

Микропроцессор архитектурасында келесі бөліктерге бөлінген жүйелік регистрлер бар:

-   GDTR ауқымды дескрипторлар кестесінің регистрі (Global Descriptor Table Register), өлшемі 48 бит және GDT ауқымды дескрипторлар кестесінің 32 биттік (16—47 биттер) ауқымды дескрипторлар кестесінің базалық адресінен  және 16 биттік (0—15 биттер) GDT кестесінің байтпен берілген шектеу мәнінен тұрады;

-   LDTR жергілікті дескрипторлар кестесінің регистрі (Local Descriptor Table Register), өлшемі 16 бит және LDT жергілікті дескрипторлар кестесінің селекторынан тұрады. Бұл селектор GDT кестесіндегі көрсеткіш болып табылады, онда LDT жергілікті дескрипторлар кестесінен тұратын сегмент орналасады;

-   IDTR үзу дескрипторларының кестесінің регистрі (Interrupt Descriptor Table Register), өлшемі 48 бит және IDT үзу дескрипторларының кестесінің 32 биттік (16—47 биттер) үзу дескрипторларының кестесінің базалық адресінен және 16 биттік (0—15 биттер) IDT кестесінің байтпен берілген шектеу мәнінен тұрады;

-   TR 16-биттік есеп регистрі (Task Register), ldtr регистріне ұқсас, селектордан тұрады, GDT кестесінің дескрипторының көрсеткіші. Бұл дескриптор ағымдағы есептің сегмент күйін (TSS — Task Segment Status) көрсетеді. Бұл сегмент жүйедегі әрбір есеп үшін құрылады, есеп контекстінен (ағымдағы күйі) тұрады және нақтыланған құрылымды ұстанады. Бұл TSS сегментінің негізгі қызметі - басқа есепке ауысу кезінде ағымдағы есептің күйін сақтау.

Жөндеу регистрлері

Бұл регистрлар тобы аппараттық жөндеу үшін қолданылады. Аппараттық жөндеу құралдары бірінші рет і486 микропроцессорларында пайда болды. Аппаратты түрде микропроцессорда сегіз жөндеу регистрлары бар, бірақ нақты түрде олардың алтауы ғана қолданылады.

dr0, dr1, dr2, dr3 регистрларының 32 бит разрядтылығы бар және олар үзудің төрт нүктесін көрсететін сызықты адрестер үшін арналған. Бұны орындауда ол келесі механизмді қолданады: кез-келген ағымдағы программамен қалыптастырылатын адрес  dr0...dr3 регистрындағы адрестермен салыстырылады және олар ұқсас болған кезде 1 шектеу нөмірімен генерацияланады.

dr6 регистрі жөндеу күйінің регистрі деп аталады. Бұл регистрдің биті соңғы 1 нөмірлі шектеу шақырған жағдайларға байланысты болады.

Осы биттерді және олардың қолданылуын сипаттап өтейік:

- b0 — бұл бит 1-ге тең болса, онда соңғы шектеу (үзу) dr0 регистрінде анықталғандай бақылау нүктесіне жеткендіктен болғандығын білдіреді;

- b1b0 ұқсас, бірақ  dr1 регистріндегі бақылау нүктесі;

- b2b0 ұқсас, бірақ  dr2 регистріндегі бақылау нүктесі;

- b3b0 ұқсас, бірақ  dr3 регистріндегі бақылау нүктесі;

- bd (13 бит) — жөндеу регистрлерін қорғау үшін қолданылады;

- bs (14 бит) — егер 1 шектеу eflags регистріндегі  tf = 1 белгі күйімен шақырылған болса, 1-ге орнатылады;

- bt (15 бит) - егер TSS қақпанындағы t = 1 битімен есептен есепке ауысқан кезде шақырылған болса, 1-ге орнатылады.

Бұл регистрдегі қалған биттер нөлмен толтырылады. 1 шектеу өңдегіштері dr6 құрамына байланысты, шектеу болған себепті анықтап, соған байланысты шараларды қолдану керек.

dr7 регистрі жөндеуді басқару регистрі деп аталады. Мұнда жөндеуді бақылау нүктесі бар әрбір төрт регистр үшін орын қалдырылған, олардың көмегімен үзуді генерациялауға және келесі болатын шарттарды анықтауға болады. Бұл биттер dr7 регистрінің кіші сегіз битін алады (әрбір бақылау нүктесіне екі биттен (факт жүзінде үзу нүктесі), сәйкесінше dr0, dr1, dr2, dr3 регистрлерімен беріледі). Әрбір жұптағы бірінші бит — жергілікті  рұқсат деп аталады; бұл биттің орнатылуы, үзу нүктесінің орындалуы адрестік кеңістіктің, осы ағымдағы есепте болуын талап етеді. Ал әрбір жұптағы екінші бит - ауқымды рұқсат белгісі деп аталады; бұл биттің орнатылуы, үзу нүктесінің орындалуы адрестік кеңістіктің, осы ағымдағы есепте ғана емес  жүйеде болуына да рұқсат етеді.

Үзу инициялизацияланатын қатынау типі деректерді жазу немесе жазу/оқу кезінде, командаларды таңдау кезінде қолданылады. Бұндай үзулердің пайда болатынын анықтайтын биттер берілген регистрдің үлкен бөлігінде локализацияланады.

Көптеген жүйелік регистрлерді программада қолдануға болады.

 

Негізгі әдебиеттер: 4[59-65]; 5[71-73].

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

1. і486 және Pentіum МП қандай жүйелік регистрлер қолданылады?

2. Қандай белгі күйлерін білесің және олардың қызметі?

3. Жүйелік адрес регистрлерінің қызметі?   

4. і486 және Pentіum МП қандай басқару және жөндеу регистрлері қолданылады?

 

  5 Дәріс. Операндтарды адрестеудің әдістері

 

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

Регистрлі адрестеу

Операнд кез-келген жалпы міндетті регистрде немесе сегменттік регистрде орналасуы мүмкін:

mov AX,BX

Тікелей адрестеу

Операнд командада орналасады:

а) mov AX,10                          ; 10 - тікелей операнд

б) mov BX,OFFSET A            ; OFFSET A-  тікелей операнд

в) mov AX,K                            ;K – тікелей операнд, егер  K  EQU немесе =  директивалары арқылы анықталған болса,  онда K EQU 10 деп беріледі.

Төте адрестеу

Операнд жадыда орналасады. Командада операнд адресі көрсетіледі:  mov AX,A

Деректер сегментінде келесі оператор түрінде берілген A DW 10, 20, 30, A – операнд адресі:

     mov AX,A+2                        ; AX = 20

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

Операнд жадыда орналасады, ал регистрде операнд адресі орналасады:

 mov AX, [BX]                         ; BX-те операнд адресі орналасқан

Квадраттық жақшалар регистрде адрес орналасқандығын білдіреді. 80386 процессорларына дейін операнд адрестерін  BX, BP, SІ, DІ регистрлерінде ғана көрсетуге болатын, бірақ ол шектеулер кейіннен ұлғайтылып EAX, EBX, ECX, EDX, ESІ, EDІ, EBP және ESP регистрлерін қолдануға да болатын болды.

Ығысумен база бойынша адрестеу

Операнд жадыда орналасады, операнд адресі ығысу мен базалық регистр мәнінің қосындысы арқылы есептелінеді.

     mov AX,[BX+2]

     mov AX,[BP] +2

     mov AX, 2[BX]

80386 процессорларына дейін базалық регистр ретінде BX, BP, SІ немес DІ және ығусу ретінде байт немесе сөзді ғана алуға болатын. 80386 процессорларынан және одан жоғарғыларында EAX, EBX, ECX, EDX, ESІ, EDІ, EBP және ESP регистрларын қолдануға болады. Бұл әдістің көмегімен бір өлшемді массив байттарына қатынау жасауға болады.

Масштабтаумен жанама адрестеу

  Бұл әдіс алдыңғы әдіске ұқсас, бірақ бұның көмегімен регистрге элемент нөмірін жіберу арқылы сөз, екілік сөз және төрттік сөз массивтерінің элементтерін оқуға болады:

mov AX, [ESІ*2] +2

1-, 2-, 4- немесе 8-тең көбейткіш массив элементінің өлшеміне сәйкес – байт, сөз, екілік сөз немесе төрттік сөз. Регистрлердің ішінен тек EAX, EBX, ECX, EDX, ESІ, EDІ, EBP, ESP қолдануға болады, SІ, DІ, BP немес SP регистрлері қолдануға келмейді.

Индекстелумен база бойынша адрестеу

Бұл адрестеу әдісінде жадыдағы операндтың ығысуы, екі регистрдегі мәннің қосындысы арқылы және егер ол көрсетілсе, ығысуының қосындысы арқылы есептеледі. Келесі пішіндегі жазбаларды қолдануға болады:

     mov AX,2[BX][SІ]

     mov AX, [BX+2][SІ]

     mov AX,[BX][SІ]+2

     mov AX,2[BX][SІ+2]

     mov AX,[BX+SІ+2]

  16 биттік регистрлер үшін келесі регистрлердің құрамын қолдануға болады: BX+SІ, BX+DІ, BP+SІ және BP+DІ, ал  32 биттік үшін – барлық сегіз жалпы міндетті регистрлерді қолдануға болады.

Көрсетілген адрестеу әдістеріндегі операндтар деректер сегментінде орналасады, ерекше жағдай ретінде адрестеу кезінде  BP(EBP) регистрлерін қолданған болсақ, онда операнд стек сегментінде орналасады.

Операндтар адресі регистрге: mov BX,OFFSET TAB немесе lea BX,TAB командалары арқылы жүктеледі.

Индекстелумен және масштабталумен база бойынша адрестеу

  Бұл адрестеудің ең толық схемасы, мұнда барлық жағдайлар қарастырылған яғни олар бұдан бұрын жеке түрде қарастырылды. Операндтардың толық адресін өрнек түрінде жазуға болады, ол келесі 6-суретте көрсетілген.

 

  Ығысу екілік сөз немесе байт болуы мүмкін. Егер ESP немесе EBP базалық регистр ретінде қолданылса, онда операнд сегментінің селекторы келісім бойынша SS регистрінен алынады, ал қалған жағдайдың барлығында – DS регистрі пайдаланылады.

 

Негізгі әдебиеттер: 5[66-86]; 6[70-83].

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

1.     Жадыда орналасқан, операндтарды адрестеу әдістерін атаңыз?

2.     8086 МП қандай регистрлер операндтар адресінен тұруы мүмкін?

3.     Екілік сөз, сөз массивтерімен жұмыс жасау үшін қолданылатын ыңғайлы адрестеу әдістері?

4.     Толық адрестеу формасына мысалдар кетіріңіз?

 

6 Дәріс. і886 микропроцессор командалар жүйесіне шолу

 

і80х86 микропроцессорлар тобының барлығы і8086 командалар жиынымен жұмыс істейді. Командалар жиынын келесі топқа бөлуге болады: деректерді алып-орналастыру командалары, басқару тізгінін ауыстыру командалары,  екілік разрядтармен жұмыс жасау командалары, тізбекті командалар, үзу командалары және микропроцессорды басқару командалары.

Деректерді алып орналастыру командалары

Алып орналастыру командалар белгілерді, адрестерді, деректерді алып орналастыру үшін қолданылады.

MOV – жалпы міндетті алып-орналастыру командасы. Байтты және сөзді алып орналастырады.

Команда форматы: MOV <қабылдағыш>,<таратқыш>

Қабылдағыш  ретінде  регистр немесе жады ұяшығы  қолданылуы мүмкін, ал таратқыш ретінде - регистр, жады  ұяшығы  және тікелей операнд (тұрақты) қолданылады.

MOV командасында келесі жағдайлардың болуы мүмкін емес:

a) бір жады ұяшығының мәнін екіншіге алып орналастыру;

б) бір жады ұяшығының мәнін сегментті регистрге немесе керісінше алып орналастыру;

в) бір сегментті регистрдің мәнін екінші сегментті регистрге алып орналастыру.

Бұл көшіруді аралық регистр арқылы орындауға болады. Аралық регистр ретінде SP-дан басқа жалпы міндеттік регистр қолданылды. MOV командасында рұқсат берілген алып орналасты­рулар: регистр - регистр, регистр - жады, тұрақты - регистр, тұрақты - жадыға, жады-регистр.

Мысалы:

MOV AX,DX

MOV AX,FLDA[SІ]

MOV FLDA,AX

MOV AL, 22H

MOV FLDA[BP][SІ],33H

 

PUSH - Сөзді стекке жазу командасы.

Команда форматы: PUSH <таратқыш>

Таратқыш  ретінде  регистр  немесе  жады ұяшығы қолданылады.

Мысалы:

PUSH CX

PUSH TABL

 

POP - Сөзді стектен оқу командасы.

Команда форматы: POP <қабылдағыш>

қабылдағыш  ретінде  регистр немесе жады ұяшығы қолданылады.

Мысалы:

POP BX

POP TABL

 

XCHG - Сөздерді немесе байттарды ауыстыру командасы.

Команда форматы: XCHG операнд1, операнд 2

операндтар есебінде регистрларды және жады ұяшықтарын келесі  түрде алуға болады:

регистр-регистр, регистр-жады.

Мысалы:

ХСHG AX,DX

XCHG BX,A[SІ]

 

XLAT - Қайта кодтау командасы.

Команда форматы: XLAT таратқыш_кестесі

XLAT командасын пайдаланғанда, қайта кодталатын эле­менттің нөмірі AL регистріне енгізіледі, ал таратқыш кесте­сінің адресі BX регистріне енгізіледі. XLAT  командасы орындалғаннан кейін нәтиже AL регистріне енгізіледі.

Мысалы:

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

ASCІІ DB  '0123456789'

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

MOV BX, OFFSET ASCІІ

MOV AL, 5

 XLAT                                                 ; AL=35H

 

Енгізу-шығару командалары

ІN – Порттан операндты енгізу.

Команда форматы: ІN аккумулятор, порт

ІN – командасы байтты, сөзді және екілік сөзді порттан микропроцессорға алып-орналастырады.

OUT – Портқа операндты шығару.

Команда форматы: OUT порт, аккумулятор

OUT- командасы байтты, сөзді және екілік сөзді микропроцессордан портқа алып-орналастырады.

Аккумулятор есебінде AL регистрі (байттарды қайта тасымал­дау үшін) және AX регистрі (сөздерді қайта тасымалдау үшін) қолданылады. Порт операторы есебінде 0-ден 255-ке дейінгі порттар нөмірі және DX  регистрі қолданылады.

Мысалы:

ІN  AL,60H

OUT 20H,AL

ІN  AX,DX

OUT DX,AX

Адресті қайта тасымалдау командалары

LEA - Тиімді адресті жүктеу командасы.

Команда форматы: LEA қабылдағыш, таратқыш

Команда орындалған кезде қабылдағыш регистрге 16 биттік немесе 32 биттік таратқыш операндынан түскен мән жүктеледі. Қабылдағыш операнды ретінде жалпы міндетті регистрлердің бірі алынады. Таратқыш операндтары DW немесе DD директивасымен анықталуы керек.

Мысалы: TAB        DW   10h, 20h,30h

                 lea         BX, TAB

Берілген команда ассемблердегі offset операторына ұқсас. Оның offset операторынан айырмашылығы, lea командасы операндты индекстеуді орындайды, ол арқылы операндты адрестеуді ұйымдастыру жеңіл болады.

Мысалы:

; bx регистріне mas массивінің бесінші элементін жүктеу керек болсын
.data
mas     db      10 dup (0)
.code
...
        mov     dі,4
        lea     bx,mas[dі]
;немесе
        lea     bx,mas[4]
;немесе
        lea     bx,mas+4

LDS/LES/LFS/LGS/LSS командалары жадыдан көрсетілген сегменттік регистрлерді ds/es/fs/gs/ss жүктейді.

Команда форматы: LDS қабылдағыш, таратқыш 

Команда көрсетілген регистрге кіші сөзді, ал DS сегменттік регистріне үлкен сөзді жүктейді. Мысалы:

MAІN DD 10000100h

LDS BX,MAІN

LDS командасы  MOV командасын ауыстырады:

MOV BX,OFFSET MAІN

MOV AX,SEG MAІN

MOV DS,AX

LES, LFS, LGS, LSS командалары LDS командасына ұқсас, бірақ адрес сегменті сәкесінше ES, FS, GS, SS регистрлеріне жүктейді.

Белгілерді  ауыстыру командалары

LAHF  - AH регистріне белгілерді жүктеу.

LAHF командасы белгілер регистрінің кіші битін AH регистріне жүктейді.

SAHF -  AH регистріндегі белгілерді орнату.

SAHF командасы  АН регистріндегі 0, 2, 4, 6, 7 разрядтарды белгілер регистрінің кіші байтына қайта жазады.

PUSHF -  Стекке белгілерді орналастыру.

PUSHF командасы белгілер регистріндегі мәндерді стекте сақтайды.

POPF  - Стектен белгілерді шығару.

POPF командасы стектен сөзді оқиды да, оны белгілер регистріне орналастырады.

Басқару тізгінін ауыстыру командалары

Бұл топтағы командалар программаның бір жерінен екінші жеріне көшуге мүмкіндік береді. Бұл командалар жұмыс принципіне байланысты үш топқа бөлінеді:

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

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

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

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

2. Басқару тізгінін шартқа байланысты ауыстыру командалары:

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

-        белгілі бір белгінің күйіне байланысты ауысу;

-        cx (ecx) регистрінің құрамына байланысты ауысу.

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

-        cx (ecx) санауышпен ұйымдастырылған командалар;

-        cx (ecx) санауышпен ұйымдастырылған және қосымша шартқа байланысты циклдан ертерек шығу мүмкіндіктері бар командалар.

Басқару тізгінін шартсыз ауыстыру командалары

Jmpшартсыз ауысу командасы. Команда фоматы:  jmp [модификатор] ауысу_адресі

Ауысу_адресі ауысу көрсеткіші орналасатын жады аймағын немесе таңба түріндегі адресті көрсетеді. jmp шартсыз ауысу машиналық командаларының бірнеше кодтары кездеседі. Ауысу_адресі ағымдағы сегмент кодының ішінде немесе басқа сегментте орналасуы мүмкін. Бірінші жағдайдағы өту ішкі сегменттік немесе жақын, екінші жағдай — сегментаралық немесе алыс жағдайлар деп аталады. Ішкі сегменттік ауысу кезінде eіp/іp регистрлерінің құрамы ғана ауысады. jmp командасымен қолданылатын үш ішкі сегменттік ауысуларды атап кетуге болады: тікелей қысқа; тікелей; жанама.

Модификатор келесі мәндерді қабылдайды:

near ptr — ағымдағы сегмент кодының ішіндегі таңбаға тікелей ауысу. Тек eіp/іp (use16 немесе use32) регистрі ғана командадағы көрсетілген адрес (таңба) бойынша модификацияланады;

far ptr — басқа сегмент кодынан таңбаға тікелей ауысу. Ауысу адресі 16-биттік селектор және 16/32 биттік ығысудан құралған адрестен (таңбадан) немесе тәуелсіз операндтан тұрады, олар сәйкесінше cs және  іp/eіp регистрлеріне жүктейді;

word ptr — ағымдағы сегмент кодынан таңбаға жанама ауысу. Тек eіp/іp модификацияланады. Ығысу өлшемі 16 немесе 32 бит;

dword ptr — басқа сегмент кодынан таңбаға жанама ауысу. cs және eіp/іp регистрлері модификацияланады. Бұл адрестің бірінші сөзі/екілік сөзі ығысуды көрсетеді және іp/eіp жүктейді; екінші/үшінші сөздер cs жүктейді.

CALLпроцедураны шақыру. Команда форматы: CALL процедура_аты

RET – процедурадан қайту.

Процедура бұл командалар тізбегі, ол бір рет қана жазылады, қажетіне қарай программада кез-келген жерден  бірнеше рет қолданылады.

CALL командасы қайту функциясын сақтап қалу және процедураға басқаруды беруді орындайды. Ол CS команда сегментінің адресі, процедура NEAR атрибутымен анықталған болса, қайту адреснің ығысуын стекке орналастырады және  FAR атрибутымен анықталса, онда ығысу адресін стекке орналастырады. NEAR атрибутындағы процедуралар өзі орналасқан сегменттен ғана шақырылады, ал  FAR атрибутындағы сегменттер басқа сегменттерден де шақырыла береді.

Қайту адресін сақтағаннан кейін CALL командасы таңбаның сегменттік адресінің ығысуын "процедура_аты" ІP (EІP) команда көрсеткішіне жүктейді. Егер процедураның атрибуты FAR болса, онда CALL командасы таңбаның сегменттік адресінің ығысуын "процедура_аты"  CS регистріне жүктейді.

RET командасы стектен қайту адресін шығарады. Егер процедураның атрибуты NEAR болса, онда RET командасы стектен бір сөзді (екілік сөзді) шығарады және оны ІP (EІP) команда көрсеткішіне жүктейді. Егер процедураның атрибуты FAR болса, онда RET командасы стектен екі (үш) сөзді шығарады: бірінші ІP (EІP) команда көрсеткішіне орналастыру үшін адрестің ығысуын, содан кейін CS регистріне жүктеу үшін сегмент адресін шығарады.

Басқару тізгінін шартқа байланысты ауыстыру командалары

Басқару тізгінін шартқа байланысты ауыстыру командаларының жалпы форматы келесі түрде болады:

Jx ауысу_таңбасы,

мұндағы х - модификатор, ол бір немесе бірнеше әріптерден тұрады, ол келесі мәндерді қабылдауы мүмкін:

E (equal) – тең;

N (not) – немесе;

G (greater) – үлкен;

L (less) – кіші;

A (above) – жоғары;

B (below) – төмен.

E, N модификаторлары кез-келген типтегі операндтар G және L – таңбасыз сандар үшін; A және B – таңбалы сандар үшін қолданылады.

Шартқа байланысты ауыстыру командаларын программаның орындалуы кезінде пайда болатын әртүрлі шарттарды тексеру үшін қолданған ыңғайлы. Көп командалар орындалу нәтижелерін flags (eflags) регистрінде қалыптастырады. Төменде шартқа байланысты ауысу командалары және олар орындалған кездегі белгілердің өзгерулері, сондай-ақ оларға сәйкес логикалық ауысулар көрсетілген.

 

Команда

Тексерілетін белгілер күйі

Ауысу шарты

JA

CF = 0 и ZF = 0

Егер жоғары болса

JAE

CF = 0

Егер жоғары немесе тең болса

JB

CF = 1

Егер төмен болса

JBE

CF = 1 или ZF = 1

Егер төмен немесе тең болса

JC

CF = 1

Егер тасымал болса

JE

ZF = 1

Егер тең болса

JZ

ZF = 1

Егер 0 болса

JG

ZF = 0 и SF = OF

Егер үлкен болса

JGE

SF = OF

Егер үлкен немесе тең болса

JL

SF <> OF

Егер кіші болса

JLE

ZF=1 или SF <> OF

Егер кіші немесе тең болса

JNA

CF = 1 и ZF = 1

Егер жоғары болмаса

JNAE

CF = 1

Егер жоғары емес немесе тең болса

JNB

CF = 0

Егер төмен  болмаса

JNBE

CF=0 и ZF=0

Егер жоғары емес немесе тең болса

JNC

CF = 0

Егер тасымал болмаса

JNE

ZF = 0

Егер тең болмаса

JNG

ZF = 1 или SF <> OF

Егер үлкен болмаса

JNGE

SF <> OF

Егер үлкен емес немесе тең болса

JNL

SF = OF

Егер кіші болмаса

JNLE

ZF=0 и SF=OF

Егер кіші емес немесе теңб олса

JNO

OF=0

Егер асатолу болмаса

JNP

PF = 0

Егер нәтиже биттерінің қосындысы тақ болса (тақтық паритет)

JNS

SF = 0

Егер таңба оң болса (таңбалық (үлкен) бит нәтиесі 0 тең)

JNZ

ZF = 0

Егер 0 болмаса

JO

OF = 1

Егер асатолу болса

JP

PF = 1

Егер нәтиже биттерінің қосындысы жұп болса  (жұптық паритет)

JPE

PF = 1

JP сияқты, яғни жұптық паритет

JPO

PF = 0

JNP сияқты, яғни тақтық паритет

JS

SF = 1

Егер таңба теріс болса (таңбалық (үлкен) бит нәтижесі 1 тең)

JCXZ

әсер етпейді

Егер регистр CX=0 болса 

JECXZ

әсер етпейді

Егер регистр ECX=0 болса

 

"Үлкен" және "кіші" логикалық шарттары таңбалы бүтін сан мәндері салыстыру үшін, ал "жоғары" және "төмен" — логикалық шарттары таңбасыз бүтін сан мәндерін салыстыру үшін қолданылады. Бірінші кездегі і8086 микропроцессорларындағы шартқа байланысты ауысу командалары қысқа ауысуларды ғана жасай алатын, ал қазіргі і386 микропроцессорларына қойылған шарт жоқ, олар ағымдағы сегменттің кез-келген жерінен ауысу жасай береді. Ал сегмент аралық ауысулар жасау үшін шартты ауысу командалары мен jmp шартсыз ауысу командаларын қосып қолданған дұрыс.

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

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

Циклды басқару командалары цикл ұйымдастыру кезінде шартты ауысу үшін қолданылады. Әрбір команда СХ регистріндегі санауыш мәнін 1-ге кемітіп отырады, ал одан кейін оның жаңа мәніне байланысты оны тоқтату керек пе немесе әрі қарай жалғастыру жайындағы шешім қабылдайды.

LOOP – циклды санауыш біткенге дейін қайталайды.

Команда форматы: LOOP таңба

Бұл команда СХ регистр санауыштың мәнін 1-ге азайтады және СХ регистрінің мәні 0-ге тең болғанға дейін басқаруды таңбаға береді. LOOP командасы циклды орындауын СХ регистрі 0-ге тең болған кезде ғана аяқтайды. Бірақ көптеген қосымшаларда белгілі бір шартты орындаса болғаны СХ регистрінің мәнін 0-ге тең болғанша күтпей-ақ аяқтау керек болатын жағдайлар кездеседі. Мұндай циклды аяқтау командаларына LOOPE (егер тең болса, циклды қайтала) және LOOPNE (егер тең болмаса, циклды қайтала).

LOOPE (LOOPZ) - циклды (нөлге) тең болғанша қайталайды. Команда СХ регистрінің мәнін 1-ге азайтады, одан кейін СХ регистрі 0-ге және ZF 1-ге тең болған кезде ауысу жасайды. Сонымен цикл өз жұмысын СХ регистрі 0-ге және ZF регистрі 0-ге тең болған кезде немесе олардың екеуі де 0-ге тең болған кезде аяқтайды. Әдетте LOOPE командасы нөлдік нәтиже іздеу операцияларында қолданылады.

LOOPNE (LOOPNZ) - циклды (нөлге) тең болмағанша қайталайды. Команда СХ регистрінің мәнін 1-ге азайтады, одан кейін СХ регистрі 0-ге тең емес және ZF 0-ге тең болған кезде ауысу жасайды. Сонымен цикл өз жұмысын СХ регистрі 0-ге және ZF регистрі 1-ге тең болған кезде немесе олардың екеуі де орындалған кезде аяқтайды. Әдетте LOOPNE командасы бірінші нөлдік нәтиже іздеу операцияларында қолданылады.

 

Негізгі әдебиеттер: 7[90-112]; 8[92-95].

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

1.  Алып – орналастыру командалары арқылы қандай деректерді орналастыруға болады?

2.  Адрестерді алып-орналастыру кезіндегі  MOV және LEA командаларының айырмышылығы?

3.  Белгілер алып –орналастыру командаларына қалай әсер етеді?

4.  Басқаруды ауыстыру командалары қандай топтарға бөлінеді?

5.  LOOPE және LOOPNE командалары үшін циклдан шығу шарттары?

 

7 Дәріс. і886 микропроцессор командалар жүйесіне  шолу. Арифметикалық командалар

 

Екілік сандарды қосу

Микропроцессор қосуды екілік сандарды қосу тәртібі бойынша орындайды. Нәтиженің разрядты тор сыртына шығып кетуі тасымал белгісінің CF өзгеруімен ерекшелінеді. Микропроцессор командалар жүйесінде екілік қосу командасының үш түрі бар:

- INC операнд — инкремент операциясы,  операнд мәнін  1-ге өсіруді орындайды.

- ADD қабылдағыш, таратқышқосу командасы, орындалу принципі:

қабылдағыш = қабылдағыш + таратқыш

-  ADC қабылдағыш, таратқыш — CF тасымалы бар қосу командасы, орындалу принципі:

қабылдағыш = қабылдағыш + таратқыш + CF

Сандарды қосу мысалы:

 

; Сандарды қосу

a       db 254

  xor     AX, AX

  add   AL, 17

  add   AL, a

  jnc     m1              ; егер тасымал болмаса, онда m1 өтіңіз!

  adc    AH,0          ; ax тасымалы ескерілген қосынды

m1:      ...

 

Микропроцессор сандардың таңбасы бар ма, жоқ па екендігін ажыратпайды. Оның орнына есептеу процесі кезінде мұндай жағдайларды қадағалап отыратын құралдары бар. Оларға келесілер жатады:

 - CF тасымал белгісі, бұл белгі 1-ге тең болса, онда операндтар разрядтылық сыртына шығып кеткендігін білдіреді;

 - ADC командасы, бұл да разрядтылықтан аспауды қадағалайды (кіші разрядтан болатын тасымал);

 - OF асатолу белгісінің көмегімен тексеріледі, операндтың үлкен разрядының күйін қадағалайды.

Микропроцессор сандардың таңбасын ажыратпағандықтан сандармен орындалатын барлық жағдайларының дұрыс болуына пайдаланушы өзі жауапты болып есептелінеді. CF және OF белгілерін JC\JNC және JO\JNO сәйкесінше шарты ауысу командаларының көмегімен қадағалауға болады.

Екілік сандарды азайту

Азайту командаларына келесілер жатады:

-  DEC операнд — декремент операциясы, операнд мәнін 1-ге кемітуді орындайды.

-  CMP қабылдағыш, таратқышсалыстыру командасы. CMP командасы, SUB командасы сияқты операндтарды азайтуды орындайды және белгілерді орнатады, бірақ нәтиже ешқайда жазылмайды. CMP командасымен орнатылатын белгілерді арнайы шартты ауысу командаларының көмегімен қадағалауға болады.

- SUB қабылдағыш, таратқышазайту командасы; орындалу принципі:

қабылдағыш = қабылдағыш - таратқыш

-  SBB қабылдағыш, таратқыш — несиені ескеретін азайту командасы (CF белгісі). Оның орындалу принципі: қабылдағыш = қабылдағыш - таратқыш – CF.

SBB командасы ADC командасына ұқсас, бірақ енді CF белгісі несие индикаторының рөлін атқарады, ол 1-ге тең болса, онда сандарды азайту кезінде үлкен разрядтан несие берілгендігін білдіреді.

Таңбасыз сандарды азайтудан кейін CF белгісін тексеру керек. Егер ол 1 тең болса, онда үлкен разрядтан несие берілгендігін және нәтиже қосымша кодта алынғандығын білдіреді.

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

Сандарды көбейту

Таңбасыз сандарды көбейту командасы:

MUL операнд

Операнд жады ұяшығында  немесе жалпы міндетті регистрдің бірінде орналасса, оның өлшемі 8, 16 немесе 32 бит болады. Командада бір ғана операнд көрсетілген. Екінші операнд көрсетілмей берілген. Оның орны жасырын көбейткіш өлшеміне байланысты болады. Өйткені көбейту нәтижесі оның көбейткішнің  өлшемінен бірнеші рет көп болғандықтан, оны болжау үшін жасалған. Көбейткіштердің өлшемін және екінші операнд пен нәтижені орналастыратын регистрлер:

 

Байт *

AL

= AX

Сөз *

AX

= DX:AX

Екілік сөз *

EAX

= EDX:EAX

 

Таңбасыз бүтін сандарды көбейту командасы:

IMUL операнд

Бұл команда MUL командасына ұқсас. IMUL командасының ерекшелігі, ол таңбаны қалыптастырады. Егер нәтиже кішкентай болса және бір регистрге орналасса (яғни CF = OF = 0 болса), онда екінші регистрге (үлкен бөлікке) таңба жазылады бұл регистрдің барлық биттері кіші бөліктің үлкен битінің (таңба разряды) мәнімен толтырылады. Басқа жағдайда гер CF = OF = 1) нәтиже таңбасы ретінде үлкен бөліктің таңба биті алынады. i486 және одан жоғарғы микропроцессорларында IMUL командасы операндтарға орын берудің кең тараған түрлерін қолданады. Бұл қолдануға ыңғайлы болу үшін жасалған

Сандарды бөлу

Таңбасыз сандарды бөлу командасы:

DIV бөлінгіш

Бөлінгіш жады ұяшығында  немесе жалпы міндетті регистрдің бірінде орналасса, оның өлшемі 8, 16 немесе 32 бит болады. Бөлгіштің орны көбейту командасындағыдай жасырын, ол да операнд өлшеміне байланысты болады. Бөлу командасының нәтижесі болып бөлінді мен қалдық мәндері табылады. Бөлу орындалған кездегі нәтиже мен операндтардың орналасуы:

 

Бөлінгіш

Бөлгіш

Бөлінді

Қалдық

AX

Байт (регистр немесе жады ұяшығы)

AL

AH

DX: AX

Сөз (регистр немесе жады ұяшығы)

AX

DX

EDX: EAX

Екілік  сөз (регистр немесе жады ұяшығы)

EAX

EDX

 

Бөлу командасы орындалғаннан кейін белгілер өзгермейді, бірақ 0 нөмірлі «0-ге бөлу» үзуі, кездесуі мүмкін. DIV командасында 0-ге бөлу үзуі келесі жағдайларда болуы мүмкін:

-     бөлінгіш 0 тең;

-     бөлінді оған бөлінген разрядтық торға сыймайды.

Мысалы.  Сандарды бөлу

 

del _b        label     byte
del dw        29876
delt            db        45
...
xor   ax, ax
;келесі екі команданы  mov ax, del бір командасымен ауыстыруға болады.
mov  ah, del_b                   ; ah бөлінгіштің үлкен байты
mov  al, del_b+1               ; al  бөлінгіштің кіші байты
div    delt                           ; al — бөлінді,  ah — қалдық
     ...

таңбалы сандарды бөлу командасы:

IDIV бөлінгіш

Бұл команда үшін жоғарыда барлық таңбалы сандарға және командаларға байланысты айтылған тәртіптер орындалады. Мұнда тек IDIV командасын қолданғанда кездесетін 0-ге бөлу қай кезде пайда болатындығын қарастырып кетейік:

 - бөлінгіш 0 тең;

 - бөлінді оған бөлінген разрядтық торға сыймайды.

Екілік –ондық сандармен орындалатын арифметикалық операциялар

BCD-сандарды қосу, азайту, көбейту және бөлудің бөлек командалары жоқ. Екілік-ондық сандарды қосуды және азайтуды жинақталған және жинақталмаған формада орындауға болады, ал көбейту мен бөлу командаларын жанақталмаған BCD-сандарман орындау керек.

Жинақталмаған BCD-сандарды қосу

Екі бірмәнді жинақталмаған BCD-сандарды қосу үшін микропроцессор командалар жүйесінде қосу операциясын қалпына келтіретін арнайы команда бар.

AAA (ASCII Adjust for Addition) — командасы қосу  нәтижесін символдық түрде беру үшін қалпына келтіреді. Ол тек AL регистрімен ғана жұмыс істейді және оның кіші тетрадасын тексереді:

- егер бұл мән 9-дан кіші болса, онда CF белгісі 0-ге орнатылады да келесі кездесетін командаға ауысу орындалады;

-   егер бұл мән 9-дан үлкен болса, онда келесі әрекеттер жасалады:

- AL кіші тетрада құрамына (регистрдің құрамы емес!) 6 қосылады, оның арқасында ондың мәннің нәтижесі дұрыс түрге қалыптастырылады;

- CF белгісі 1-ге орнатылады, келесі әрекеттер кезінде оны ескеріп отыру үшін  разрядтың үлкен бөлігіне тасымал болады.

Екі жинақталмаған BCD-сандарды қосуға мысал:

 

; Жинақталмаған BCD-сандарды қосу
len equ       2          ; сан разрядтылығы
b   db        1, 7      ; жанақталмағын 71 саны
c   db        4, 5      ; жинақталмағын 54 саны
sum           db        3 dup (0)
     ...
     xor   bx, bx
     mov  cx, len
m1:
     mov  al, b[bx]
     adс   al, c[bx]
     aaa
     mov  sum[bx], al
 

Мысалдағы BCD-сандардың енгізу тәртібі қалыпты түрге келтірілген яғни кіші разряд сандары кіші адреске орналасқан. Бірақ бұл бірнеше келесі себептерге байланысты:

біріншіден - мұндай тәртіп Intel микропроцессорларындағы жалпы деректерді беру принципін қанағаттандырады;

екіншіден - бұл жинақталмаған BCD-сандарды разрядтан өңдеу үшін ыңғайлы, өйткені олардың әр бірі бір байт орын алады.

Жинақталмаған BCD-сандарды азайту

AAS (ASCII Adjust for Substraction)командасы азайту нәтижесін символдық түрде беру үшін қалпына келтіреді. AAS командасының да операндтары болмайды және ол да AL регистрімен ғана жұмыс істейді және оның кіші тетрадасын тексереді:

- егер бұл мән 9-дан кіші болса, онда CF белгісі 0-ге орнатылады да келесі кездесетін командаға ауысу орындалады;

-   егер бұл мән 9-дан үлкен болса, онда AAS  командасы келесі әрекеттерді  жасайды:

- AL кіші тетрада құрамынан 6 алады;

- AL регистрінің үлкен тетрадасын нөлдейді;

- CF белгісі 1-ге орнатылады, ол арқылы үлкен разрядтан болатын несиені қадағалайды.

AAS командасы негізгі  SUB және  SBB азайту командаларымен бірге қолданылады.

 

b   db   1, 7                        ; жинақталмаған 71 саны 
c   db   4, 5                        ; жинақталмаған 54 саны
subs          db   2 dup (0)
     len    equ  2      ; сандар разрядтылығы
     …
     xor    ax, ax      ; ax тазалау
     xor    bx, bx
     mov  cx, len      ; cx санауыш циклын жүктеу
m1:
     mov  al, b[bx]
     sbb   al, c[bx]
     aas
     mov  subs[bx], al
     inc    bx
     loop  m1
     jc      m2                       ; несие белгісінің анализі
 

Жинақталмаған BCD-сандарды көбейту

Өлшемі анықталмаған сандарды көбейту үшін көбейту процесінқатар-қатармен алгоритмін пайдалануға болады. Екі бір разрядты BCD-сандарды көбейту үшін:

 - көбейткіштердің бірін AL регистріне орналастыру (MUL командасы сұрап тұрғандай);

 - ал екінші операндты регистрге немесе жады ұяшығына, алдын –ала қалдырылған орны болады;

 - көбейткіштерді MUL командасымен көбейтеміз (нәтиже AX регистрінде болады);

 - нәтиже әрине екілік кодта болады, сондықтан оны қалпына келтіреміз.

AAM (ASCII Adjust for Multiplication)командасы көбейту  нәтижесін символдық түрде беру үшін қалпына келтіреді. Бұл команданың операндтары болмайды  және ол  AХ регистрімен келесі түрде жұмыс істейді:

- AL–ді 10-га бөледі;

 - нәтижені былай жазады:

бөлінді AL, қалдық AH.

Нәтижеде AAM командасы орындалғаннан кейін AL және AH регистрлерінде дұрыс екілік-ондық екі санның көбейтіндісі  орналасады.

AAM командасын AL регистрінде берілген жинақталмаған BCD-санды екілік санға ауыстыру үшін қолдануға болады, ол АХ регистріне: санның үлкен нәтижесі AH-, ал кіші нәтижесі  AL-ге орналастырылады. Бізге белгілі екілік сандар 0...99 диапазонында болуы керек. 

Жинақталмаған BCD-сандарды бөлу

Екі жинақталмаған BCD-сандарды бөлу процесі басқаларға қарағанда бірнеше ерекшеліктері бар. Мұнда  қалыпқа келтіруді орындау керек, бірақ олар негізгі бөлу операциясына дейін орындалуы керек. Алдын-ала AX регистріне бөлінгіштің екі жинақталмаған BCD-сандарын алуымыз керек, ары қарай AAD командасын орындаймыз.

AAD (ASCII Adjust for Division) — командасы бөлу  нәтижесін символдық түрде беру үшін қалпына келтіреді. Бұл команданың операндтары болмайды  және жинақталмаған екі мәнді BCD-санды  AХ регистрімен екілік санға ауыстырады. Бұл екілік сан бөлу операциясы кезінде бөлінді рөлін атқарады. Ауыстырудан басқа AAD командасы  алынған екілік санды AL регистріне орналастырады. Бөлінгіш,  әрине екілік сан болады ол 0...99 диапазонынан алынады. 

AAD командасының ауысуды орындау алгоритмі келесі түрде болады:

- берілген BCD-санының үлкен санын AX-та 10 –ға көбейту (AH құрамын);

- AH + AL қосуын орындау, нәтижесін  (екілік сан)  AL регистріне орналастыру;

- AH регистрінің құрамын нөлдеу.

AAD                                   ; бөлуден бұрын орындалатын қалыпқа келтіру
DIV   C

AAD командасын 0...99 диапазонында берілген жинақталмаған BCD-санды екілік санға ауыстыру үшін қолдануға болады.

Жинақталған BCD-сандармен орындалатын арифметикалық операциялар

Жинақталған BCD-сандарды қосу

Жинақталмаған BCD-сандарды тек қосуға және азайтуға болады.

DAA (Decimal Adjust for Addition) — қосу нәтижесін ондық түрде беру үшін қалпына келтіру командасы. DAA командасы AL регистрінің құрамын екі жинақталған ондық сан түріне ауыстырады. Қосу нәтижесінде пайда болған бір санын  (егер қосу нәтижесі 99 санынан көп болса) CF белгісінде сақтайды, соның арқасында үлкен разрядқа болған тасымал ескеріледі.

 

b   db        17h                  ; жинақталған 17h саны
c   db        45h                  ; жинақталған 45  саны
     mov      al, b
     add      al, c
     daa
     jnc        $+4                  ; команда арқылы ауысу, егер нәтиже <= 99 үлкен болса
     mov      sum+1,ah         ; қосу кезіндегі тасымалды ескеру (нәтиже > 99)
     mov      sum, al             ; нәтиженің жинақталған кіші саны
 

Жинақталған BCD-сандарды азайту

Жоғарыда қарастырылған қосуға ұқсас, микропроцессор жинақталған  BCD-сандарды екілік сан ретінде қарайды және сәйкесінше,  BCD-сандарды азайтуды екілік сан түрінде жасайды.

Программалау кезінде жинақталмаған BCD-сандарды азайту кезінде санның таңбасын өзі қадағалау керек. Бұл CF белгісінің көмегімен орындалады, ол үлкен разрядтан келетін несиені қадағалайды. Ал BCD-сандарды азайтудың өзі кәдімгі SUB немесе SBB азайту командаларымен орындалады. DAS командасымен қалыпқа келтіру жүргізіледі:

DAS (Decimal Adjust for Substraction) — азайту нәтижесін ондық түрде беру үшін қалпына келтіру командасы. DAS командасы AL регистрінің құрамын екі жинақталған ондық сан түріне ауыстырады.

Бүтін сан операцияларын орындау үшін қосымшы командалар

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

Типті ауыстыру командалары

Арифметикалық операцияларда бір форматтағы операндтар қолданылуы керек. Әртүрлі өлшемдегі операндтармен арифметикалық операциялар орындау үшін микропроцессор командалар жүйесінде типті ауыстыру командалары деп аталатын командалар қолданылады. Бұл командалар байтты сөзге, сөзді — екілік сөзге және екілік сөзді — төрттік сөзге (64-разрядтық мәндер қолданылған кезде) ауыстырады. Типті ауыстыру командалары  әсіресе таңбасы бар бүтін  сандарды ауыстыру кезінде пайдалы, өйткені олар жаңадан құрылған операндтың үлкен биттерін ескі объект таңбасының мәнімен толтырып тастайды.

CBW - Команда  байтты сөзге ауыстырады.  AL регистрінің 7-ші битін АН регистріне жазып шығады.

CWD - Команда сөзді екілік сөзге ауыстырады.  АХ регистрінің 15-ші битін  DX регистріне жазып шығады.

CWDE  — Команда сөзді (ax регистрінде) екілік сөзге (еax регистрінде) ауыстырады. АХ регистрінің үлкен битінің мәнін ЕАХ регистрінің үлкен бөлігіне жазып шығу арқылы ауыстырады.

CDQ — Команда  екілік сөзді (eax регистрінде) төрттік сөзге (edx:eax регистрлерінде) ауыстырады. ЕАХ регистрінің үлкен битінің мәнін EDX регистрінің үлкен битіне жазып шығу арқылы ауыстырады.

Олар аралас деректермен жұмыс жасау үшін қолданылады.

 

cbw                        ;  AL –де байтты қосу

add      AX, BX       ; ВХ сөзімен

cbw                        ;  AL-де байтты көбейту

imul     BX              ; ВХ сөзімен

cwd                        ; AL-де сөзді бөлу

idiv      BX              ; ВХ сөзімен

 

Негізгі әдебиеттер: 8[111-120]; 9[105-143].

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

1.  Көбейту командасы орындалған кезде көбейтінді және нәтиже қайда орналасады?

2.  Бөлу командасы орындалған кезде бөлінгіш, бөлгіш және нәтиже қайда орналасады?

3.  Қалыпқа келтіру командаларын атаңыз?

4.  Типтерді ауыстыру командаларының қызметі?

5.  CMP және SUB командаларының ерекшеліктері?

 

8 Дәріс. Екілік разрядтармен жұмыс жасау командалары

 

Логикалық командалар

Логикалық командалар формальді логика тәртібі бойынша екілік разрядтармен жұмыс істейді. Логикалық командаларға AND (логикалық көбейту), OR (логикалық қосу),  XOR (модуль екі бойынша қосу),  NOT (логикалық терістеу),  TEST (логикалық тексеру) командалары жатады.

АND, OR, XOR  командаларының операндтары ретінде байт, сөз немесе екілік сөз болады. Бұл командаларда екі регистрді, регистр мен жады ұяшықтарын, тәуелсіз мән мен регистр құрамдарын қолдануға болады.

AND – логикалық байт немесе сөз өлшемі бар қабылдағыш және таратқыш операндтардың разрядтарын логикалық көбейту (конъюкция) ЖӘНЕ командасы.

Команда форматы:  AND қабылдағыш, таратқыш

Қабылдағыш, таратқыш операндтарына логикалық көбейту операциясын орындауды жүргізеді. Нәтиженің әр разряды 1-ге тең болады, егер осыған сәйкес операндтар разряды 1-ге тең болса, қалған жағдайда нәтиже разряды нөлге тең, операция нәтижесі қабылдағышқа жазылады.  Команда орындалғыннан кейін OF = CF = 0 болады, SF, ZF және PF белгілері өз мәнін өзгертеді.

OR - байт немесе сөз өлшемі бар қабылдағыш және таратқыш операндтардың разрядтарын логикалық қосу (дизъюкция) НЕМЕСЕ командасы.

Команда форматы: OR қабылдағыш, таратқыш

Нәтиженің әр разряды нөлге тең, операндтар разряды осыған сәйкес нөлге тең болса, қалған жағдайда нәтиже разряды бірге тең. Команда орындалғаннан кейін OF = CF = 0 болады, SF, ZF және PF белгілері өз мәнін өзгертеді.

XOR – логикалық «ТЕРІСКЕ ШЫҒАРУ».

Команда форматы: XOR қабылдағыш, таратқыш

Нәтиженің разрядтарының мәні 1-ге орнатылады, егер онда орналасқан разрядтардың мәні әртүрлі болса яғни қабылдағыш 1-ге және таратқыш 0-ге тең болған жағдай немесе керісінше. Егер екі операндта не 1-ге не 0-ге тең болған жағдай разряд нәтижесін 0-ге теңестіреді.

TEST логикалық тексеру (“test”-тексеру) командасы.

Команда форматы: TEST қабылдағыш, таратқыш

Команда операндтармен AND операциясын орындайды және тек белгілерді ғана өзгертеді, ал операндтарға тимейді. Команда орындалғаннан кейін OF = CF = 0 болады, SF, ZF және PF белгілері өз мәнін өзгертеді.

NOT - логикалық терістеу командасы.

Команда форматы: NOT-таратқыш

Команда таратқыш операндының барлық битттерін терістеу (инвертировать): 1-ден 0-ге, 0-ден 1-ге ауыстыруды орындайды. Команданың орындалуы ешқандай белгілерге әсер етпейді.

Жылжыту және циклдық жылжыту командалары

Жылжыту командаларының жеті түрін атап кетуге болады, олар  8-, 16- немесе 32- биттік регистр құрамын немесе жады ұяшығын бір орынға немесе бірнеше орынға солға не оңға жылжытуды орындайды. Олардың үшеуі операндты жылжытады, ал қалғандары оларды циклдық жылжытады немесе айналдырады. Барлық командалар үшін CF тасымал белгісі операнд кеңейтуі 9, 17 немесе 33 бит сияқты қолданылады. Ол жылжыған бит мәнін алады. Жылжыту командасы оңға жылжыған кезде CF-ке  0-ші битті орналастырады, ал солға жылжыған кезде 7, 15 немесе 31 битті орналастырады.

Командалар екіге бөлінеді. Логикалық командалар оның таңбасына қарамастан операндты жылжытады. Арифметикалық командалар операндтың таңбалық үлкен битін сақтайды.

Жылжыту командаларының жалпы форматы: ком қабылдағыш, санауыш

Жылжыту және циклдық жылжыту командаларының екі операнды болады: қабылдағыш және санауыш. Қабылдағыш ретінде  8, 16 немесе 32-биттік жалпы міндетті регистрлер немесе жады ұяшығы алынады. Санауыш ретінде тәуелсіз мән немесе  CL регистріндегі таңбасыз мән алынады.

SAL - арифметикалық солға  жылжу командасы.

SAR - арифметикалық оңға жылжу командасы.

Бұл командалар таңбалы сандарды жылжытады. SAR командасы операнд таңбасын сақтайды. SAL - командасы операнд таңбасын сақтамайды, бірақ операнд таңбасын өзгерткен кезде  OF асатолу белгісін 1-ге өзгертеді.

Әрбір жылжу болған сайын  SAL командасы бұл операндтың 0-ші битіне 0-ді қойып кетеді.

SHL – логикалық солға жылжу командасы.

SHR  – логикалық оңға жылжу командасы.

Бұл командалар таңбасыз сандарды жылжытады. SHL командасы SAL командасына ұқсас. SHR командасы SHL командасына ұқсас, бірақ оңға жылжытады. Әрбір жылжу болған сайын SHR командасы бұл операндтың үлкен биті (7 бит, 15 бит немесе 31 бит) 0 –мен толтырылады

Команда орындалғаннан кейін белгілердің күйі: OF, SF, ZF, PF, CF белгілері өзгереді.

Операндты солға бір битке жылжыту операнд мәнін екі еселейді  (2 көбейтеді), ал бір битке оңға жылжыту операнд мәнін керісінше екі есе кемітеді (2 бөледі), онда жылжыту командаларын жылдам көбейту мен бөлу командалары ретінде пайдалануға болады. SAL, SHL, SAR және SHR командаларының әрекеттері 7-суретте келтірілген.

 

7 сурет - Жылжыту командаларының жұмыс принципі

 

ROL - циклдің солға жылжу командасы.

ROR  - циклдің оңға жылжу командасы.

Бұл командалар орындалған кезде шекарадан шыққан операнд биті оған қарама-қарсы беттен кіреді.

RCL - тасымал белгісі арқылы циклдық солға жылжу командасы.

RCR - тасымал белгісі арқылы циклдық оңға жылжу командасы.

Бұл командалар орындалған кезде қарама-қарсы беттегі операнд битінің орнына CF тасымал белгісінің мәні орналасады.

Команда орындалғаннан кейін белгілердің күйі: OF, CF белгілерінің мәні өзгереді.

Командалардың жұмыс принципі 8-суретте көсетілген.

 

8 сурет - Циклдік жылжыту командаларының жұмыс принципі

 

Негізгі әдебиеттер: 8[112-120]; 9[110-143].

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

1.  Логикалық көбейту (AND) және  логикалық тексеру (TEST) командаларының айырмашылығы?

2.  Қандай логикалық команданың көмегімен байтың, сөздің немесе екілік сөздің биттерін терістеуге болады?

3. Арифметикалық жылжыту командаларын атаңыз.

4. Логикалық жылдыту командаларын атаңыз.

5. Циклдық жылжыту командаларын атаңыз.

 

  9 Дәріс. Тізбекті командалар. Үзу командалары. Микропроцессорды басқару командалары

 

Тізбекті командалар

Бұл командаларды сондай-ақ символдық жолдарды өңдеу командасы деп те атайды. Тізбекті командалар жадыдағы байт, сөз немесе екілік сөз блогтарымен жұмыс жасауға мүмкіндік береді. Бұл блоктар (немесе жолдар)  сандық мәндер (екілік немесе екілік-ондық мәндер), алфавитті-сандық мәндер (ASCII кодтағы символдар коды), сондай-ақ басқа да жадыда екілік кодта сақтала алатын кез-келген мәндерден тұрады.

Тізбекті командалардың негізі бес примитив деп аталатын операцияны орындайтын мүмкіндіктері бар, олар жолды бір элементтеп (байт, сөз немесе екілік сөз) бір қабылдау кезінде өңдейді. Әрбір примитив үш командамен көрсетілген. Бір команданың бір немесе екі операнды бар, ал қалған екі команданың операндтары жоқ. Микропроцессор қабылдағыш-жол қосымша сегментте орналасқан, ал таратқыш-жол деректер сегментінде орналасқан деп болжайды. Микропроцессор қабылдағыш-жолды  қабалдағыштың DI (EDI) индекс регистрі арқылы, ал таратқыш-жолды  таратқыштың SI (ESI) индекс регистрі арқылы жібереді.

Символдар жолын өңдеу командалары элементтер тобымен жұмыс істейтін болғандықтан, олар келесі орындалатын элементті автоматты түрде адрестейді.

Микропроцессордың белгілер регистрындағы DF бағыт белгісі SI және DI регистрлерінің мәні жолдарды өңдеу командасы орындалуын аяқтағаннан кейін көбейетіндігін немесе азаятындығын анықтап отырады. Егер DF белгісі нөлге тең болса, онда  SI және DI регистрлерінің мәні көбейеді, егер  DF белгісі бірге тең болса, онда азаяды.

Жолдарды өңдеудің бір командасы жадыдағы тізбектей орналасқан элементтер тобын өңдесін делік. Ол үшін бұл команданың алдынан қайталау префиксін қолдану керек. Префикс команда емес, бірақ микропроцессорға жолдарды өңдеу командасын аппаратты түрде қайталауын орындатады.

Қайталау префикстері

Микропроцессор қайталау префикстері тізбекті командаларды қайталап орындатуды жалғастырады. Қайталау саны СХ (ECX) регистрінен алынады.

REP префиксі - жолдың соңы табылғанға дейін қайталау керек екендігін білдіреді яғни СХ регистрінің мәні нөлге тең болғанға дейін қайталайды.

Ал қалған қайталау префикстері қайталау керек пе, жоқ па екендігін белгілер регистріндегі ZF нөлдік белгіге байланысты орындайды.

Сәйкесінше, олар жолдарды салыстыру және жолдардағы мәндерді іздеу командаларымен бірге қолданылады, олар ZF нөлдік белгіге әсерін тигізеді.

REPE префиксі (тең болғанға дейін қайтала), REPZ префиксі (нөл болмағанша қайтала), команданы ZF нөлдік белгі мәні 1-ге және СХ регистрінің мәні 0-ге тең емес болғанға дейін қайталайды. REPNE префиксі (тең болмағанша қайтала), REPNZ префиксі (нөл болмағанша қайтала), команданы ZF нөлдік белгі мәні 0-ге және СХ регистрінің мәні 0-ге тең емес болғанға дейін қайталайды.

Жолдарды өңдеу командалары

MOVS символдық жолдарды алып-орналастыру командасы.

Команда форматы:  MOVS қабылдағыш_жол, таратқыш_жол

Команда  байтты, сөзді немесе екілік сөзді деректер сегментінен қосымша сегментке орналастырады.

Микропроцессор SI (ESI) таратқыш индекс регистрін деректер сегментінде адрестеу үшін және DI (EDI) қабылдағыш индекс регистрін қосымша сегментте терістеу үшін қолданады. SI (ESI) регистріне сәйкес сегменттерді ауыстыруға болады, DI (EDI) регистріндегі сегменттер ауыспайды. Бірақ қосымша сегменттегі жолдарды бір жерден екінші жерге көшіруге болады. MOVS командасы бір ғана элементті алып-орналастырады, бірақ REP префиксінің көмегімен 64  Кбайт өлшеміндегі деректерді алып-орналастыра алады (егер  сегменттегі адрес өлшемі 16 бит — use16 болса) немесе 4 Гбайт-қа дейінгі деректер (егер сегменттегі адрес өлшемі 32 бит - use32 болса). МOVS командасымен орындалатын топтық алып-орналастыру келесі бес қадам бойынша орындалады:

1) DF бағыт белгісін нөлдейді немесе оны кіші адрестерден үлкен адрестерге, әйтпесе керісінше ауысу болатындығына байланысты орналастырады;

2) таратқыш_жол адресінің ығысуын LEA командасын қолданып SI (ESI) регистріне жүктейді:

LEA SI, таратқыш_жол

3) қабылдағыш_жол адресінің ығысуын DI (EDI): регистріне жүктейді:

LEA DI ES:қабылдағыш_жол

4) элементтер санауышын  СХ  регистріне жүктейді:

MOV CX,100

5) REP префиксі бар MOVS командасын орындайды:

REP MOVS қабылдағыш_жол, таратқыш_жол

Программа қабылдағыш_жол орналастыратын қосымша сегменттен және  таратқыш_жол орналастыратын деректер сегментінен тұруы керек. Әдетте қабылдағыш_жол үшін жады келесі түрдегі директивамен резелфтеледі:

қабылдағыш_жол  DB    100 DUP

Егер қабылдағыш және таратқыш жолдары DB директивасының көмегімен анықталған болса, онда ассемблер MOVS командасын MOVSB, егер DW – MOVSW және егер DD – MOVSD командаларына ауыстырады.

MOVSB – байт жолын ауыстыру.

MOVSW – сөз жолын ауыстыру.

MOVSD – екілік сөз жолын ауыстыру.

Бұл командаларда операндтар болмайды.

Әдетте SI (ESI) регистрі деректер сегментіне адрестеледі, бірақ сегментті ауыстуру префиксінің көмегімен  таратқыш_операнды ретінде басқа сегментті қолдануға болады. Мысалы:

LEA SI, ES: таратқыш_жол           ; таратқыш_жолды көшіреді

LEA DI, ES: қабылдағыш_жол                  ; қабылдағыш_жолға

Екі жолда қосымша сегментте орналасқан. Егер екі жолда деректер сегментінде орналасқан болса, онда келесі командаларды пайдалану керек:

PUSH DS

POP ES

Жолдарды салыстыру командасы

CMPSжолдарды салыстыру.

Команда форматы: CMPS қабылдағыш_жол, таратқыш_жол

Таратқыш-операндын  қабылдағыш-операндымен салыстырады және нәтижені белгілер арқылы қайтарады. Командалар операндтар мәнін өзгертпейді. Қабылдағыш_жол - SI (ESI) регистрімен адрестеліп деректер сегментінде, таратқыш_жол - DI (EDI) регистрімен адрестеліп қосымша сегментте орналасады.

CMPS командасы операндтарды оларды бір-бірінен азайту арқылы салыстырады. Ол қабылдағыш-операндынан таратқыш-операндын  азайтады. Бірнеше элементтерді салыстыру үшін CMPS командасы REPE (REPZ) немесе REPNE (REPNZ) префикстерімен қолданылады. DF бағыт белгісі элемент адрестерін өңдеуді өсу ретіне (DF нөлге тең) немесе кему ретіне (DF бірге тең) байланысты анықтайды, ал SI (ESIжәне DI (EDI) регистрлері сәкесінше әрбір операциядан кейін өзгереді.

Салыстыру нәтижесін тексеру операцияларды қайталау арқылы орындалады. Салыстыруды қайталау операциялары екі жағдайда аяқталуы мүмкін: егер  СХ регистрінің мәні 0-ге тең болса немесе ZF нөлдік белгі 0-ге тең болса (REPE) немесе 1-ге тең болса (REPNE). Салыстыруды тоқтату не үшін болғандығын тексеру үшін CMPS командасын шартқа байланысты ауысу командасымен бірге қолданған дұрыс, олар ZF белгісінің мәнін тексеріп отырады, оның ішінде JE (JZ) немесе JNE (JNZ) командаларын қолдану керек. Ассемблер CMPS командасын CMPSB командасына (байттарды салыстыру кезінде), CMPSW командасына (жолдарды салыстыру кезінде) немесе CMPSD командасын (екілік жолдарды салыстыру кезінде) ауыстырады.

Жолдарды  іздеп-табу командасы

Бұлар қосымша сегментте орналасқан жолдағы белгілі бір мәнді іздеуді орындайды. Жолдағы бірінші элемент адресінің ығысуы DI (EDI) регистріне орнатылуы керек. Жолдарды іздеп-табу кезінде ізделетін элемент AL регистрінде, сөз болса – АХ регистріне, ал екілік сөз болса – EАХ регистріне орналастырылуы керек.

SCASжолды іздеп-табу командасы.

Команда форматы: SCAS қабылдағыш_жол

Әрекеттерді бірнеше рет қайталау, бірнеше элемент іздеу  үшін  REPE (REPZ) немесе REPNE (REPNZ) префикстері қолданылады. Егер жолдан іздеп отырған элемент табылса, онда келесі ізделетін элементтің адресінің ығысуы DI (EDI) регистріне қайтарылады, ал ZF нөлдік белгісі 0–ге тең деп есептелінеді. Ассемблер SCAS командасын  SCASB командасына (байтты іздеу кезінде), әйтпесе SCASW командасына (сөзді іздеу кезінде), әйтпесе SCASD командасына (екілік сөзді іздеу кезінде) ауыстырады.

Жолдарды жүктеу және сақтау командасы

LODS – жолды жүктеу.

Команда форматы: LODS таратқыш_жол

LODS командасы деректер сегментінен SI (ESI) регистрімен адрестелген таратқыш-операндты AL регистріне (байтты орналастыру кезінде), АХ регистріне (сөзді орналастыру кезінде), немесе EАХ  регистріне (екілік сөзді орналастыру кезінде) орналастырады, одан кейін SI (ESI) регистрін жолдағы келесі элементті көрсететіндей етіп өзгертеді. Оның мәні өседі, егер DF бағыт белгісі 0-ге тең болса немесе, егер DF бағыт белгісі 1-ге тең болса, онда кемиді.  LODS командасы  LODSB командасына (байт жолын жүктеу), LODSW  командасына (сөз жолын жүктеу) және LODSD командасына (екілік сөз жолын жүктеу) ауысады.

STOS – жолдарды сақтау.

Команда форматы: LODS қабылдағыш_жол

STOS командасы қосымша сегментте орналасқан DI (EDI) регистрімен адрестелетін, AL регистріндегі байтты, АХ регистріндегі сөзді немесе EАХ регистріндегі екілік сөзді қабылдағыш_жол операндына орналастырады және DI (EDI) регистрінің мәнін келесі жолдағы элементті көрсететіндей етіп ауыстырады. Бұл мән өседі, егер DF бағыт белгісі 0-ге тең болса немесе егер DF бағыт белгісі 1-ге тең болса, кемиді. STOS командасын берілген мәнмен жолдарды толтыруды орындаған ыңғайлы.

Үзу командалары

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

Үзу барлық өз программасын өңдеу кезінде жанама өтуді үзу векторының 32-биттік адресін алу үшін пайдаланады. Стекте үзу адресін және белгілерді сақтайды. Үзілер жүйенің сыртқы құылғысынан немесе арнайы программада колданылатын үзулерден пайда болуы мүмкін. Үзу командаларының үш түрі кездеседі – екі шақыру командасы және бір қайту командасы.

INTүзу командасы.

Команда форматы: INT  үзу_типі

Үзу типі бұл нөмір, жадыда орналасқан 256 әртүрлі векторларды өңдейді.

INT командасын орындаған кезде микропроцессор келесі әрекеттерді орындайды:

1) Белгілер регистрінің мәнін стекке орналастырады;

2) OF трассировка белгісін және IF үзуді өшіру/қосу белгісін нөлдейді;

3) CS регистрінің мәнін стекке орналастырады;

4) Үзу векторының адресін, үзу типін 4 көбейту арқылы анықтайды;

5) Үзу векторының екінші сөзін CS регистріне жүктейді;

6) IP команда көрсеткіші регистрінің мәнін стекке орналастырады;

7) IP команда көрсеткіші регистріне үзу векторының бірінші сөзін жүктейді.

INT командасы орындалғаннан кейін IP белгісінің және CS регистрінің мәндері стекте болады. TF  жүйелік үзу белгісі және  IF үзуі 0-ге тең болады. CS және IP регистрлер тобы үзуді өңдеу программасының бастапқы адресін көрсетеді. Одан кейін микропроцессор ол программаны орындауды жүргізеді.

INTO – асатолу болған кездегі үзу командасы. Ол шартты үзу командасы. Бұл команда үзуді тек  OF асатолу белгісі 1-ге тең болған кезде орындайды.

IRETүзуден кейін қайту командасы. Бұл команданың да жұмыс принципі RET процедурадан қайту командасына ұқсас. Сондықтан ол микропроцессороммен үзуді өңдеу  программасы орындалып болғаннан кейін қолданылады. IRET командасы стектен 16 биттік үш мәнді шығарады және оларды IP команда көрсеткіші регистріне, CS  регистріне және белгілер  регистріне орналастырады.

Микропроцессорды басқару командасы

Бұл командалар программадан микропроцессор жұмысын басқаруды орындайды. Олар үш топқа бөлінеді.

Белгілерді басқару командалары

Микропроцессордың  CF тасымал белгісін, DF бағыт белгісін және IF үзу белгісін өзгертетін жеті командасы.

STC – Тасымал белгісін орналастыру командасы яғни CF белгісі 1-ге тең болады.

CLC -Тасымал белгісін нөлдеу командасы яғни CF белгісі 0-ге тең болады.

Бұлар керекті CF белгісінің күйін орнату үшін немесе осы тасымал белгісін пайдаланатын RCL және RCR командаларын қолданғанда және циклдық жылжыту командаларын қолданғанда орындалады.

CMC - Тасымал белгісін терістеу командасы яғни CF белгісі 0-ге тең болса 1-ге немесе керісінше ауыстырады.

STD – Бағыт белгісін орнату командасы яғни DF белгісін 1-ге тең болады.

CLD –Бағыт белгісін нөлдеу командасы яғни DF белгісін 0-ге тең болады.

Бұл командалар жолдарды өңдеу бағытын көрсету үшін қолданылады. Егер DF бағыт белгісі 0-ге тең болса, онда жолдармен жүргізілетін әрбір операциядан кейін SI және DI индекстік регистрлерінің мәні өсіп отырады, егер  DF бағыт белгісі 1-ге тең болса, онда кемиді.

CLI Үзу белгісін нөлдеу командасы. IF үзу белгісін 0-ге теңестіреді, жүйенің сыртқы құрылғысынан түсетін үзулерді қалқалап, микропроцессор ол үзулерге көңіл бөлмеу үшін қоланылады. Бірақ қалқаланбаған үзулер өңделе береді. Бұл үзулер жады ұяшығындағы қателерді беретін хабарламалардан тұрады.

STIҮзу белгісін орнату командасы. IF үзу белгісін 1-ге теңестіреді, жүйенің сыртқы құрылғысынан түсетін үзулерді микропроцессор өңдейді.

Сыртқы синхронизация командасы

Бұл командалар негізінен микропроцессор жұмысының сыртқы жағдайлармен  синхронизациясы үшін қоланылады.

HLTТоқтату командасы. Микропроцессорды тоқтату күйіне орнатады.

WAITКүту командасы. Микропроцессорды бос жүру күйіне орнатады.

ESC - "Қашу" командасы. Микропроцессорды онда орналасқан операнд мәнін алып оны деректер машинасына беруді орындайды, ол арқылы ол басқа микропроцессорларға өз командалар ағымынан командаларды  қолдануға мүмкіндік береді.

Команда форматы: ESC сыртқы_код, таратқыш

Сыртқы_код бұл  6 биттік тәуелсіз операнд, таратқыш - регистр немесе айнымалы.

Жалқы жүре командасы

NOP – операция жоқ.  Бұл команда белгіге де, регистрге де, жады ұяшығына да ешқандай әсер етпейді, тек IP команда көрсеткішін мәнін өзгертеді.

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

 

Негізгі әдебиеттер: 9[128-140]; 10[130-153].

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

1.     Тізбекті командалар өңдей алатын жолдың максимальді өлшемі қандай?

2.     Қайталау префикстерінің түрлері және қызметі?

3.     Тізбекті команда примитивтері. Тізбекті командалардың форматы.

4.     ІNT  командасын орындаған кездегі микропроцессор әрекеті.

5.     Тек команда көрсеткішінің мәнін өзгертетін команда.

 

10 Дәріс. Ассемблер директивалары

 

Ассемблер тіліндегі программа операторлардан тұрады. Оператор ретінде командалар, макрокомандалар және директиваларды қолдануға болады.

Директивалар ассемблерлеу процесін басқарады және машиналық кодты генерацияламайды.

Сегментті анықтайтын директивалар

Программа бөлек сегмент түрінде жасалады және оның ішінде мәліметтер, стек, шартбелгілер  және  қосымша сегменттері кіреді. Сегментті сипаттаған кезде басы SEGMENT нұсқауымен, ал соңы ENDS нұсқауымен белгіленеді. Сегмент келесі форматта си­патталады:

Аты SEGMENT [теңестіру_түрі] [біріктіру_түрі] [класс]

. . .

Аты ENDS

Теңестіру_түрі сегмент басының шекарасын табады және келесі тағайындаудың бірін алуы мүмкін:

BYTE - сегмент кез келген адрестен басталады;

WORD - сегмент екіге бөлінетін (ххх0b) адрестен басталады;

DWORD - сегмент төртке бөлінетін (хх00b) адрестен басталады;

PAPA - сегмент параграф адресінің шекарасынан басталады, 16-ға бөлінетін (ххх0h) үнсіздікпен қолданылады.

PAGE - сегмент 256-байттық бет адресінің 256 бөлінетін (хх00h) шекарасынан басталады;

MEMPAGE сегмент 4 Кбайтқа бөлінетін (х000h) адрестен басталады.

Біріктіру түрі берілген  сегмент  қарастыру кезінде басқа сегменттермен біріктіруін анықтайды. Келесі біріктіру түрлері қолданылады:

PRІVАТЕ – сегмент берілген модульден тыс басқа атпен берілген басқа сегмент топтарымен бірікпейді, үнсіздікпен қолданылады;

PUBLІC – бір атпен берілген сегменттерді біріктіреді, біріктірген сегменттің ұзындығы біріктірілген сегменттердің қосылған ұзындығына тең;

COMMON – бір атпен берілген сегменттерді бір адреске біріктіреді. Бұл атпен берілген сегменттер бірін–бірі жабады және жадыны бірге қолданады, біріктірген сегменттің ұзындығы қосылған сег­менттердің ең үлкен ұзындығына тең;

STACK – стек сегментін анықтау. Жөндеуішті бір атпен берілген сегменттерді қосуға мәжбүр етеді және бұл сегменттердің адресін SS регистріне сәйкес анықтайды. Сегменттің ұзындығы біріктірілетін сегменттердің қосындысына тең;

MEMORY - кодтар сегментінен кейін орналасқан деректер сегментін шақырады. Сегменттің өлшемі COMMON біріктіруіне ұқсас анықталады;

АТ_ПАРАГРАФ - берілген операнд бекітілген адрестер бойынша таңбалар мен айнымалыларды анықтауды  қамтама­сыз етеді.

Мысалы, экрандық видеобуфер адресін анықтау үшін:

VІDEO-RAM SEGMENT AT OB800h қолданылады.

Класс апострофқа алынған, берілген операнд құрастыру кезінде топтау  үшін  қолданылады«Класс»  операнды  ретінде 'STACK','CODE','DATA' аталымдарын пайдалануға болады.

Сегмент өлшемінің типі  і80386 және одан жоғарғы микропроцессорлар сегменттері 16 немесе 32 разрядтық болады. Бұл негізінен біріншіден сегмент өлшеміне және оның ішіндегі физикалық адрестің қалыптастырылу тәртібіне әсер етеді. Сегмент өлшемдерінің келесі типтері қолданылады:

USE16 — бұл сегмент 16 разрядтық адрестеуді қолданатындығын білдіреді. Физикалық адресті қалыптастыру кезінде 16 разрядтық ығысу қолданылады. Сәйкесінше, мұндай сегмент 64 Кбайт кодтар сегментінен немесе деректер сегментінен тұрады;

USE32 — бұл сегмент 32 разрядтық адрестеуді қолданатындығын білдіреді. Физикалық адресті қалыптастыру кезінде 32 разрядтық ығысу қолданылады. Сәйкесінше, мұндай сегмент 4 Гбайт кодтар сегментінен немесе деректер сегментінен тұрады.

Сегментті анықтаудың қысқашы  директивалары:

.CODE [аты]                          ;Код сегментінің басы немесе жалғасуы

.DATA                                     ;Инициализацияланған деректер сегментінің басы немесе жалғасы. Сондай-ақ, near типіндегі деректерді анықтау үшін қолданылады.

.CONST                         ; Модульдің тұрақты деректерінің (тұрақтыларының) сегментінің басы немесе жалғасы

.DATA?                         ;Инициализацияланбаған деректер сегментінің басы немесе жалғасы. Сондай-ақ, near типіндегі деректерді анықтау үшін қолданылады.

.STACK[өлшемі]          ;Модуль стек сегментінің басы немесе жалғасы. Параметр [өлшем] стек өлшемін береді

.FARDATA[аты]           ;Инициализацияланған far типтегі деректер сегментінің басы немесе жалғасы

.FARDATA[аты]           ;Инициализацияланбаған far типтегі деректер сегментінің басы немесе жалғасы

Процедураны анықтау директивалары

Программа бір немесе бірнеше процедурадан тұрады.  Проце­дураны сипаттаған кезде басы PROC нұсқаумен, ал соңы ENDP нұсқауымен беріледі. Процедура келесі пішімде беріледі:

Процедура_аты PROC [ара қашықтық атрибуты]

...

RET Процедура_аты ENDP

Ара қашықтық атрибуты ретінде FAR(алыс) және NEAR(жақын) опе­рандтары қолданылады.

FAR  ара  қашықтық  атрибутын қолданған кезде процедураға жүгінуді басқа программалық сегменттен жүзе­ге асырылады, ал NEAR атрибутын пайдаланғанда тек өзі сипат­талған сегменттен жүзеге асырылады. RET командасы процедурадан қайта оралуды орындайды. Процедуралар қабаттасуы мүмкін. Қабаттасу деңгейі тек стек сегментінің өлшемімен шектеледі.

ASSUME директивасы

Нұсқау ASSUME Ассемблерге қандай программалық сегменттер программаға жататындығын хабарлайды және сегменттер адрестерін шарт белгілер мен стек сегменттері үшін енгізеді. Қосымша сегмент және деректер сегменті үшін сегменттік адрес­терді енгізуді прогаммалаушы қамтамасыз етеді.

ASSUME нұсқауы шартбелгілер сегментінде келесі түрде сипатталады:

ASSUME SS:стек_аты, DS:деректер_аты, CS:шартбегілер_аты, ES:қосымша_аты

Егер программа қайсыбір сегментті қолданбаса, онда оны көрсет­пей кетуге болады немесе NOTHІNG көрсету қажет.

Мысалы:

ASSUME SS:SSEG, DS:DSEG, CS:CSEG әлде

ASSUME SS:SSEG, DS:DSEG, CS:CSEG, ES:NOTHІNG

Содан да басқа NOTHІNG арқылы сегменттік регистрдің тағайындауын қайтарып тастауға болады.

Программаны аяқтайтын END директивасы

Нұсқау END Ассемблерге қай жерде аяқтау керек екенін хабарлайды және келесі түрде сипатталады:

END [енгізу-белгісі]

Енгізу-белгісі қызметінде негізгі процедураның аты, әлде программаның басының белгісі қолданылады.

Мәліметтерді анықтайтын директивалар

Мәліметтерді анықтау үшін келесі нұсқаулар қолданылады:

DB - байт анықтау;

DW - сөзді анықтау;

DD - қос сөздерді анықтау;

DQ - 8 байтты немесе 4 сөзді анықтау;

DT - 10 байтты анықтау.

Мәліметтерді анықтау нұсқаулардың форматының  түрі:

[аты] Dn оқылуы

Осыған байланысты оқылуда мыналар қолданылады:

-   тұрақты;

-    кесте, массив немесе жол;

- символдық жол.

Тұрақты

Мәліметтерді анықтау нұсқаудың көмегімен айнымалыны тұрақты түрінде беруге болады:

A DB 10

Егер айнымалы DD нұсқауы көмегімен жазылса немесе бастапқы  мәнін  көрсетпей,  еске сақтау жадыдан орын алуға болады.

A DD 10203040H, ал бізге нақты байт керек болса, онда оған келесі түрде жүгінуге болады:

MOV AL,byte ptr A                    ;AL=40H

MOV AL,byte ptr A+2;AL=20H

Нақты бір сөзге жүгіну үшін:

MOV AX,WORD PTR A                     ; AX=3040H

MOV AX,WORD PTR A+2                 ; AX= 1020H

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

ADR_NEAR DW MAІN

DD нұсқауының көмегімен жадыда белгі мен процедураның (вектор) толық адресін жазуға болады:

ADR_FAR DD MAІN

Кесте

Кестені жазу кезінде, кестедегі элементтер үтір арқылы жазылады:

TAB DB 10, 20, 30, 40, 50

немесе тек еске сақтау жадыдан кестеге орын алуға болады:

TAB DB 5 DUP (?)

Бұл жерде кестедегі әр элемент 1 байт көлемінде орын алады.

Бұл жағдайда кесте10 байт орын алады. Әр элементке 2 байт немесе сөз. Оператор DUP қайталау операциясын жүргізеді. Таблицаның элементтеріне жүгінгенде, оның өлшеміне қарамастан, кіші байт элементі жүреді.

Мысалы:

MAS DW 1122H, 3344H, 5566H, 7788H

мұндағы нөлдік сөздің адресі бойынша 22h мәнімен анықта­лады санау нөлден басталады.

MAS - байттың  адресі 22h мәні бойынша

MAS + 1 - байттың адресі 11h мәні бойынша

MAS + 2 - массивтің бірінші сөзінің адресі

MAS + 4  - массивтің екінші сөзінің адресі

Символдық жол

DB нұсқауының көмегімен еске сақтау құрылғысында кез келген мәтінді сақтауға болады. Тырнақшаға алынған кез-келген символдар, символдық   жол   болып   келеді.   Еске   сақтау құрылғысында әр символ ASCІІ-шарт белгіде жазылады.

 Мысалы: STR DB 'символдық жол'

Анықтағышты анықтайтын директивалары

Анықтағышты анықтайтын директиваларға келесі нұсқаулар кіреді:

EQU және =

Бұл директивалар деректерге аталымдар меншіктейді және жадтағы орынды алмайды. Келесі пішім қолданылады:

аты EQU өрнек

аты  =  сандық өрнек

EQU директивасының = айырмашылығы мынада: = директивасы­ның көмегімен сандық өрнекті ауыстыруға болады. Ал EQU дирек­тивасының көмегімен тұрақтыға, регистрге, адрес комбинацияларына аталымды меншіктеуге, синонимді анықтауға болады.

Сыртқы сілтеме директивалары

Сыртқы сілтеме директиваларға келесі директивалар кіреді: PUBLІC, EXTRN және ІNCLUDE.

PUBLІC директивасы берілген идентификатор басқа программалық модульдерден қалай алынғанын көрсетеді. Идентификатор есебінде айнымалы, белгі, тұрақтыны қолдануға болады. Директива келесі пішім түрінде болады:

PUBLІC идентификатор [,...]

Мысалы:

PUBLІC A

DSEG SEGMENT

A DW 1020H

DSEG ENDS

EXTRN директивасы жариялайды, берілген программалық модульде аттар қолданыла­ды. Директива EXTRN пішімі :

EXTRN аты:түрі [,...]

Аты қызметінде айнымалылар, белгілер, тұрақтылар қолданы­лады.

Егерде аты айнымалы болып келсе және деректер сегментінде сипатталса, онда түрі мынадай мән қабылдай алады: WORD, DWORD, BYTE. Егерде аты белгі болып келсе, онда түрі мынадай мән қабылдайды: FAR немесе NEAR. Егерде аты тұрақты болып келсе және EQU директивасының көмегімен сипатталса немесе = , онда түрі ABS мәнін алады.

ІNCLUDE директивасы аудармалау кезінде программа­ға директивада көрсетілмеген файлдың мәтінін енгізеді. Дирек­тиваның пішімі:  ІNCLUDE файл_аты

Листингіні  басқару  директивалары

Оларға PAGE, TІTLE және SUBTTL директивалары жатады.

PAGE директивасы листинг бетінің өлшемін береді. PAGE директивасы мынадай пішім түрінде жазылады: PAGE [ жол][,бағана]

Жолдардың саны 10 - 255 дейінгі аралықта өзгертіледі.

Бағана жолдағы символдар санын көрсетеді және 60 - 132 дейінгі аралықта өзгереді. Аталмаған жағдайда беттердің өлшемі тағайындалады, бір жолға 80 символды 66 жол.

PAGE директивасы операндсыз беттерді жылдам ауыстырады.

TІTLE ди­рективасы әр беттің жоғарғы жағында программаның бастамасын жазады. TІTLE директивасының пішімі келесі түрде болады: TІTLE мәтін

Мәтінің максималды ұзындығы - 60 символ.

SUBTTL директивасы бастамадан кейінгі келесі жолда ішкі бастаманы жазады. Оның форматы:  SUBTTL мәтін

 

Негізгі әдебиеттер: 8[150-200]; 10[201-203].

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

1.      DW, DD директиваларының көмегімен анықталған деректер жадыға қалай орналасады?

2.      SEGMENT директивасының аргументтері?

3.      Сыртқы сілтеме директивалары не үшін қолданылады?

4.      Файлды қосу директивасы?

 

11 Дәріс. Программаларды ұйымдастыру. Макроанықтағыштар. Көпмодульдік программаларды ұйымдастыру

 

Қиын программалық кешендерді өңдеу кезінде өз еркінше аударылатын, кейбір процедура бөліктерін  бөлек орындалатын модульдерге бөліп орналастырған ыңғайлы болады.

Аударғыштан кейін бұл процедуралардың объектік модульдері объектік кітапхана құрамына кіруі мүмкін, олар негізгі программаға құрастыру кезіңінде қосылады. Мұндай программалық кешеннің құрылымы келесідей түрде болады:

 

; MAІN. ASM – негізгі процедура орналасқан файл

text          segment     publіc ` code `

               extrn         sub:proc               ; sub – сыртқы сілтеме

mymaіn   proc

               …

               call           sub                       ; тікелей жақын шақыру

               …

mymaіn   endp

text          ends

               end           mymaіn                ; mymaіn – негізгі процедураға кіру нүктесі

; MYSUB.ASM – бағыныңқы программа орналасқан файл

text          segment     publіc  ` code `

               publіc       sub                       ; sub -  "жалпы қолданылатын" процедура

sub          proc          near                     ; жақын процедура

               …

               ret

sub          endp

text          ends

               end                                        ;кіріс нүктесінсіз

 

Бұл екі орындалатын модульдердің программалық сегменттерінің аттары бірдей text, құрастырушы оларды бір сегментке біріктіріп жібереді. Бұлардың біріктіру типі PUBLІC - бірін-бірі жабуды тіркестіруді анықтайды яғни екінші модульді бірінші модульдің аяғына біріктіреді (стек сегментінде қолданылатын STACK типі де осылай қолданылады, ал COMMON типіндегі біріктіру құрастырушыдан оларды бірін-бірі жабу әдісін орындауды жасайды).

Бастапқы модульдегі EXTERN директивасы sub символдық белгіленуінің сыртқы сілтеме болып табылатындығын және процедура атын көрсететіндігін анықтайды. Сыртқы сілтеме құрастыру кезеңінде шешіледі.

Басқа программалық модульдерден шақырылатын процедура PUBLІC директивасының көмегімен "жалпы қолдану" процедурасы ретінде қаралуы керек. Бұл жағдайда олардың аттары объектік модульге аударғыштың көмегімен жазылады, ол құрастырушыға оларға келетін сілтемелерді шешу үшін қажет.

Келтірілген мысалдағы программалық модульдер қосылғаннан кейін бір команда сегментін құрады деп есептеледі яғни олардың қосылғандағы өлшемі  (машиналық кодта) 64 Кбайттан аспайды деп алынады. Сондықтан процедура - бағыныңқы программаға жақын (near)  деп хабарланып кетеді, ал бастапқы процедурада тікелей жақын шақыру командасында қолданылған.

Бағыныңқы программасы бар модуль  параметрі жоқ END аяқтау директивасымен бітедікөпмодульдік программалық кешендерде бастапқы процедура орналасқан модуль ғана бастапқы процедураның кіріс нүктесі көрсетілген END аяқтау директивасымен бітеді.

MAІN.ASM  және  MYSUB.ASM файлдары орындалатын мәтін кешенінің құрауыштарын бірге аударып, одан кейін бір жүктейтін модульге біріктіреді:

MASM MAІN, MAІN, MAІN;

MASM MYSUB, MYSUB, MYSUB;

LІNK MAІN + MYSUB, PROG;

Аударғыш нәтижесінде келесі файлдарды аламыз MAІN.OBJ, MAІN.LST,  MYSUB.OBJ және MYSUB.LST; құрастырушы MAІN.OBJ және MYSUB.OBJ  модульдерін біріктіреді және жүктейтін  (орындалатын  модуль) PROG.EXE –ні құрады.

Көпмодульдік программалық кешенді өңдеу процедурасының басқа варианты - MYSUB. OBJ программалық модульін, объектік модульдер кітапханасына, құрастырушы одан кейін оны ала алатындай етіп орналыстыру. Кітапхананы әртүрлі программалық кешендерде қолданылатын көп мөлшердегі объектік модульдерді қолданған кезде пайдаланған жөн. Бұл жағдайда MYSUB. ASM файлының аударғышынан кейін MYSUB.OBJ объектік файлы пайдаланушымен құрылатын объектік файлдар кітапханасына жазылады. Обьектілер кітапханасын құрған бағыныңқы программалары бар объектік модульдер келесі түрде орындалады:

LІB MYOBJ. LІB + MYSUB. OBJ, MYOBJ.LST

Бұл командадағы LІB – кітапханашы программасының аты, MYSUB.OBJ – кітапханаға орналастырылатын объектілік файл аты, ал MYOBJ.LST – кітапхана каталогымен құрылатын файл аты.   Модуль атының алдындағы ` + ` белгісі бұл модульді кітапханаға қосу керектігін білдіреді (`–` белгісі керісінше модульді жояды).  MYOBJ. LST файлына кітапхана бөлімдері орналасады.

Каталогы бар файл кеңейтуінен басқа, барлық кеңейтулерді жазбай кетсе де болады, өйткені үнсіздікпен де осы мысалда көрсетілген кеңейтулер алынады.

Егер объектілік кітапхана бар болса және оған басқа құрылған объектік модульдерді қосқымыз келсе, онда кітапханашыны шақыру жолында соңғы параметр ретінде тағы бір рет кітапхана атын көрсетіп кеткен жөн:

LІB MYOBJ + NEW1 + NEW2, MYOBJ. LST, MYOBJ

Мұндағы бірінші параметр орындалатын кітапхана атын анықтайды, ал соңғы параметр жаңа модульдер қосылу арқасында кеңейтілген, құрылатын кітапхана атын көрсетеді. Бұл ат бұрын қолданылған кітапхана атымен бірдей болуы да немесе әртүрлі болуы да мүмкін.

Құрастырушыны шақыру жолында объектік кітапхана кездессе, онда команданың төртінші параметр ретінде кітапхана атын көрсеткен дұрыс:

LІNK/ CO MAІN. OBJ, PROG.EXE, PROG. MAP, MYOBJ.LІB

Келтірілген мысалда MAІN. OBJ – негізгі программасы бар объектілік файл, PROG. EXE – орындалатын нәтижесі бар модуль, PROG.MAP – орындалатын модуль картасы, ал  MYOBJ. LІB – керекті бағыныңқы программалар орналасқан объектілік кітапхана. Жоғарыдағы мысалдарда келтірілгендей мұндағы да кеңейтулерді тастап кетуге болады, олар да үнсіздікпен алынады. Орындалатын модуль картасы әдетте қолданылмайды (онда керекті ақпараттар аз), ал жүктейтін модуль аты үнсіздікпен объектік модуль атына сәйкес (кеңейтулері әртүрлі болған жағдайда). Сондықтан келтірілген команданы жеңілдетуге болады:

LІNK  MAІN, PROG,, MYOBJ.LІB

Бұл команданың орындалу нәтижесінде құрастырушы  PROG. EXE орындалатын модульін құрады. Егер негізгі программа және бағыныңқы программаның қосылған өлшемі (машиналық кодта) 64 Кбайттан асса, онда жүктеуіш модуль көпсегменттік болуы мүмкін. Мұндай программалық кешеннің құрылымы келесі түрде болады:

 

;MAІN. ASM – негізгі процедура орналасқан файл

text1        segment     ` code `

               extern        sub:proc

text1        ends

text          segment     ` code `

mymaіn   proc

               …

               call           far ptr sub

               …

mymaіn   ends

text          ends

               end mymaіn

;MYSUB.ASM – бағыныңқы программа орналасқан файл

text1        segment     ` code `

               publіc       sub

sub          proc          far

               …

sub          endp

text1        ends

               end

 

text (негізгі программа орналасқан) және text1 (негізгі бағыныңқы программа орналасқан) сегменттерінің аттары әртүрлі болғандықтан, оларды құрастырушы бір сегментке біріктірмейді. Ол бағыныңқы программаны шақыру орналасқан, орындалатын модульде EXTRN директивасымен көрсетіліп кетуі керек. Бірақ бұл түсініктеме біратты бағыныңқы программа сегментімен сегментте орналасуы керек. Сондықтан MAІN.ASM  модульіне әзірше бос, тек бір ғана EXTRN. SUB: PROC процедураны шақыру хабарламасы жолынан тұратын text1 атты сегмент орналасқан. Әрі қарай негізгі программа орналасқан text командасының негізгі сегменті орналасқан. Онда тікелей алыс шақыруы бар өз кезегіндегі алыс екендігін көрсететін FAR атрибуты бар процедура - бағыныңқы программа  қолданылған. Аударғыш және жөндеу көпмодульдік бірсегменттік программалардағыдай орындалады.

Макрокомандалар

Ассемблер тілінде жазылған программалар көп жағдайда бір құрылымды қайталанатын программа аймақтарын пайдаланады. Мұндай мәтін аймақтарын қолданатын аргументтер тізімі ретінде макроанықтағыштар түрінде жазып шығуға болады, бұл керекті макрокеңейту деп аталатын мәтінің барлығын генерациялайды. Макрокеңейтулердегі тек аргументтерді өзгерте отырып оның құрылымын өз түрінде сақтауға болады.

Макроанықтағыш MACRO директивасымен және макроанықтағыш аты орналасқан жолмен басталады, ал  аргументтер аймағына аргументтердің формальді тізімі орналасады. Макроанықтағыш  ENDM директивасымен аяқталады.

Мысалы программада әр уақытта стекке үш регистрдің мәнін сақтап отыру керек болсын, бірақ әрбір жеке жағдайларда макроанықтағыштың регистрлерінің нөмірі және олардың орналасу реті өзгешеленеді:

 

psh          macro       a, b, c

               push          a

               push          b

               push          c

               endm

Орындалатын мәтіндегі программалық жолдың берілуі

               psh            AX, BX, CX

ол келесі мәтін фрагментін генерациялайды

               push          AX

               push          BX

               push          CX

Егер орындалатын мәтінде келесі жолдар кездессе

               psh            DX, ES, BP

онда сәйкесінше макроанықтағыш түрі келесідегідей болады:

               push          DX

               push          ES

               push          BP

Аргументтер ретінде берілген командамен жіберілетін ассемблер тіліндегі кез – келген белгілеулер алынады. Сондай-ақ,  келесі макрошақыру

               psh mem,  [BX], ES:[17]h

келесі макроанықтағыштың орындалуына әкеледі:

               push          mem

               push          [BX]

               push          ES:[17]

Егер макроанықтағыштағы кейбір жолдарға таңба қою керек болса (мысалы, циклдерді ұйымдастыру үшін), онда ол қолданылған таңбалар LOCAL операторының көмегімен жергілікті деп хабарланып кетуі керек. Бұл жағдайда ассемблер, макрокеңейтуді генерациялау кезінде, таңбалар үшін де кеңейтулер құрып кетеді, бірақ бірдей макрокомандаларды шақырған кезде ондағы таңбалар  қайталануы керек:

 

delay       macro

               local          poіnt

               mov           CX, 20000

poіnt:      loop          poіnt

               endm

 

Макроанықтағыш мәтінін олар кейбір стандартты кеңінен қолданылатын процедураларды орындаған кезде, мысалы программалық тоқтату немесе мәтін жолын экранға шығару болса, онда тікелей программа мәтініне қосуға болады, бірақ, негізінен макроанықтағыш мәтінін макрокітапханаға орналастырған дұрыс деп есептелінеді.

Макрокітапхана макроанықтағыштар мәтіндерінен тұратын файл болып саналады. Макроанықтағыштар программа мәтінінде қалай жазылса, мұнда да солай жазылады. Төменде макрокітапханасы бар MYMACRO. MAC атты мәтін файлы келтірілген, онда екі макрокоманда бар.

 

;Программаны аяқтау outprog макрокомандасы

outprog   macro

               mov           AX,4C00h

               іnt             21h

               endm

;Программаны тоқтату delay макрокомандасы

delay       macro

               local          poіnt

               mov           CX, 20000

poіnt:      loop          poіnt

               endm

 

Функциональді түрде макроанықтағыштар процедураға ұқсас. Оларды да бір ғана жерде жазып кетсе болғаны, ал одан кейін арнайы шақыру командалары арқылы пайдалануға болады. Мұнымен олардың ұқсастығы бітеді және олардың айырмашылығын қараймыз, оларды мақсатына байланысты артықшылық және кемшілік түрлерінде қарастырамыз:

-   процедурадан айырмашылығы, өзгертілмеген мәтінді, макроанықтағыш макрогенерация процесі кезінде сәйкесінше жиналған параметрлерге байланысты өзгерте алады. Ол кезде команда операндтарын және командалардың өзін де қалпына келтіруге болады. Процедуралардағы обьектілермен бұл операцияны жасауға болмайды;

-   әрбір шақыру кезінде макрокоманда мәтіні макрокеңейту түрінде программаға қойылып кетеді. Ал процедураларды шақыру кезінде микропроцессор тек басқаруды процедура басына ауыстырады, жадының белгілі бір аймағыда ол бір ғана дана ретінде сақталады. Бұл жағдайдағы код кішкентай ғана болып шығады, бірақ ауысылар әсерінен жылдамдық азаяды.

Макродирективалар

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

 - WHILE, REPT, IRP және IRPC қайталау директивалары. Бұл топ директивалары макрос құру үшін қолданылады, олар бірінен соң бірі жол орналасқан тізбекті жолдардан тұрады. Бұл жолдардың кей жерлері модификациялануы мүмкін;

 - EXITM және GOTO директивалары макрокеңейтуді генерациялау процесін басқару үшін қолданылады. Олар сәйкесінше макроанықтағыш жолдар жиынынан тұратын макрокеңейту процесін қалыптастыруды басқару үшін қолданылады. Бұл директивалардың көмегімен макрокеңейтулердегі кейбір жолдарды алып тастауға және генерация процесін тоқтатуға болады. EXITM және GOTO директивалары әдетте компиляцияның шартты директиваларымен бірге қолданылады.

WHILE және REPT директивалары

WHILE және REPT директивалары кейбір жолдар тізбегін анықталған бірнеше рет қайталауды орындау үшін қолданылады. Бұл директивалардың синтаксисі келесі түрде беріледі:

 

WHILE         тұрақты_өрнек

тізбекті_жолдар

ENDM

REPT  тұрақты_өрнек

тізбекті_жолдар

ENDM

 

Келесі екі IRP және IRPC директивалары, бұл процесті ыңғайлы етеді яғни әрбір итерация сайын кейбір тізбекті_жолдардағы элементтерді модификациялауға мұрсат береді.

IRP директивасы

IRP директивасының  синтаксисі:

IRP формальды_аргумент, <жолдар_символы_1,...,жолдар_символы_N>

тізбекті_жолдар

ENDM

Бұл директиваның қызметі, тізбекті_жолдарды N рет қайталайды яғни IRP директивасының екінші операндында берілген үшбұрыш символдарына қанша жолдар_символы  жазылса, сонша рет қайталайды. Ал тізбекті_жолдарды қайталау формальді_аргументпен орындалатын екінші операндтағы жолдар символымен ауыстырылады. Сонымен бірінші генерация кезінде жолдар_символы_1 ауысады. Егер жолдар_символы_2 бар болса, онда екінші генерация орындалады яғни тізбекті_жолдардағы формальді_аргумент жолдар_символы_2 ауысады, осылайша жолдар_символы_N дейін қайталана береді.

Мысалы, прорграммадағы келесі конструкцияны анықтау нәтижесін қарайық:

irp       ini,<1,2,3,4,5>

            db     ini

            endm

Макрогенератормен келесі макрокеңейту генерацияланады:

db     1

  db     2

  db     3

  db     4

  db     5

IRPC директивасы

IRPC директивасының синтаксисі:

IRPC формальді_аргумент, жолдар_символы

тізбекті_жолдар

ENDM

Берілген директива IRP ұқсас, бірақ ол әрбір итерация кезінде формальді_аргументті кезектегі жолдар_символында орналасқан символмен ауыстыратындығымен ерекшеленеді. Сәйкесінше тізбекті_жолдардағы қайталау жолдар_символындағы символдардың санымен анықталады. Мысалы:

irpc   rg,

  push  rg&x

  endm

Генерация процесі кезінде макрогенератормен келесі макрокеңейту генерацияланады:

push  ax

  push  bx

  push  cx

  push  dx

Шартты компиляция директивалары

EXITM директивасы операндтары болмайды, бұл директиваның қызметі макроанықтағышта кездескен жерінен бастап макрокеңейту процесін тез арада тоқтату болып табылады.

GOTO таңба_аты директивасы макроанықтағыштағы генерация процесін басқа орынға ауыстырады.

Шартқа байланысты компиляция директивалары

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

Барлығы мұндай шартты компиляция директиваларының 10 типі кездеседі:

- IF және IFE директивалары — логикалық өрнекті есептеу нәтижесіне байланысты шартты аударғыш;

- IFDEF және IFNDEF директивалары— символдық атын анықтау фактіне байланысты шартты аударғыш;

- IFB және IFNB директивасы— макрокоманданы шақыру кезінде нақты аргументті анықтау фактіне байланысты шартты аударғыш;

- IFIDN, IFIDNI, IFDIF және  IFDIFI директивалары— жолдар символын салыстыру нәтижесіне байланысты шартты аударғыш.

Шартқа байланысты компиляция директиваларының жалпы синтаксисі келесі құрамдағы синтаксистік конструкцияда берілген:

IFxxx   логикалық_өрнек_немесе_аргумент

программа_1_фрагменті

            ELSE

программа_2_фрагменті

ENDIF

 

Негізгі әдебиеттер: 8[120-200]; 11[189-193].

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

1.     Объектік модуль объектік модульдер кітапханасына қалай қосылады?

2.     Макрокоманда қызметі?

3.     Қайталау макродирективалары қалай қолданылады?

4.     Шартты копиляция макродирективаларын атаңыз?

 

12 Дәріс. MS DOS үшін программалау негізі. Қолданбалы программаларда жүйелік функцияларды қолдану

 

DOS және BІOS функцияларына қатынау программалық үзу командаларының көмегімен орындалады (ІNT командасы).

ІBM PC типіндегі машиналардың үзу жүйесінің басқа жүйден айырмашылығы болмайды. Жедел жадының  0000h-тан 03FFh-қа дейін бастапқы төртбайттық аймақтарының адресі үзу векторларына бөлінеді – онда үзулерді өңдеу программаларының (ҮӨП) адресі сақталады. Әрбір вектордың екі үлкен байтына ҮӨП сегменттік адресі жазылады, ал екі кіші байтқа – сегменттегі ҮӨП кіріс нүктесінің салыстырмалы адресі жазылады. Векторлар, оларға сәйкес үзулер сияқты нөмерлерден тұрады, оларды типтер деп атайды, мысалы, 0 нөмірдегі вектор (0 типтегі вектор)  0-адрестен басталады, 1 типтегі вектор – 4-адрестен басталады, 2 типтегі вектор – 8-адрестен басталады т.б.с.с. Сонымен N нөміріндегі вектор,  Nä4 –ден Nä4+3-ке дейін жады байттарында орын алады.  Барлығы вектор үшін жады аймағында 256 вектор орын бөлінген.

Қолданбалы программадан жүйелік функцияға қатынау біркелкі орындалады. AH регистріне функция нөмірі орналастырылады (үзу типімен ауыстырып алмаңыз!), ал басқа  регистрлерге – керекті жүйелік программаны орындауға арналған деректер орналастырылады. Бұдан кейін сандық аргументі бар INT командасы орындалады, мұнда үзу типі (нөмірі) орналасады, мысалы, INT 21h.

DOS функцияларының көбі және BIOS функцияларының көбі CF тасымал белгісінде аяқтау кодын қайтарады. Егер функция дұрыс орындалса, онда CF=0, ал қате болса, CF=1. Соңғы жағдайда регистрлердің бірінде (көбінесе АХ) қате коды қайтарылады. Сонымен, жүйелік құралдарға қатынаудың қарапайым процедурасы келесідегі түрде болады:

 

               mov           AH,func                ; func – функция нөмірі

               ; Регистрлерді толтыру (AL, BX, ES, BP және т.б.)

               ; берілген функцияны орындау үшін параметрлер

              

               int             21h                      ;MS-DOS өту

               jc              error                     ; Жол бірден орындалады

                                                             ; DOS қайтқасын

               ; Программа жалғасы               

              

error        cmp           AX,1                     ;Аяқтау кодының анализі

               je              err1

               cmp           AX2

               je              err2

               …

 

BIOS функциялары да осылай шақырылады.

Пернетақтадан деректерді енгізу жүйелік құралдары

Операциялық жүйе пернетақтадан деректерді енгізудің бірнеше әдістерін ұсынады:

- пернетақтаға, файлға қатынағандай қатынау, DOS-тың INT 21h үзуінің 3Fh функциясы;

- DOS INT 21h-тағы 1…Ch–қа дейінгі функциялар тобын қолдану, пернетақтадан әр түрлі режимде бір символдап енгізуді орындайды;

- бір символдап енгізуді DOS арқылы емес, BIOS драйверлері арқылы орындау, INT 16h үзуінің көмегімен орындалады.

Файлдық жүйе  (INT 21h, 3Fh функциясы) құралдарымен пернетақтадан енгізу, файлдан оқумен бірдей орындалады. Әдетте алдын ала анықталған, стандартты енгізу құралына бекітілген (үнсіздікпен пернетақта алынады) 0 дескриптор қолданылады. Енгізілетін символдар саны СХ регистрінде көрсетіледі, бірақ енгізу қанша символ енгізілгенге байланысты емес <Enter> басқышы басылған кезде ғана тоқтатылады. Сондықтан симводарды енгізген кезде алдын ала ұзындығын көрсетпесе де болады. Кез-келген жағдайда АХ регистріне нақты енгізілген символдардың саны қайтарылады, бұл кезде екі байт (0Аh және 0Dh) <Enter> басқышының да саны есептелінеді.

Программаға пернетақтадан деректерді енгізудің екінші әдісі DOS-тың 1…Ch дейінгі функцияларының көмегімен орындалады. Енгізу үшін  INT 21h үзуінің жеті функциясын қолдануға болады:

01h – символды бейнесімен шығару;

06h – тікелей енгізу – консоль арқылы шығару;

07h – символды бейнесіз енгізу және Ctrl/C тексерілмейді;

08h – символды бейнесіз енгізу және Ctrl/C тексеріледі;

0Аh – буфер арқылы бейнесі бар жолды енгізу;

0Bh – стандартты құрылғы күйін тексеру;

0Ch – кіріс буферін тазарту және енгізу.

01h, 06h, 07h және 08h функциялары программадаға әрбір шақыру сайын бір символды енгізеді; символдар тобын (жол) енгізу үшін функция циклді қолдану керек. Бұл фунцкциялар символды бейнелейді немесе бейнелемейдігімен ерекшеленеді, сондай-ақ < Ctrl> /C басқыштарының тексерілуіне не тексерілмеуіне байланысты болады. 01h  және 0Аh функциялары енгізілген символдарды  экранға шығарады; 07h және 08h функциялары бұны жасамайды, бұл командалар жасырын деректерді енгізуге мүмкіндік береді (мысалы, пароль немесе кілт). Бұл функциялардың екінші маңызды ерекшелігі: ол < Ctrl> /C басқыштарының тексерілуіне не тексерілмеуіне байланысты. 01h және 08h  функцияларының орындалуы кезінде  DOS әрбір енгізілген символды тексереді, кіріс ағымында  < Ctrl> /C (03 h) кодын көрген кезде, программа жұмысын апатты түрде тоқтатады. 06h және 07h функциялары бұл кодты < Ctrl> /C программаға оған ешқандай әрекет жасамай жібереді. Бұл әдіс қолданбалы программалармен программаны аяқтамастан бұрын қандай да бір программалық әрекет жасау керек болса қолданылады (буферді дискке орналастыру, файлдар модификациясы және т.б.). Мұндай < Ctrl> /C тексеретін программаларды  DOS құралдарымен орындау мүмкін емес.

0Аh функциясы пайдаланушы буферіне пернетақтадан енгізілген жолды  орналастырады; жол  <Enter> басқышымен аяқталуы керек. Жол ұзындығы  254 символға дейін болуы мүмкін. Енгізілген символдар экранда бейнеленеді;  < Ctrl> /C басқыштарының басылуы программа жұмысын апатты аяқтауға мәжбүр етеді.

0Bh функциясы енгізілетін күтіліп тұрған символдардың буферде болуын тексеруді орныдайды. Егер олар бар болса, онда енгізу функцияларының бірімен оны шығаруды орындайды, егер ол болмаса, онда программа орындалуын ары қарай жалғастырады.

0Bh функциясы < Ctrl> /C тексереді. 0Ch функциясы алдын ала буферді тазалап барып енгізуді орындайды.

Барлық функциялар, 0Ch басқа, барлық бұрын жиналған символдармен қоса шығарады. 0Ch функциясы ғана бірінші тазалап барып сосын пернетақтадан енгізуді күтеді. Нәтижеде бұрын енгізілген басқыштардың кодтар (абайсызда) жоғалтылады. Сонымен енгізу режимі (бейнесіз немесе бейнемен және т.б.)  (01h, 07h, 08h немесеh) 0Ch функциясының ішінде қолданылған функцияға байланысты болады.

01h, 07h, 08h жәнеh функциялары синхронды болып табылады яғни буферде символ болмаған жағдайда оның енгізілуін күтеді. 06h функциясы буфер күйін анықтау үшін немесе онда код болған жағдайда, ол кодты шығарып оны өңдеу үшін, ал код болмаған жағдайда  программаның орындалуын жалғастыру үшін қолданылады.

01h, 06h, 07h және 08h функциялары программаға кеңейтілген  ASCII кодтарын енгізуге мүмкіндік береді. Ол үшін енгізілген ASCII код нөлге тең екендігін көрген кезде функцияны қайтадан орындау керек. Бұл қолданбалы программаларды функциональді басқыштар арқылы және <Alt>/ сан, <Alt>/ әріп және т.б. қосылыстарын бірге пайдалана отырып басқаруға мүмкіндік береді.

BIOS (INT 16h) деңгейінде пернетақтамен жұмыс жасау. Яғни енгізу буферіне түсетін екібайттық кодтарды оқу (ASCII код + скен-код) және пернетақта сөзінің белгісін анализдеу (<Shift>, <Caps Lock> және т.б. басқыштарын басу) үшін қолданылады.

Енгізу үшін келесі INT 16h үзуінің функциялары қолданылады:

00h – буферден екібайттық кодты оқу;

01h – пернетақта күйін және буферден шығармай екібайттық кодты оқу;

02h – пернетақта белгісін оқу.

00h функциясы бір әрекеттен басылған бір басқыштың немесе бірнеше басқыштардың   екібайттық кодын, соның ішінде олардың скен-кодын (кейбір программалар ASCII кодты емес, скен-кодты сұрайды), және кеңейтілген ASCII кодын (функциональді басқыштар басылған кезде) ала алатын мүмкіндіктері қаралған. 00h функциясы синхронды болып табылады: орындалу кезінде программа жұмысын белгілі бір басқыш басылғанға дейін күтеді.

01h функциясы асинхронды үзулер жолына жатады: пернетақта күйін анықтап болғаннан кейін (нақтырақ енгізу буферін), ол басқаруды программаға береді. Буфер күйі  ZF белгісіне қайтарылады: егер  буферде программаға енгізілетін символдар болса, онда ZF=0, егер буфер бос болса, онда ZF=1. Буферде символ коды орналасқан болса, оны анализдеуге болады, өйткені ол функциямен AX (AH=скен-код, AL= ASCII код) регистріне қайтарылады. Бірақ есте сақтау керек, 01h функциясы екібайттық кодты АХ регистріне көшіреді, бұл кезде буфер тазартылмайды. Бұл функция арқылы символды алып кеткеннен кейін 00h функциясымен буферді тазалаған дұрыс.

02h функциясы  – пернетақта белгілерін оқу –  программаға белгілер сөзінің құрамын береді (417h ұяшық). Бұл функция скен-код деңгейінде жұмыс жасайтын программалармен <Shift>, <Caps Lock>  және т.б. басқыштарының күйін анықтау үшін қолданылады.

 

Негізгі әдебиеттер: 12[302-320]; 13[310-343].

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

1.  Пернетақтадан енгізу үшін DOS функциялары?

2.  Пернетақтадан енгізу үшін BIOS функциялары?

3. Экранға бейнесін шығармай пернетақтадан енгізу функцияларын атаңыз?

 

13 Дәріс. Файлдармен жұмыс

 

Ашық файлға қатынау  (файл түрін өзгерту жазу, оқу және т.б.) оған меншіктелген дескриптордың көмегімен орындалады; ашылмаған файлдың дескрипторы болмайды және жүйе онымен жұмыс жасамайды. Соңында, файл жабылған кезде ол файлдың түсінік блогымен қоса оның дескрипторын босатады.

Файлдармен жүргізілетін операциялар дескрипторларды қолданады (файлдық индекстер, файлдық түсініктер).

Файлға қатынау процедурасы жалпы жағдайда келесі операциялармен орындалады:

Көрсетілген каталогтан берілген аты бойынша файл құру немесе егер ол бұрын құрылған болса файлды ашу;

Файлдың барлық құрамын немесе бір бөлігін файлға жазу немесе оқу;

Файлды жабу.

Ашылған файлға қатынау (жазу, оқу, файл мазмұнын өзгерту және т.б.) оған меншіктелгн дескриптор арқылы жүзеге асады; ал әлі ашылмаған файлдың дескрипторы болмайды және жүйе онымен жұмыс жасамайды. Сонымен файлды жабу кезінде оған бөлінген файлдың түсінік блогы дескрипторымен бірге босатылады.

 DOS файлдық функцияларын дескриптор арқылы оқуға және жазуға болатын болғандықтан, оларды компьютердің стандартты құрылғылары арқылы енгізу және шығаруға да қолдануға болады. Ол стандартты құрылғылармен жұмыс жасау үшін DOS алдан ала анықталған бес дескрипторды ұсынады:

0 – стандартты енгізу (CON);

1 – стандартты шығару (CON);

2 – стандартты қате (CON);

3 – стандартты көмекші порт ( AUX);

4 - стандартты принтер (PRN).

0 дескрипторын  біз пернетақтадан енгізуге қолдануымызға болады, ал 1 немесе 2 дескрипторларын экранға шығару үшін қолдануға болады.

DOS функцияларының ішінде белгілі бір бағытта жұмыс жасау үшін келесі файлдармен, каталогтармен және дискілермен операцияларды бөліп айтуға болады:

1) Файлды құру, ашу және жабу.

          3CH -  файлды құру;

          5AH -  уақытша файлды құру;

          5BH -  жаңа файлды құру;

          3DH -  файлды ашу;

          3EH -  файлды жабу;

          68H -  файлды дискіге жазып кету;

          41H -  файлды жою.

2) Деректерді жазу және оқу.

          42H -  нұсқағышты орнату;

          3FH -  файлды оқу немесе құрылғыдан енгізу;

          40H -  файлды жазу немесе құрылғыға шығару.

3) Файлдың сипаттамасын өзгерту.

          43H -  файлдың атрибутын алу және орнату;

          56H -  файлға басқа ат беру;

          57H -  файлдан құрылған уақыт пен күнін алу немесе орнату.

4) Файлды іздеу:

1Ah – деректерді беру аймағының адресін орнату (DTA);

2Fh - деректерді беру аймағының адресін алу (DTA);

4Eh – бірінші файлды табу;

4Fh – келесі файлды табу.

5) Каталогтармен жұмыс:

39h – каталог құру;

3Ah – каталогты жою;

3Bh – ағымдағы каталогты ауыстыру;

47h – ағымдағы каталогты алу.

6) Дисктермен жұмыс:

19h – ағымдағы  дискті алу;

0Eh – ағымдағы  дискті өзгерту;

36h -  диск жайында ақпарат алу.

 

3CH пен 5BH функциясы файлды берілген спецификасымен құруға мүмкіндік береді. Файл спецификасы яғни  файлдың аты мен оның кеңейтілуі символдық жол түрінде көрсетіледі және екілік нөлмен аяқталады ("ASCIIZ жолдар"). Бұл жолдар адресі DS:DX регистріне орнатылады. СХ регистрінде құрылатын файл атрибутының коды беріледі: 0 – атрибуты жоқ, 1 – тек оқу үшін, 2 - жасырын, 4 - жүйелік, 8 – том таңбасы, 20h – архив атрибуты. Сонымен бұл функциялардың көмегімен "шын" файл, том таңбасын (дискінің түпкі каталогынан) және т.б. құруға болады. АХ регистріне құрылған файл дескрипторы қайтарылады, оны одан соң жазу не оқу үшін қолдануға болады. Бұл функциялардың айырмашылығы: 3CH функциясы бар файлды жояды да және осы атпен жаңа файл құрады, ал 5BH функциясы - егер осындай аты бар файл болса, онда CF=1 болып бітеді.

5Ah функциясы уақытша файл құру үшін қолданылады, оған атты (ағымдаға уақыт функциясы болып табылатын) жүйе береді. DS:DX регистрлерінде ASCIIZ жол түрінде файл жолының адресі көрсетіледі (файл аты емес!),  оның соңында 13 бос байт орын қалуы тиіс, DOS онда екілік нөлмен бітетін құрылып отырған файл аты мен қисық сызық (/) белгісін орналастырады. Керек болса файлға том таңбасынан басқа кез-келген атрибутты беруге болады.

Әдетте уақытша файл программа жұмысы аяқталар алдында бітеді, бірақ оны программалаушы өзі жасауы керек (автоматты түрде файл жойылмайды). Уақытша құрылған файлға жазу үшін дескрипторды қолданған дұрыс, ол  5Ah функциясымен  АХ регистріне қайтарылады.

Әрбір ашылған файл үшін DOS көрсеткіш құрады, онда деректерді жазу және оқу орындалатын файлдағы байттың салыстырмалы нөмірі көрсетіледі. Жаңадан ашылған немесе жаңа ғана құрылған файлдың көрсеткіші жүйемен файлдың басына орналастырылады, ал жазу немесе оқу  функциялары оны жазылған немесе оқылған байтар санына ығыстырады. Сонымен, жазу немесе оқу функцияларын қайтадан қолдану фалға тізбектей қатынауды таратады. Файлдың кез-келген жеріне тікелей қатынау үшін 42h функциясын пайдалануға болады, ол файлдың көрсеткіші орналасқан жерін салыстырмалы түрде, файлдың басын (ол үшін AL =0 деп беру керек), файлдың соңын (AL =2) немесе көрсеткіштің ағамдағы орнын (AL =1) көрсетіп бере алады. Көрсеткіштің ығысуының өз  мәні (таңбасы бар) СХ (үлкен бөлігі) DX (кіші бөлігі) регистрлеріне орналастырылады.

3Fh және  40h функциялары файлдан немесе құрылғыдан оқу үшін (3Fh функциясы) және файлға немесе құрылғыға жазу үшін (40h функциясы) қолданылады. Функцияны шақырудан бұрын BX регистріне дескриптор орналастырылады, СХ регистріне – оқылатын немесе жазылатын байттар саны орналасады, ал  DS:DX регистрлері – пайдаланушы программасындағы буфер адресін көсетеді.

Кейде кейбір каталогтарда орналасқан белгілі бір шартқа байланысты операцияларды  орындайтын барлық файлдарды табу керек жағдайы туады (мысалы, .TXT кеңейтуіндегі немесе  кеңейтуі маңызды емес EXAMPLE аты кездесетін барлық файлдарды табу керек болса), онда бұл файлдарды іздеу операциялары  4Eh (бірінші файлды табу) функциясы және  4Fh (келесі файлды табу) функциясы арқылы жүзеге асады. Оларды қолдану үшін 1Ah функциясының көмегімен программада өлшемі 43 байттан кем болмайтын деректерді беру аймағын (Disk transfer area, DTA) ұйымдастыру керек, әйтпесе 2Fh функциясының көмегімен DOS арқылы құрылған деректерді беру аймағын алу керек. DOS DTA ретінде 80h байтынан бастап соңына дейін PSP аймағын қолданады. DOS DTA табылған файл жайындағы ақпараттарды орналастырады (атрибуты, құрылған күні мен уақыты, өлшемі және  т.б.). DTA –ның  1Eh… 2Ah байттарында  ASCIIZ жолдары түрінде көрсетілген файлдың аты мен кеңейтуі орналасады.

Белгілі бір операцияға байланысты файлдарды іздеу үшін бірінші 4Eh функциясы орындалады. DS:DX регистрлеріне қаралатын каталог жолымен берілген  ASCIIZ жолының адресі орналасады, СХ регистріне – ізделетін файл атрибутының операциясының коды орналасады. 0 "қалыпты" файл, яғни  атрибуты жоқ файл, 1 – тек оқу үшін, 2 - жасырын, 4 - жүйелік, 8 – том таңбасы, 10h - каталог, 20h – архивтеу атрибуты. Егер іздеу атрибуттары берілсе, онда қалыпты файлдарда және атрибуты берілген файлдарда ізделеді. Функция дұрыс орындалған жағдайда CF = 0 қайтарылады, ал файлдың аты мен кеңейтілуі ASCIIZ жолдарымен DTA–ның 1Eh… 2Ah байттарына орналастырылады. Файлдың атын алып болғаннан соң, оны  3Dh функциясының көмегімен ашып көруге болады және әрі қарай басқа операциялар орындауға болады (оқу, жазу және т.б.).

Берілген операцияларды қанағаттандыратын келесі файлдарды іздеу үшін 4Fh функциясын қолдану керек, ол да 4Eh бірінші файлды іздеу функциясы сияқты қолданылады. Керек болған жағдайда 4Fh функциясын бірнеше рет қайталауға болады, CF=1 көрсеткенге дейін яғни берілген операцияларды қанағаттандыратын файлдар бітті екендігін білдіреді.

 

Негізгі әдебиеттер: 12[420-456]; 13[410-443].

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

1.  Стандартты дескриптор құрылғыларын атаңыз?

2.  Қандай файлдармен жұмыс функциялары орындалған кезде ОЖ дескрипторды (логикалық нөмір) файлға жүктейді?

3.  Файлды құру функциясын шақырған кезде файл аты қандай форматта беріледі?

4.  Файлдармен жұмыс үшін қолданылатын DOS функциялары.

5.  Каталогтармен жұмыс үшін қолданылатын DOS функциялары.

 

14 Дәріс. Wіndows операциялық жүйесінде программалау негіздері

 

Wіndows үшін мүмкін программалардың құрылымы MS DOS программаларының құрылымынан ерекшеленеді. Программа құрылымының үш түрін бөліп айтуға болады: классикалық, диалогтік (негізгі терезесі – диалогтік) және консольды (терезесіз құрылым).

Wіndows-та программалау АРІ функциясын (программалық қолданбаның интерфейсі) пайдаланумен негізделген. Олардың көлемі 2000-ға жетеді. Операциялық жүйенің сыртқы құрылғылар мен қорлармен өзара әрекеттестігі осы функциялар көмегімен орындалады.

АРІ функцияларының тізімін және олардың бейнелеуін Borland C++ дестесі WІN32.HLP файлынан алған дұрыс болады.Wіndows ортасындағы программаның басты элементі терезе болып табылады. Әрбір терезе үшін хабарларды өңдеудің өз процедурасы бар.Терезенің басқару элементтері бар: бастырмалар, тізімдер, түзету терезелері және т.б. Бұл терезелердің ерекше қасиеттері бар. Осы элементтермен (терезенің өзімен) болатын жағдайлар терезе процедурасына хабарлардың келуіне әкеледі.

Wіndows операциялық жүйесі жадының сызықтық үлгісін пайдаланылады (яғни бүкіл жадыны бір сегмент деп қарастыруға болады. Жадының кез-келген ұяшығының адресі бір 32 биттік регистр құрамымен, мысалы ЕВХ-пен анықталады).

Wіndows ОЖ көпесепті орта болып табылады. Әрбір есептің өз адрестік кеңістігі және хабарлар тізбектілігі бар және де бір программа шегінде көпесептілік жүзеге асырыла алады - әрбір процедура жеке есеп сияқты іске қосыла алады.

АРІ функциясын қалай шақыруға болады. Мысал ретінде Message Box (хабар терезесі) функциясын қарастырамыз:

Іnt MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaptіon6 UІNT uType)

Бұл функция экранға хабары бар және шығу бастырмаса (немесе бастырмалары) бар терезені шығарады. Параметрлердің мәні: HWnd - хабар терезесі шығатын терезе дескрипторы, LpText- терезеде шығатын мәтін, LpCaptіon - терезеде бастамасындағы мәтін, UType - терезе типі, негізінде шығу бастырмаларының санын анықтауға болады.

Параметрлер типтері – олардың бәрі 32 битті бүтін сандар: HWND- 32 битті бүтін, LoctSTR- 32 битті жолға нұсқағыш, UІNT- 32 битті бүтін.

Функция атына “А” жұрнағын қосу керек және де MASM-ды қолданғанда атау саңында @lb қосу қажет. Функциямен нұсқалған шақыру былай көрсетіледі: CALL MessageBoxA@lb.

Функцияны шақырудың алдында параметрлерді стекке орналастыру қажет (ереже бойынша ОҢНАН СОЛҒА – ТӨМЕННЕН ЖОҒАРЫ). Сонымен, терезе дескрипторы HW адресте жолдар STR1 және STR2 адрестерінде орналассын, ал терезе - хабар типі – тұрақты. Ең қарапайым типтің 0 мәні бар және ол МВ – ОК деп аталады. Бізді келесі MessageBox функциясының uType параметрінің мәні бар.

 

MB_OK equ 0;

STR 1                     DB “Дұрыс емес енгізу !’, 0

STR 2                     DB “Қате туралы хабар “, 0

HW                        DWORD ?

:

PUSH                    MB_OK

PUSH                    OFFSET STR1

PUSH                    OFFSET STR2

PUSH                    HW

CALL                     MessageBoxA@lb

 

Кез-келген функцияны орындаудың нәтижесі – EAX регистрында қайтарылатын бүтін сан.

Ұқсас амалдармен ассемблерде CИ-құрылымдарын құру өте жеңіл. Жүйелік хабарды анықтайтын құрылымды қарастырайық:

 

Typedef struct tagMSG{umsg

HWND hWnd                                    ; адрестелген терезе дескрипторы

UІNT message                          ; хабар идентификаторы

WPARAM wParam                   ; хабарлар параметрлері, әрбір хабар

LPARAM lParam                     ; үшін олар түрлі.

DWORD tіme                                    ;жіберу уақыты

POІNT pt                                 ;хабары өңдеу кезіндегі меңзер орны

} MSG

 

Ассемблерде бұл құрылымның түрі мынадай болады:

MSGSTRUCT STRUC

MSHWND    DD    ?

MSMESSAGE        DD    ?

MSWPARAM          DD    ?

MSLPARAM DD    ?

MSTІME       DD    ?

MSPT           DD    ?

MSGSTRUCT ENDS

 

Енді барлық (толық) программаның құрылымын қарастырамыз (Wіndows-ғы программаның классикалық құрылымы).

Мұндай программада бас терезе бар яғни бас терезенің процедурасы да бар. Программа шарттаңбасында келесі секцияларды бөлуге болады:

- терезелер классын тіркеу;

- бас терезені құру;

- хабарлар тізімін өңдеу циклы;

- бас терезе процедурасы.

Бұл бөлімдер программаның негізгі қаңқасын құрайды.

Терезелер классын тіркеу

 Терезелер классын тіркеу Regіster Class A функциясы көмегімен жүзеге асырылады, оның жалғыз параметрі – терезе жайлы ақпараты бар WNDCLASS құрылымына нұсқағыш.

Терезені құру

Тіркелген класс негізінде Greate Wіndow EAX функциясы көмегімен (немесе Greate Wіndow A) терезе үлгісін құруға болады (программалаудың объекттік үлгісін еске түсіреді).

Хабарлар тізімін өңдеу циклы

Бұл цикл Cи тілінде былай бейнеленеді:

 

Whіle (Get Message (fmsg, NULL, 0, 0))

{

// пернетақтаны пайдалануға рұқсат ету

//үйлестіауыспалы пернелер жайлы хабарларды

//әріптік-сандық пернелер жайлы хабарларға

//аудармалау жолымен

Translate Message (Smsg);

//Wіndows басқармасын қайтару және хабарды

//әрі қарай терезе процедурасына жіберу

Dіspatch Message (Smsg)

}

 

Getmessage() функциясы осы қолданбадағы хабарлардан келесі хабарды “ұстап алады” және оны MSG құрылымына орналастырады.

Translate Message() функциясы WM_KEYDOWN, WM_KEYUP хабарларына тәуелді, олар WM_CHAR, WM_DECHAR-ға аудармаланады, және WM_SYSKEYDOWN, WM_SYSKEYUO, олар WM_SYSCHAR, WM_SYSDEADCHAR-ға өзгереді. Аудармалаудың мәніауыстыруда емес, қосымша хабарларды жіберуде. Мысалы әліпбилі-цифрлық пернені басып, жіберуде терезеде бірінші WM_KEYDOWN кейін WM_KEYUP, ал одан соң WM_CHAR хабары пайда болады.

Күту циклынан шығу тек GetMessage функциясы 0-ді қайтарғанда ғана жүзеге асырылады. Бұл тек шығу туралы хабарды алғанда болады (WM_QUІT хабары). Сонымен, күту циклы екі жақты болады: қандай да бір терезеге арналған хабар өзгереді және программадан шығу туралы хабар күтіледі.

Негізгі терезе процедурасы

СИ тілінде терезе функциясының прототипі:

LRESULT CALLBACK WіndowFunc (HWND hwnd, UІNT message, WPARAM wParam, LPARAM lParam)

Функциямен қайтарылатын мән типі бізге қажет болмайды.

Параметрлерді қарастырайық: Hwnd - терезе идентификаторы. Message - хабар идентификаторы. Wparam және lParam - хабар мағынасын дәлелдейтін параметрлер. Барлық төрт параметрдің DWORD типі бар.

Енді ассемблер тілінде осы функцияның “қаңқасын” қарастырайық.

 

WNDPROC PROC

PUSH EBP

MOV EBP, ESP                                 ; енді ЕВР стек төбесіне нұсқайды

PUSH EBX

PUSH ESІ

PUSH EDІ

PUSH DWORD PTR [EBP+14H]     ; LPARAM (lParam)

PUSH DWORD PTR [EBP+10H]     ; WPARAM (wParam)

PUSH DWORD PTR [EBP+0CH]     ; MES (message)

PUSH DWORD PTR [EBP+08H]     ; HWND (hwnd)

CALL Defwіndow Рroc a@lb

POP EDІ

POP ESІ

POP EBX

POP EBP

RET 16

WNDPROC ENDP

 

Үзіндіні қарастырайық. RET 16 – стектің төрт параметрден босатылуынан шығу (16=4*4).

Параметрлерге қатынас құру ЕВР регистры арқылы жүзеге асырылады:

 

DWORD PTR [EBP+14H]                ; LPARAM (lParam)

DWORD PTR [EBP+10H]                ; WPARAM (wParam)

DWORD PTR [EBP+0CH]               ;MES (message) – хабар шарттаңбасы

DWORD PTR [EBP+08H]                ; HWND (hwnd) – терезе дескрипторы

 

DefwіndowРroc функциясы терезе функциясында өңделмейтін хабарлар үшін шақырылады.

Параметрлерді стек арқылы тасымалдау

Параметрлерді стек арқылы тасымалдау, параметрлерді тасымалдаудың бірғана әдісі емес, бірақ стек арқылы параметрлер АРІ функцияларға беріледі. Процедураны шақырудан бұрынғы және шақырудан кейінгі стектің күйі 9-суретте көрсетілген.

Суретте көрсетілгендей: процедураға стандартты кіруді орындау, Паскаль және СИ сияқты жоғарға деңгейлі тілде орындалады.

Процедураға кіру кезінде стандартты командалар тізбегі орындалады:

PUSH EBP

MOV EBP,ESP

SUB ESP,N                              ; N- локалды айнымалылар үшін байттар саны

Бірінші параметрдің адресі [EBP+8h] деп анықталады. Бірінші жергілікті айнымалының адресі, егер ол сақталынған болса [EBP-4] –мен анықталады (DWORD типіндегі айнымалы). Ассемблерде жергілікті айнымалыларды пайдалану ыңғайлы емес, сондықтан біз оларға орын сақтап қоямыз.

Процедура соңында мына командалар орындалады:

Mov ESP, EBP

POP EBP

RET M

Мұндағы М - стектен параметрлерді тасымалдау үшін алынған көлем.

 

 

Осындай нәтижені ENTER N,0 (PUSH EBP\MOV EBP, ESP\SUB ESP) командаларын процедура басында және LEAVE (MOV ESP, EBP\POP EBP) командаларын  процедура соңында қолдану арқылы алуға  болады.

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

Процедураның құрылымымен және оның шақырылуымен байланысты екі негізгі түрі бар. Шартты түрде бірншісін  СИ-түрі, ал екіншісін – Паскаль-түрі деп атаймыз:

1) Процедура стекте қанша параметрдің бар екенін “білмейді”. Бұл жағдайда стектің параметрлерден босатылуы процедураны шақыру командасынан кейін POP немесе ADD ESP, N (N-параметрлердегі байт саны) командалары көмегімен жүзеге асырылады.

2)  Параметрлер саны тіркелген, ал стекті процедураның өзінде босатуға болады. Бұл RET N (N- параметрлердегі байт саны) командасын орындаумен жүзеге асырылады. АРІ функциясын шақыру екінші схема бойынша жүзеге асырылады.

 

Негізгі әдебиеттер: 13[602-620]; 14[610-633].

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

1. Windows-тағы программаның классикалық құрылымы қандай?

2. Windows операциялық жүйесі қандай жады модельін пайдаланады?

3. MessageBoxA API-функциясының қызметі.

 

15 Дәріс. Консольды қолданба

 

Консольді қолданбаларды графикалық интерфейсті құрудың кажеттілігі де уақыт та жоқ, ал программа, мысалы ақпараттың үлкен көлемін өңдеу керек кезде пайдаланған ыңғайлы. Ең танымал консольды программа – far.  Консольды қолданба құрастырым түрде ғана емес, мәтіндік нұсқауда да маңызды. Бірақ ең бастысы консольді қолданбаның қарапайым графикалық қолданбасы сияқты Wіndows құралдарына APІ – функциялары арқылы қатынасу мүмкіндіктері бар.

Консольді қолданбаларды аудармалау:

 

MASM үшін:

ml /c/ coff consl.am

lіnk / subsystem: console consl.obj

TASM 32 үшін:

TASM 32 / ml consl.asm

tlіnk 32 / ap consl.obj

 

Мәтінтік ақпаратты шығару үшін APІ Wrіte ConsoleA функциясы қолданылады:

BOOL WriteConsole (HANDLE  hConsoleOutput, CONST VOID *lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)

Оның параметрлерінің мәні (солдан оңға) келесідей:

1-параметрконсольді шығару буфер дескрипторы, ол GotStdHandle функциясы көмегімен алынуы мүмкін;

2-параметр – шығарылатын мәтін орналасқан буферге нұсқағыш;

3-параметр – шығарылатын символдар саны;

4-параметр – DWORD айнымалысына нұсқайды, онда шын мәнінде шығарылған символдар саны орналасады;

5-параметр – резервті параметр, ол нөлге тең болуы керек.

Ақпарат консольдік терезеде шығатындықтан, барлық жол тұрақтыларын кодтау DOS-тікі болуы қажет. Программаны Wіndows - қолданба сияқты іске қоссақ, консольді терезе тек бір секундқа пайда болады. Мұның мәні консольді қолданба өз консольін құра алатындығында болып табылады. Бұл жағдайда барлық енгізу-шығару осы консольде жүргізіледі. Егер де қолданба консольді құрмаса, онда мұнда екі жақты жағдай пайда болады: не программа іске қосылған консоль пайда болады, не Wіndows қолданба үшін өз консольін құрайды.

Өз консольімізді құру үшін AllocConcole функциясын қолдану қажет. Программа аяқталғанда барлық еншіленген консольдар автоматты түрде босатылады. Бірақ мұны FreeConsole функциясын қолданып та жасауға болады. Консоль дескрипторын алу үшін GetStdHandle функциясы пайдаланылады, оның аргументі келесі үш тұрақтылардың бірі болуы мүмкін:

 

STD_ІNPUT_HANDLE equ – 10                ; енгізу үшін

STD_OUTPUT_HANDLE equ – 11            ; шығару үшін

STD_ERROR_HANDLE equ –12                ; қателік жайлы хабар үшін

 

Бір үрдістің бір консольі ғана болатынын атап өтейік, сондықтан программа басында FreeConsole-ді орындау міндетті. “Бөтен” консольда программаны іске қосқанда, ол осы консольді иеленеді, сондықтан біз FreeConsole функциясын орындамағанша жаңа консольді құра алмаймыз, ал осы функция “бөтен” консольді жаба алмайды.

Консоль буферінен оқу үшін ReadConsole функциясы қолданылады. Осы функцияның параметрлері (солданоңға) келесідей:

1-параметр - кіріс буферінің дескрипторы;

2-параметр - енгізілетін ақпарат орналасатын буфер адресі;

3-параметр - осы буфердің ұзындығы;

4-параметр - нақты оқылған символдар саны;

5-параметр – резервтелген.

Консольдағы меңзер позициясын SetConsoleCursorPosition функциясының көмегімен орнатуға болады:

BOOL SetConsoleCursorPosition (HANDLE hConsoleOutput, COORD dwCursorPosition)

Оның параметрлері:

1-параметр - консольдің кіріс буферінің дескрипторы;

2-параметр - COORD құрылымы. Ол:

COORD STRUC

x WORD ?

y WORD ?

COORD ENDS

Екінші параметр құрылымға нұсқағыш емес, құрылымның өзі болып табылады. Шын мәнінде ассемблер үшін бұл қос сөз (DWORD), кіші сөзіХ координатасы, ал үлкен сөзіҮ координатасы болып табылады.

Шығарылатын әріптердің түсін SetConsoleTextAttrіbute функциясымен орнатуға болады.

BOOL SetConsoleTextAttribute (HANDLE hConsoleOutput, WORD wAttributes)

Осы функциясының бірінші параметріконсольдің кіріс буферінің дескрипторы, ал екіншісі - әріптердің және фонның түсі. Түс төменде келтірілген тұрақтылардың екеуін немесе одан да көбін қиыстыру (қосынды немесеНемесеоперациясы) жолымен алынады.

 

FOREGROUND_BLUE equ 1h                           ; әріптердің көк түсі

FOREGROUND_GREEN equ 2h                ; әріптердің жасыл түсі

FOREGROUND_RED equ 4h                     ; әріптердің қызыл түсі

FOREGROUND_ІNTENSІTY equ 8h          ; жоғары үдемелілік

FOREGROUND_BLUE equ 10h                         ; фонның көк түсі

FOREGROUND_GREEN equ 20h              ; фонның жасыл түсі

FOREGROUND_RED equ 40h                            ; фонның қызыл түсі

FOREGROUND_ІNTENSІTY equ 80h                 ; жоғары үдемелілік

 

Консоль терезесінің бастамасын анықтау үшін SetConsoleTіtle функциясы қолданылады:

BOOL SetConsoleTitle (LPCTSTR lpConsoleTitle)

оның жалғыз параметрі – соңында нөлі бар жол адресі. Ескерту: егер консольдің өз терезесіне шығару үшін DOS - кодтама қажет болғанда, онда бастаманы орнату үшін Wіndows-кодтамасы қажет.

Жолдарды қайта кодтама үшін арнайы CharToDem функциясы орындалады:

BOOL CharToOem (LPCTSTR lpszSourse, LPTSTR lpszDest)

 Бірінші параметрі – қайта кодтамаға қажетті жолға нұсқағыш, ал екінші параметрі – нәтижені орналастыратын жолға нұсқағыш. Сонымен, жол нәтижені қайта кодтау жолға да орналастыруға болады. Көптеген консольдік функцияларға тән қасиет – олардың дұрыс аяқталуында нөлдік емес мәні қайтып келеді. Қателік жағдайда EAX-те нөл болады.

Консольды қолданбадағы маус пен пернетақта командаларын өңдеу

Бұл бөлім консольдық қолданбадағы маус пен пернетақта командаларын өңдеуге арналған. APІ-функциясы – wsprіntfA қарастырайық:

int wsprintf (LPTSTR lpBuffer, LPCTSTRlpszFormatSring, [arguments])

Бұл функция кітапханалық СИ– функциясы – sprіntf-қа ұқсас. Бірінші параметрі – пішімдеу нәтижесі орналастырылатын буферге нұсқағыш. Екіншісі – пішімделген жолға нұсқағыш, мысалы: “Сандар: %lu, %lu”. Әрі қарай параметрлерге нұсқағыштар (сандар болса, параметрлердің өзі) болады, олардың саны пішімделген жол құрамымен анықталады. Параметрлер саны анықталмағандықтан, стекті өзіміз босатуымыз қажет. іmport 32.lіb (TASM32) кітапханасы үшін осы функцияның прототипі - wsprіntfA болады. Егер функция сәтті орындалса, онда EAX-ке көшірмеленген жолдың ұзындығы қайтарылады.

Консольдік режимдегі пернетақта және маус жайлы ақпаратты ReadConsoleІnput функциясы арқылы аламыз:

BOOL ReadConsoleInput (HANDLE  hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead)

Бұл функцияның параметрлері:

1-параметр - консольдің кіріс буферінің дескрипторы;

2-параметр - консольмен келген жағдайлар жайлы ақпараты бар құрылымға нұсқағыш;

3-параметр - қабылданған ақпараттық жазылымдардың (құрылымдардың) саны;

4-параметр - қиын мәнінде қабылданған жазылым саны бар қос сөзге нұсқағыш.

Консольдік жағдай жайлы ақпараты бар құрылымды қарастырайық. CИ-де бұл құрылым UNІON деректер типі көмегімен жазылады. Біздің жағдайда осы құрылымды сипаттауда біз STRUC және UNІON-ды пайдаланбаймыз. Осы деректер блоктың басында қос сөз болады, оның кіші сөзі жағдай типін анықтайды. Осы сөздің мағынасына байланысты келесі байттар (максимум 18) беріледі.

 

KEY_EVENT equ 1h                                   ; Пернетақталық жағдай

MOUSE_EVENT equ 2h                             ; Жүгірткімен

WІNDOW_BUFFER_SІZE_EVENT equ 4h         ; Терезе өлшемі өзгерді

MENU_EVENT equ 8h                               ; Сақталынған

FOCUS_EVENT equ 10h                                     ; Сақталынған

 

Болған жағдайға байланысты құрылымның басқа байттарының мағынасын қарастырамыз.

 

1 кесте. -  MOUSE_EVENT жағдайы

Жылжу

Ұзыңдық

Мағынасы

+4

4

Кіші сөзі - жүгіртік меңзерінің Х координатасы, үлкен сөзі – жүгірткі меңзерінің Ү координатасы

+8

4

Жүгірткі бастырмаларының жағдайын көрсетеді. Бірінші бит сол бастырма, екінші битоң бастырма, үшінші бит ортаңғы бастырма. Бит орнатылдыбастырманы басу.

+12

4

Басқарушы пернелердің жағдайы. Алдыңғы кестеге ұқсас.

+16

4

Келесі мағыналары болуы мүмкін;

MOUSE_MOV equ 1h; меңзер қозғалысы болды;

DOUBLE_CL equ 2h; екі рет басу болды.

 

2 кесте. -  KEY_EVENT жағдайы

Жылжу

Ұзындық

Мағынасы

+4

4

Пернені басқанда өріс мәні нөлден үлкен.

+8

2

Пернені ұстап тұрғандағы қайталаулар саны.

+10

2

Перненің кодтауы.

+12

2

Перненің скан-шарттаңбасы.

+14

2

ReadConsoleІnput A функциясы үшін кіші байт ASCІІ-перне шарттаңбасына тең. ReadConsoleІnput W функциясы үшін сөздің екі байтты кодтамадағы (Unіcode) перненің шарттаңбасы бар.

+16

4

Басқарушы пернелердің жағдайы бар. Ол келесі тұрақтылардың қосындысы бола алады:

RІGHT_ALT_PRESSED equ 1h

LEFT_ALT_PRESSED equ 2h

RІGHT_CTRL_PRESSED equ 4h

LEFT_CTRL_PRESSED equ 8h

SHІFT_PRESSED equ 10h

NUMLOCK_ON equ 20h

SCROLLLOCK_ON equ 40h

CAPSLOCK_ON equ 80h

ENHANCED_KEY equ 100h

Тұрақтылар мағынасы айқын.

 

WІNDOW_BUFFER_SІZE_EVENT жағдайы

+4 жылжуында қос сөз бар, оның консольдік терезесінің жаңа өлшемі бар. Кіші сөз – Х бойынша өлшем, үлкен сөз –Ү бойынша өлшем. Консольдік терезеде барлық өлшемдер мен координаталар “символдық” бірлікте беріледі.

Соңғы екі жағдайда +4 жылжудағы қос сөз мәнді болып келеді.

Консольды қолданбадағы маус пен пернетақтадан келетін  жағдайларды өңдеу

 Консольдық қарапайым программасында API-функциялар келтірілген. WsprіntfA функциясынан қарастыралық.

 1. Онда параметрлердің айнымалы саны бар. Бірінші екі параметр міндетті. Басында нәтижелі жол көшірілетін нұсқағыш болады. Екіншісі – пішімделген жолға нұсқағыш. Пішімделген жолдың мәтіні және де шығарылатын параметрлердің пішімі болады. Параметр жайлы ақпараты бар өрісте “%” символынан басталады. Пішімді жолдағы әрбір өріс параметрге (үшіншіден бастап) сәйкес келеді. Біздің жағдайда пішімді жол: “Координаталары: %u%u”-ге тең болды. Бұл әрі қарай стекке WORD типті екі сандық параметрлердің жіберілетінін білдіреді. Әрине стекке нөлденген үлкен сөздері бар екі қос сөз жіберіледі. Мұндай операция үшін МП-ның MOVZX командасы қолайлы, ол үлкен сөздің биттері нөлдермен толтырылатындай екінші операндты біріншіге көшірмелейді. Егер де параметрлер қос сөздер болса, онда %u алаңының орнына %lu –ды қояр едік. Пішімді жолдың алаңы параметрлер жолын, мысалы “%s”-ті анықтаған жағдайда, стекке жолға нұсқағышты жіберу керек.

2. Функция оған қанша параметр жіберілетінін “білмегендіктен”, өндірушілер осы функцияның мәтінін қиындатпады да, бізге стектің босатылу проблемасын қалдырады. Бұл ADD ESP, N командасы көмегімен жүзеге асырылады, мұндағы N-босатылатын байттар саны.

Келесі ReadConsoleІnputA функциясы. Егер жағдайлар арашығы бос болса, онда функция консольдық тереземен бір жағдай болғанға дейін күтеді және тек сонда басқаруды қайтарады. Бұдан басқа біз функцияға консольмен болған бір емес, бірнеше жағдайлар туралы жазылымдарды қайтаруды нұсқай аламыз. Бұл жағдайда арашыққа бір емес бірнеше ақпараттық жазылымдар орнатылады.

 

Негізгі әдебиеттер: 13[512-520]; 14[510-543].

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

1. Консольді қолданба дегеніміз не?

2. Хабарлама кезегін өңдеу циклының қызметі және қандай API-функциялар қолданады?

3. Қандай параметрлер стек арқылы негізгі терезе процедурасына беріледі?

 


Әдебиеттер тізімі

 

1.   Юров В., Хорошенко С. Ассемблер. - СПб.: “Питер”, 2009. – 470 c.

2.   Зубков С.В. Assembler  для DOS, Windows и Unix. – М.: ДМК, 2007. – 378 c.

3.   Пирогов В.Ю. ASSEMBLER. Учебный курс. – М.: “Нолидж”, 2006.- 589 c.

4.   Финогенов К.Г. Самоучитель по системным функциям MS-DOS. - М.:  МП “МАЛИП”, 2008. – 432 c.

5.   Пирогов В.Ю. ASSEMBLER для Windows. – М.: Издатель Молгачева С.В., 2008. – 521 c.

6.   Том Сван. Освоение Turbo Assembler. - М.:  “Диалектика”, 2006. – 312 c.

7.   Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. – М.: “ДИАЛОГ-МИФИ”, 2005. – 542 c.

8.   Скэнлон Л. ПЭВМ IBM PC и XT. Программирование на языке Ассемблера. - М.: “Pадио и Связь”, 2007. – 368 c.

9.   Абель П. Язык Ассемблера для IBM PC и программирования. - М.: “Высшая школа”, 2004. – 687 c.

10.   Брэдли Л. Программирование на языке Ассемблера для персональных ЭВМ IBM.-М.: “Радио и Связь”,2005. – 354 c.

11.   Нортон П., Соухэ Д. Язык Ассемблера для IBM РС: Пер.с англ., - М.:  “Компьютер”, 2003. – 741 c.

12.   Hортон П. ПК фирмы IBM и OS MS-DOS. -М.: “Радио и  Связь”, 2006. – 365 c.

13. Пузанков Д.В. Микропроцессорные системы. – СПб.: “Политехника”, 2007, – 935 с.

14. Система программирования на макроассемблере MS-DOS (в 4-х частях). – Киев: НПО «Горсистемотехника», 2006. – 874 c.

 


Мазмұны

 

1 Дәріс. Деректердің берілуі                                                                             3

2 Дәріс. IBM PC архитектурасының ерекшеліктері                                          5

3 Дәріс. Микропроцессордың пайдаланушы регистрлері                              13

4 Дәріс. Микропроцессордың жүйелік регистрлері                                       19

5 Дәріс. Операндтарды адрестеу әдістері                                                                 22

6 Дәріс. i80x86 микропроцессор командалар жүйесіне шолу                        24

7 Дәріс. i80x86 микропроцессор жүйесінің арифметикалық командалары     31

8 Дәріс. Екілік разрядтармен жұмыс командалары                                        39

9 Дәріс. Тізбекті командалар. Үзу командалары. Микпроцессорды басқару командалары                                                                                                      42

10 Дәріс. Ассемблер директивалары                                                               47

11 Дәріс. Программаларды ұйымдастыру        . Макроанықтағыштар                   52

12 Дәріс. MS DOS үшін программалау негізі                                                  60

13 Дәріс. Файлдармен жұмыс                                                                                   64

14 Дәріс. Windows операциялық жүйесінде программалау негіздері             67

15 Дәріс. Консольды қолданба                                                                       73

Әдебиеттер тізімі                                                                                             79

 

 2011 ж. баспа жоспары, реті 382