UF

Тақырыбы: «Жүйелік бағдарламалау»

 

1. Дербес компьютерлердің техникалық құралдарының архитектурасы. Негізгі микросхемалар. 286 микропроцессорының арнайы қасиеттері. Адрестік кеңістікті тарату.

 

ДЕРБЕС КОМПЬЮТЕРЛЕРДІҢ ТЕХНИКАЛЫҚ ҚҰРАЛДАРЫНЫҢ  АРХИТЕКТУРАСЫ.

 

Жалпы сипаттама

 

Есептеу жүйесінің орталығы оның процессоры болып табылады. Ол компьютерлік бағдарламаны құрайтын командаларды орындайды.  IBM/PC-де қолданылған микропроцессор "Интел" фирмасымен құрастырылып, құрылған. IBM/PC-де "Интел"  фирмасының  8088, 80286,  80386, 80486 микропроцессорлары қолданылады. IBM/PC тек кейбір компоненттері ғана ол үшін арнайы құрастырылған, - жүйенің көп бөлігі стандартты компоненттерден құрастырылған. "IBM" фирмасының дербес компьютерлерінің ерекшелігі танымал компоненттердің бірегей функционерлеуші жүйеге ұйымдасу тәсілінде.

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

IBM/PC құраушыларын физикалық түрде жүйелік блок компоненттеріне және кеңейту блогы компоненттеріне бөлуге болады. IBM/PC кез келген моделінің құрамына кіретін барлық негізгі платалар жүйелік деген атқа ие болған үлкен блокта орналасады. Жүйелік блок компьютерге ешқандай бір толықтырусыз жұмыс істеуге мүмкіндік беретін барлық керекті компоненттерден тұрады. Бұл жерде микропроцессор орналасады, алғашқы 64К жады және ПЗУ микросхемаларына жазылған Бейсик тілінің интерпритаторы секілді «қоса салынған» бағдарламалар.

Жүйелік блок IBM/PC негізінде орналасқан және корпусқа салынған. Жүйелік блок компьютердің құрамына кіруі мүмкін қосымша құрылғыларды қосуға арналған бес бос орыннан тұрады. Кеңейту блоктары осы орындарға жүйелік блоктың үстіне орналаса салынады.

Кеңейту блоктары немесе оларды басқаша айтқанда карталар IBM/PC-ге жалғанатын құрылғыларға қызмет жасау үшін қолданыла алады. Олар екі негізгі мақсатқа қолданыла алады: жады көлемін үлкейтуге және қосымша құрылғыларды жалғауға.

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

Кез келген қосымша құрылғылар IBM/PC-ге әрқайсысы 62 жалғанатын сымнан тұратын кеңейтудің бірімен жалғанады. Бұл 62 линиялар  IBM/PC-ге жалғанған кез келген құрылғыны басқаруға қажетті барлық сигналдарды жіберуге мүмкіндік береді. Барлық линиялар параллелді жұмыс істейді, сол себепті құрылғыны  бес бос орынның кез келгеніне қосуға болады. Кеңейту блоктарының біріне жіберілген кез келген сигнал басқаларына да барады, себебі олар параллелді жалғанған. Бұл жерде жалпы деректер шинасы идеясының кеңейтілуі орын алады: барлың кеңейту блоктары енгізу/шығару каналы деп аталатын жалпы 62-сымды жалғануды қолданады.

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

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

Жиырма линия адресациялауға арналған. Жадымен жұмыс істеу кезінде барлық 20 линия қолданылады, бұл 1024К жады ұяшықтарының бірінің адресін жіберуге мүмкіндік береді. Енгізу/шығару құрылғылары үшін тек тоғыз линия қолданылады, бұл 512 түрлі құрылғыларды адресациялауға мүмкіндік береді.

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

IBM/PC корпусының ішінде екі қосқыштар жиыны орналасқан. Оларды жүйе конфигурациясын қосқыштар деп атайды. Бұл қосқыштарды орнату IBM/PC-ға қандай құрылғылардың қосылғанын анықтауға мүмкіндік береді, мысалы, дисоводтардың саны, қол жетімді жады көлемі және т.б. Бұл қосқыштар ешнәрсені нақты басқармайды – олар тек қолайлылық үшін қолданылады. IBM/PC қосылғаннан кейін іске қосу бағдарламалары осы қоқыштардың жағдайын есептейді және одан кейін нақты жады ұяшықтардың құрамын орналастырады. Содан кейін, егер қандай да бір бағдарламаға қандай жады көлемі білу керек болса, осы ұяшықтардың құрамы тексеріледі.

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

Әрбір жады ұяшығы оны табуға арналған адрестен тұрады. Адрестер сандар болып табылатындықтан, компьютер жады адрестерін анықтау үшін арифметикалық операцияларды орындай алады.

IBM/PC 8088 микропроцессорының адресациялау мүмкіндіктерінің барлығын қолданады. 8088-де адрестер 20 бит ұзындыққа ие, процессор  екінің жиырма дәрежесін немесе 1024К адресациялауға мүмкіндік береді.

Негізгі микросхемалар

Ең басты микросхема микропроцессордың өзі болып табылады. микропроцессордың жанында 80827 сандық процессорына немесе сандық деректер процессорына орын қарастырылған, ол қалқушы нүктесі бар сандарға тез есептеу жүргізуге мүмкіндік береді. Сандық процессор РС санаулы орналасады.

Компьютердегі синхронизация операциясын орындауға арналған микросхемаларды қарастырайық. Олардың біреуі тактілік (немесе синхронизацияланатын) сигналдардың генераторы деп аталады және компьютердің негізгі циклінде қолданылады, АТ-да оның идентификация номері 88248 болып табылады. Кез келген жағдайда бұл микросхема компьютердің  басқа компоненттерінде негізгі жұмыс темпін орнату үшін қолданылатын синхронизациялайтын синалдарды береді.  Тактілік сигналдар  генераторлары микросхемаларында синхронизация үшін нақты негіз ретінде кварцтық кристалды қолданады. Біздің тактілік сигналдар генераторы өте жылдам кристал тактілерін компьютерге керекті жылдам тактіге айналдырады және сызбаның басқа компоненттерімен қолданылуға келетінформаға айналдырады.

Тактілік сигналдар генераторымен 8253 номерімен идентификацияланатын бағдарламаланатын таймер микросхемасымен жақын байланысқан. Бағдарламаланатын таймер басқа синхронизация сигналдарын тудыра алады. Сигналдардың берілу жылдамдығын өзгертуге болады, бұл микросхеманы «бағдарламаланатын» қылады. Бұл ақпараттар ағынын жөнге салуды жүзеге асыру үшін компьютерлерде шина контроллер микропроцессоры қарастырылған. РС-де бұл микросхема 8288 нмеріне ие,  ал  АТ-да - 82288.  Шина контроллерінің мақсаты шинаның қалыпты жұмысын қамтамасыз ету.

Компьютердің кейбір компоненттері компьютерлік жады арқылы деректермен алмаса алады. Мұндай процесс жадыға тікелей қол жеткізу деп аталады. Бұл процессті басқаратын арнайы микросхема бар, ол жадыға тікелей қол жеткізу контроллері деп аталады (микросхема номері - 8237).

Үзілулер арнайы микросхемамен бақыланады (8259). Компьютерлерде  үзілулер түрлі дәрежелі маңыздылықпен түседі және 8259 үзілу контроллерінің  мақсаттарының бірі оларды приоритеті бойынша табу болып табылады.

Басқа негізгі микросхемаларға перефериялы құрылғылардың бағдарламаланатын интерфейс микросхемасы жатады (номер - 8255). Бұл микросхема касеталық лентаның порты секілді компьютердің қарапайым перефериялық құрылғыларының жұмысын бақылайды. Алайда компьютердің перефериялық құрылғыларының көбісі қарапайым сызбамен түзетілуге қиын болып табылады. Бұндай қиын құрылғыларға иілгіш дискілердің келтірулері жатады. Иілгіш дискілі келтіруі бар компьютерлердің жұмысын басқаруға арналған негізгі микросхема PD765 иілгіш диск контроллері болып табылады. Дисплей үшін әдетте электро-сәулелі трубка контроллері 6845 деп аталатын микросхема қолданылады.

286 микропроцессорының арнайы қасиеттері

Нқты режимде 286 микропроцессорының арнайы мүмкіндіктері және сипаттамалары білінбейді, сол үшін нақты режимде функционерлейтін 286 микропроцессоры бар компьютер қарапайым РС-пен толығымен сәйкес келуі мүмкін. Қосымша мүмкіндіктерді пайдалану үшін қорғалған режимге өту керек.

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

Қорғаныс операциялық жүйеге бағдарламаны операциялық жүйенің өзінен немесе басқа бағдарламалардың әсерінен қорғау үшін барьерлер шығаруға мүмкіндік береді. Стандартты РС-де немесе 286 микропроцессорының жұмыс істеуі кезінде нақты редимде бөлек бағдарлама операциялық жүйенің немесе компьютер қолданатын басқа бір бағдарламаны бұза алады, немесе компьютердің функционерленуін тоқтатып, оны толығымен құлттай алады. 286 микропроцессорының қорғалған режимі операциялық жүйеге компьютердің бұзылуын және кез келген бағдарламаның жадысының қандай да бір бөлігінің бұзылуына мүмкіндік береді.Біз компьютерлерімізді тек бір бағдарламамен жұмыс жасауға қолдансақ, онда бағдарламаның дұрыс жұмыс жасамауы және онымен машинаның құлттануы маңызды роль атқармайды. Алайды, егер бізге компьютерде бір уақытта бірнеше бағдарлама орындау керек болса, онда компьютердің функционерленуін дұрыс жұмыс жасамайтын бағдарламалардан қорғау керектігі жоғарылайды. Қорғаныс құралы мұны мүмкін қылады. 286 микропроцессорының жұмыс жасауының қорғалған режимі үлкен жады көлемін береді, бұл екі жолмен жүзеге асады. Біріншіден  кеңейтілген жады есебінен:286 микропроцессоры компьютерге он алты миллион байт жұмыс жадысын орнатуға мүмкіндік береді. Екіншіден, виртуалды жады есебінен: 286 микропроцессоры бар жадыдан да көп  жадыны иммитациялай алады. Виртуалды жады компьютерге әр бағдарламаға онымен жұмыс жасау үшін бір биллион байтқа дейін (бір гигабайт) бере алады. Бұл өте үлкен жады көлемі.

Аппаратты құралдармен қолданылатын мультитапсырмалықты қолдана отрып 286 микропроцессоры бір уақытта орындалып жатқан бағдарламалар арасында тез және сенімді ауыса алады. Мультитапсырмалық компьютер бір бағдарламадан артық жұмыс жасаса қолданылады. Әр уақытта компьютер тек бір бағдарламаның командаларын орындайды, алайда мультитапсырмалық жұмыс істеу процессінде барлық бағдарлама өңделеді – оны біруақытта бірнеше шармен жұмыс жасай алатын жанглермен салыстыруға болады.

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

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

«Адрестік кеңістік» және «оперативті жады» деген ұғымдарды эквивалент деп қарастыруға болмайды. Адрестік кеңістік – процессорды тұрғыза алатын адрестер жиынтығы. Дербес компьютердің модификациясына және оның перефериялық құрылғысының құрамына қарай адрестік кеңістікті тарату ерекшеленуі мүмкін. Сонда да жүйенің негізгі компоненттерін орналастыру қатал унификацияланған. Алғашқы 640 Кбайт  адрестік кеңістік  00000h-ден 9FFFF11-ке дейін адрестері бар негізгі оперативті жадыға арнеалады, оны тағы стандартты деп атайды (conventional). Оператиті жадының алғашқы килобайты үзілу векторларымен бос емес, олар компьютердің үзілу жүйесінің жұмысын қамтамасыз етеді және әрқайсысы 4 байттық 256 вектордан тұрады. Үзілу векторынан кейін 40һ сегменттік адресінен бастап 256 байтты алатын BIOS деректер аймағы орналасады. BIOS ( Basic In-Out System, базалық енгізу-шығару жүйесі) тұрақты есте сақтау құрылғысында сақталатын операциялық жүйенің бөлігі болып табылады. Бұл есте сақтау құрылғысы (ПЗУ BIOS) компьютердің жүйелік платасында орналасады және қоса салынған немесе «қорғаныс» бағдарламалық қамтама мысалы болады. BIOS функциясына компьютердің қосылу кезінде оның тестіленуі, оперативті жадыға  магниттік дискілерде сақталатын MS-DOS операциялық жүйесінің жүктелуі,сондай-ақ компьютерді штаттық аппаратурасын басқару – клавиатураны, экранды, дискіні және басқаларды басқару жатады. BIOS деректер аймағында хранятся разнообразные данные, используемые программами BIOS бағдарламаларымен жұмыс кезінде қолданылатын түрлі деректер сақталады. Бұл жерде орналасады:

- пернетақтаның кіріс буфері, мұнда қолданушының басқан пернелерінің кодтары түседі;

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

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

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

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

Жады аймағында 500h адресінен бастап MS-DOS операциялық жүйесі орналасады,ол әдетте бірнеше килобайтты алады. MS-DOS бағдарламасы, басқа да жүйелік құраушылар секілді компьютердің бастапқы жүктелуі кезінде жадыға автоматты түрде жазылады. Қалған барлық жады 640Кбайт шекарасына дейін кез келген жүйелік және қолданбалы бағдарламалар үшін жүктелуге бос. Сеанстың басында жадыға резиденттік бағдарламалар жүктеледі (русификатор, антивирустық бағдарламалар). Резиденттік бағдарламалар бар кезде бос жады көлемі азаяды.  640 Кбайт және 1 Мбайт шекара арасындағы үлкен немесе жоғарғы  жады деп аталатын қалған 384 Кбайт адрестік кеңістік (upper)  тұрақты есте сақтау құрылғыларын (ПЗУ) орналастыру үшін арналған. ПЗУ-ға адрестердің тек аз ғана бөлігі қарастырылған, ал қалғандары басқа мақсаттар үшін қолданылады. Үлкен жадының адрестік кеңістігінің бір бөлігі графикалық адаптердің графикалық және мәтіндік видеобуферін адресациялауға қарастырылған. Графикалық адаптер бөлек микросхеманы немесе бөлек платаны құрайды,оның құрамына жеке есте сақтау құрылғылары жатады(видеожады). Бұл есте сақтау құрылғысы компьютердің жедел жадысына еш қатысы болмайды, алайда оның басқару сызбалары A0000h...AFFFFh және B8000h...BFFFFh адрестер диапазонына бапталған,олар процессордың адрестік кеңістігі жадысына кіреді. Сол себепті кез келген бағдарлама осы адрестерге хабарласа алады, мысалы деректерді видеобуферге жазу, бұл экранда қандай да бір бейнені шығарады. Егер видеожүйе мәтіндік режимде болса, ал жазба мәтіндік видеобуфер  адресі бойынша орындалса, онда экранда қандай да бір символдардың бейнесі шығады (әріптердің, сандардың,түрлі белгілердің).  Егер де видеожүйені графикалық режимге ауыстырса және деректерді графикалық видеобуферге жазса, онда экранда бөлек нүктелер немесе сызықтар пайда болады. Сондай-ақ видеобуфер ұяшықтарының ағымдық құрамын да оқуға болады. Адрестік кеңістіктің ең соңында, F0000h...FFFFFh адрестер аймағында ПЗУ BIOS – тұрақты есте сақтау құрылғысы орналасады. Адрестік кеңістіктің бір бөлігі, C0000h адресінен бастап тағы бір ПЗУ-ға беріледі – графикалық адаптерлерге және дискілерге қызмет көрсетуге арналған BIOS кеңейтілу ПЗУ. Компьютердің құрамына стандартты жадымен қатар (640 Кбайт), оның кеңейтілген жадысы кіреді (extended), оның максималды көлемі 4 Гбайтқа дейін болуы мүмкін. Бұл жады адрестік кеңістіктің бірінші мегабайтынан тысқары орналасады және 100000h адресінен басталады. Машинада кеңейтілген жадының толық көлемі емес тек ондаған Мбайт немесе одан да аз болуы мүмкін. Кеңейтілген жадының функционерленуі «кеңейтілген жады спецификациясына» (Extended Memory Specification, қысқаша XMS) бағынатындықтан, жадының өзін де кейде XMS-жады деп атайды.Жоғарыда айтылып өткендей, кеңейтілген жадыға қол жеткізу қорғалған режимде іске асырылады, сол себепті тек нақты режимде жұмыс жасайтын MS-DOS үшінкеңейтілген жады қол жетімсіз. Алайда MS-DOS-тың қазіргі версияларында кеңейтілген жадыны қолдайтын HIMEM.SYS драйвері бар. Кеңейтілген жадыда электронда дискілерді (RAMDRIVE.SYS драйверінің көмегімен) немесе дискілік кэш-буферлерді (SMARTDRV.SYS драйверінің көмегімен) орналастыруға болады. Кеңейтілген жадының алғашқы 64 Кбайты, нақтырақ айтқанда 64 Кбайт - 16 байт адрестері l00000h-тан l0FFEFh-қа дейін,жоғарғы жады аймағы атауына ие (High MemoryArea, HMA). Бұл аймақтың жақсы жері ол бірінші мегабайттан тыс орналасса да оған микропроцессордың нақты жұмыс істеуі кезінде хабарласуға болады, ол үшін мегабайттық адрестік кеңістіктің ең соңындағы FFFFh сегменттік адресінен басталатын сегментті анықтап, А20 адрестік линиясын қолдануды рұқсат ету керек. Бұл сегменттің алғашқы 16 байтын ПЗУ алған, ал 0010h...FFFFh үзілулер аймағын бағдарламаларға және деректерге қолдануға болады. MS-DOS НМЛ-ге (директива файлы CONFIG.SYS DOS=HIGH)  өзінің біраз бөлігін жүктеуге мүмкіндік береді, нәтижесінде жүйемен бос емес болып тұрған стандартты жады аймағы айтарлықтай азаяды. Үлкен жадысына да сол HIMEM.SYS драйвері қызмет етеді, сол себепті НМЛ-де DOS-тың жүктелуі мүмкін, бірақ ол үшін HIMEM.SYS драйвері орнатылуы керек.Жоғарыда көрсетілген суреттен жоғарғы жадының BIOS кеңейтілуімен және видеобуферлермен толтырылмаған адрестік кеңістігінің бір бөлігі бос болады. Бұл бос аймақтарды кеңейтілген жадыға адресация ретінде қолдануға болады. Кеңейтілген жадының үлкен жадының бос адрестеріне көрсетілуін EMM386.EXE драйвері орындайды, ал кеңейтілгенмен толтырылған үлкен жадының аймақтарының өзі жоғарғы жадының блоктары деп аталады (Upper Memory B10cks, UMB). MS-DOS UMB-ға құрылғылардың орнатылатын драйверлерін,резидентті бағдарламаларды жүктеуге мүмкіндік береді. Жүйелік бағдарламалардың UMB-ға жүктелуі олардан стандартты жадыны босатады, бұл оның транзитті аймағын кеғейтеді. UMB-ға драйверлердің жүктелуі CONFIG.SYS DEVICEHIGH файл директивасы арқылы жүзеге асырылады ( DEVICE директивасының орнына), ал резиденттік бағдарламалардың жүктелуі -  DOS  10ADHIGH командасымен. Оптималды конфигурацияланған компьютерде жүйелік компоненттер негізгі жадының тек 20...25 Кбайтын алады, ал қалған барлық 620 Кбайт жады қолданбалы бағдарламалардың жүктелуі үшін қолданылуы мүмкін.

 

2. Жады және порттар, регистрлер. Микропроцессор командаларының жүйесі. Циклдар және шартты өтулер.

   

 Регистрлер микропроцессор нақты мақсаттарға қолданатын арнайы қызметтегі жады түрін құрайды. Регистрлер сандар сақтауға болатын 16-биттік он төрт орыннан тұратын жиын болып табылады. Олардың әрқайсысы микропроцессордың ішкі бөлігі болып табылады. Регистрлердің бірінші тобы әмбебап регистрлер деп аталады.Олар төртеу: AX, BX, CX және DX. Егер жұмыс үшін бұл регистрлердің тек жартысы ғана керек болса, бұлардың әрқайсысы үлкен және кіші ретті жартыларға бөлінеді жне АH және AL,  BH және BL және т.б. болып бөлінеді. Бұл әмбебап регистрлерде біздің компьютерге түсетін жұмыстң көп бөлігі орындалады.

  Келесі топ төрт регистрден тұрады, олар компьютер жадысында жолды табуға көмектесу үшін қолданылады.Бұл топтағы регистрлер сегменттік регистрлер деп аталады. Олардың әрқайсысы көлемі 64К болатын жады бөлігіне (немесе сегментке) қол жеткізуге көмектесу үшін қолданылады. Код сегменті (немесе CS регистрі) бағдарлама жадының қай жерінде орналасқанын көрсетеді. Деректер сегменті (немесе DS регистрі) бағдарлама қолданатын деректердің орналасқан жерін анықтайды, ал қосымша сегмент (немесе  ES регистрі) деректер сегментін толықтырады. Стек сегменті (немесе SS регистрі) компьютер стегінің орналасқан жерін анықтайды, ол кейін сипатталады.

Сегменттер регистрі жадының үлкен бөліктеріне (64К) қол жеткізу үшін қолданылса, регистрлердің соңғы тобы жадыдағы нақты бір байттарға жолды сілтеуге көмектесу үшін қолданылады. Олар сегмент регистрімен бірге жадыдағы нақты орынға көрсету үшін қолданылады. Мұндай регистрлердің бесеуі бар, олардың әрқайсысы нақты бір мақсатқа қолданылады. Команда көрсеткіші (инструкция) IP, оны тағы бағдарламалық есептегіш деп атайды РС, микропроцессорға бағдарламаның орындалып жатқан орнын ғана көрсетеді. Стек көрсеткіші SР және база көрсеткіші BP орындалып жатқан жұмысты бақылауға көмек көрсетеді. Индекс көзі SI және қызмет орны (шығыс)  DI біздің бағдарламаларға үлкен көлемді деректерді бір орыннан басқа орынға ауыстыру үшін қолданылады.

 Тағы бір регистр бар, ол жалауша регистрі деп аталады, ол алдында айтылған қалып-күй жалаушаларын фиксациялау үшін қолданылады. Түрлі жалаушалар біздің бағдарламаларға тек компьютердің қандай жағдайда екендігін хабарлайды: арифметикалық операциялар нәтижелері, үзілулер және басқа да жағдайлар рұқсат етілген ба.

 РС микропроцессорлары негізінд 1-биттік жалаушалардың кезектілігі арқылы басқарылады,олардың әрқайсысы компьютерде нақты бір жағдайды белгілейді немесе орнатады. Жалаушалар біріне-бірі тәуелсіз жұмыс жасайды, алайда ыңғайлылық үшін олар бірге жалауша регистріне жиналған. Бөлек жалаушалар арнайы командалармен тексеріліп немесе орнатыла алады, ал жалаушалардың бүкіл тобы барлық жалауша регистрлерін оқитын немесе орнататын командалар жұбымен оқылуы немесе орнатылуы мүмкін. Барлығы тоғыз стандартты жалаушалар бар. Олардың лтауы арифметикалық және оған ұқсас операциялардың нәтижелерін индикациялау үшін қолданылады: нөлдік жалауша ZF, нөлдік нәтижеге көрсетеді, таңба жалаушасы SF,теріс нәтижеге көрсетеді,тасымалдау жалаушасы CF, келесі позицияға өтуді көрсетеді,қосымша тасымалдау жалаушасы  AF,  алғашқы төрт битті тасымалдауға көрсетеді, толып кету жалаушасы  OF,  өте үлкен нәтижені алуды белгілейді және жұп жалаушасы PF, нәтиженің жұп немесе тақ екендігін белгілейді.

Қалған үш жалауша басқару үшін қолданылады. Бағыт жалаушасы   DF, опреацияның қайталануының бағытын басқарады (мысалы,деректердің байттық ауысуында): солдан оңға немесе керісінше.

Үзілулер жалаушасы IF, үзілулер мүмкіндігін бақылайды: олар рұқсат етілген бе немесе уақытша жоқ па. Ұстап алу жалаушасы TF, бір команданың орындалуынан кейін арнайы үзілудің «ұстап алу» компьютер генерациясын шақырады. Бұл тоғыз жалаушадан басқа РС ұрпағының АТ бұтағында қолданылатын жетілдірілген 286 микропроцессоры екі арнайы жалаушаның қолданылуына жол береді. Олардың біреуі  NT деп аталады, ішкі салынған тапсырмаларға қолданылады, ал басқасы екі битті IOPL жалаушасы, енгізу/шығару жеңілдіктерінің деңгейін басқарады.

Командалар жүйесі

Командалар жүйесін жобалау ЭЕМ құрылымына септігін тигізеді. Оптималды командалар жүйесін кейде мәселелі-бағдарланған қолданылу талаптарын аз қолданылатын командаларды іске асыруда аппараттық және аппаратты-бағдарламалы құралдардың артықтылығы минималды болатындай  қанағаттандыратын командалар жиыны ретінде анықтайды.ЭЕМ түрлі бағдарламаларында командалардың пайда болу жиілігі әр түрлі; мысалы DEC фирмасының деректері бойынша ЭЕМ арналған PDP-11 ұрпағының бағдарламаларында жіберу командасы MOV(B) көп кездеседі,оның үлесі бағдарламалардағы барлық командалардың шамамен 32% құрайды. Командалар жүйесін аз қолданылатын командаларға кететін шығын минималды болатындай етіп таңдау керек.

Статистикалық деректер болған жағдайда эффективті командалық жүйесі бар ЭЕМ құрастыруға (таңдауға) болады. Бұл мақсатқа жетудің бір жолы ұзындығы бір сөз болатын командаларды құрып, оларды кодтау болып табылады. Командалар жүйесін оптимизациялаудың тағы бір жолы микроинструкцияны қолдану болып табылады. Бұл жағдайда команданың бөлек биттері немесе биттер тобы бір комадалық циклде орындалатын бірнеше элементар операцияларды кодтау үшін қолданылады. Бұл элементар операциялар жадыға хабарласуды қажет етпейді, ал олардың іске асу кезектілігі аппаратты логикамен анықталады. Бағдарламаның орындалу уақытын қысқарту және жады көлемін азайту басқару логиксын қиындату есебінен жүзеге асырылады. Команданың маңызды сипаттамасы  оның форматы болып табылады, ол команданың құрылымдық элементтерін анықтайды, олардың әрқайсысы орындалу кезінде нақты бір түрде интерпритацияланады. Мұндай командалар элементтері (өрістері) ішінен келесілерді бөледі: орындалатын әрекетті анықтайтын операция коды; жады ұяшығының,процессор регистрінің, сыртқы құрылғының адресі; адресация режимі; тікелей адресацияны орындаудағы операнд; шартты өту командалары үшін сарапталатын белгілер коды.

Негізгі принциптері бойынша командаларды классификациялау 2.4 суретте келтірілген. Кез келген команданың форматының құрылымның элементі код операциясы болып табылады (КОП), ол орындалуы тиіс әрекетті анықтайды.Процессорда Коп саны көп болуы маңызды, себебі командалардың аппаратты іске асуы жадыны және уақытты үнемдейді. Бірақ ЭЕМ таңдауда қол жетімді адресация режимдеріндегі командалар санына ғана емес, нақты деректер типімен операцияның толықтылығына назар аудару керек. КОп-қа берілетін биттер саны орындалатын командалардың толық жиынынының функциясы болып табылады.

КОП-та барлық m командаларды кодтау үшін фиксирленген биттер санын қолданғанда КОП өрісінеекілік разрядтарды бөлу керек. Алайда, сөздің шекті ұзындығын мини және микроЭВМ ескере отырып,командалардың түрлі функционалды қызметі, операция нәтижесінің көздері және қабыладғыштары, сондай-ақ барлық командаларда жадыға және перефериялық құрылғыларға хабарласатын адрестік бөлік болмайтынын ескеріп, кіші ЭЕМ-дерде команданы кодтау үшін КОП өрісіне түрлі команда топтары үшін айнымалы бит саны бар кодтау принципі қолданылады.

Кейбір командаларда екі операнд қажет екіоперандты командаларға (немесе екіадресті) қарағанда тек бір операнд қажет және олар біроперандты командалар (немесе бірадресті) деп аталады. Екі операнд болған жағдайда командамен әдетте тек олардың біреуі ғана өзгертіледі. Ақпарат тек бір ұяшықтан алынатындықтан бұл ұяшықты көз деп атайды; құрамы өзгеретін ұяшық қабылдағыш деп аталады. Төменде См процессорлерінің екіадресті (екіоперандты) командалардың форматы келтірілген.

 

СМ процессорлерінің командаларының форматы:

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

б) бірадресті команда.

 

Циклдар және шартты өтулер

Бағдарламаның бір бөлігін бірнеше рет орындауға мүмкіндік беретін циклдер кез келгене тілде көп қолданылатын конструкциялардың бірі болып табылады.МП 86 команда жүйесінде циклдер loop (петля) командасымен орындалады,алайда басқа да циклдерді ұйымдастыру әдістері бар. Барлық жағдайда циклдағы қадамдар саны СХ регистрінің құрамымен анықталады,сол үшін максималды қадам саны 64К құрайды. Циклды ұйымдастырудың қарапайым мысалын қарастырайық. Бағдарламада көлемі 10000 сөз болатын массивке орын алынған болсын және бұл массивті 0-ден 9999-ға дейінгі натурал сандармен толтыру керек. Массивтік кезекті элементтерін толтыратын бұл сандар кейде толтырғыш сандар деп аталады. Бағдарлама келесі түрде болады:

Дайындау этапында біз ВХ регистріне массив басының салыстырмалы адресін саламыз, ол  array деген атқа ие, SI регистрінде массив элементінің бастапқы мәнін  (DI-ды да алуға болады) және толтырғыш санның бастапқы мәнін орнатамыз. Циклдың өзі үш командадан тұрады – команданың жалғыз құраушысы, толтырғыш санның массивтің келесі элементіне жіберілуі және де толтырғыш санның және массивтің келесі элементінің индексінің модификациясы. Аяқтаушы loop командасымен басқару  fill белгісіне беріледі және цикл СХ регистрінің құрамы қанша болса сонша рет қайталанады, біздің жағдайда 10000 қадам.Индексті модификациялау командасына назар аудару керек - әр қадамда SI құрамына 2 қосылады, себебі  массив екібайтты сөзден тұрады. Егер де байттық массивті толтыру керек болса, онда әр қадамда SI циклінің регистрінің құрамын 1-ге көбейтіп отыру керек болар еді. Loop командасының орындалуына қатысты біраз нәрсені айта кету керек. Бұл команданың іске асуы кезінде процессор алдымен СХ регистрінің құрамын 1-ге азайтады, ал одан кейін алынған санды нолмен салыстырады. Егер СХ > 0 болса, көрсетілген белгіге өту орындалады. Егер СХ = 0 болса, цикл ажырйды да процессор loop командасынан кейінгі командаға өтеді. Сорл себепті циклдан қалыыпты шыққанан кейін СХ регистрінің құрамы әрқашан 0-ге тең. Келесі жағдай loop командасының кодталуына байланысты. Оның кодында өту кодына жылжуға тек 1 байт беріледі. Жылжу таңбасы бар өлшем болуы тиіс болғандықтан loop командасымен басқаруды беруге болатын максималды қашықтық -128-ден +127 байтқа дейін болады. Басқаша айтқанда цикл денесі тек 128 байтпен шектеледі. Егер бағдарламаның циклдық қайталанатын үзіндісі үлкен ұзындыққа ие болса, циклды басқа, қиындау әдіспен ұйымдастыру керек болады.

Бұл үзіндіде біз цикл есептегішінің құрамын қолмен азайтамыз және алынған мәнді 0-мен салыстырамыз. Егер СХ = О болса,онда бұл циклде берілген қадамдар саны орындалған және je шартты өту командасымен бағдарламаның жалғасына өту жүзеге асырылуда деген сөз. Егер СХ әлі нолге тең болмаса jmp шартсыз өту командасымен циклдың басына қайту орындалады. Jmp командасы сегменттің кез келген нүктесіне өтуге мүмкіндік береді және циклдың денесіне қойылған шектеу алынып тасталады. Керек болған жағдайда сыртқы циклдың есептегішін ішкісі орындалып жатқан кезде сақтауға аранлған ішке салынған циклдарды ұйымдастыру үшін стекті пайдаланған ыңғайлы. Келесі үзіндіде ұзақтығы бірнеше секунд болатын уақытша тоқтау ұйымдастырылады.

 Бағдарламалық тоқтауларды бағдарламаны жөндеуде пайдаланғанда қолдану қолайлы, оның жұмысын баяулатып, оның бөліктік нәтижелерін көруге үлгеру үшін; кейде бағдарламалық тоқтаулар компьютерге қосылған аппаратураның жұмысын синхронизациялауға мүмкіндік береді. Жоғарыда келтірілген үзіндіде сыртқы цикл 2000 рет орындалады; ал ішкі – 65536 рет. Ішкі циклдың қадамдарын санау кезінде  бұрын да айтылған айналдыру құбылысы қолданылады. СХ регистріндегі бастапқы мән нолге тең; циклдың денесі 1 рет орындалғаннан кейін loop командасы СХ құрамын 1-ге азайтады, бұл FFFFh (оны -1 деп қарастыруға болады) санын береді. Нәтижесінде цикл тағы да 65535 рет қайталанып, ал жалпы – 64К қадам болады. Ішкі циклдың  loop командасы басқаруды өз-өзіне береді, яғни ішкі циклдың денесі  тек жалғыз ғана loop командасынан тұрады. Бұл жерде заңсыз ешнәрсе жоқ. Кез келген команда, loop командасы да өзінің орындалуы үшін қандай да бір уақытты қажет етеді және loop командасының 64К рет қайталануы қандай да бір уақыттық тоқталуды береді.Енді шартты өтулер командасын қарастырайық. Жоғарыда келтірілген үзіндіде ұзақ циклды орындау үшін je шартты өту командасы қолданылған болатын. МП 86 командалар жүйесінде қандай да бір шарттар бар болған жағдайда өтуді іске асыратын отыздан астам командалар бар: теңдеулер,теңсіздіктер, нәтидженің оң және терістілігі және т.б. Осы командалардың барлығының орындалуы кезінде процессор жалаушалар регистрі құрамын сараптайы және бөлек жалаушалардың немесе олардың комбинациясының жағдайына байланысты көрсетілген белгіге өтуді іске асырады (немесе іске асырмайды). Жалаушалар регистрі жағдайына көптеген процессордың командалары әсер ететіндіктен, шартты өту командаларын тек салытыру немесе сараптау командаларынан кейін емес, басқа да командалардан кейін бұл командалардың процессорге әсерін оқып алғаннан кейін қолдануға болады. Бірнеше абстрактілі мысалдар келтірейік:

Процессор регистрінде немесе жады ұяшығында жазылатын екілік сандарды оң сандар, яғни таңбасыз сандар ретінде қарастыруға болатын болады,немесе таңбасы бар сандар ретінде қарастыруға болады. Мысалы, ұяшықтар адресі теріс бола алмайды. Сол себепті  FFFFh саны,егер бағдарлама мағынасы бойынша ол адрес болса, 65535 деп белгіленеді.Егер сол сан FFFFh 1-ден 2-ні азайту арифметикалық операциясы  кезінде алынған болса, оны -1 деп қарастыру керек. Осы секілді таңба ұғымы символ кодтарына керек емес, олар  0...255 диапазонынан кез келген мәнді қабылдай алады. Басқа жағынан С другой стороны, мы можем условно считать, что коды символов первой половины таблицы ASCII кестесінің бірінші жартысының символдар коды оң,ал екінші жартысының одтары теріс. Шартты өту командаларының құрамында таңбасыз сандар (бұл командалар ja, jae, jb, jbc, jna, jnae, jnb және jnbe) мен таңбалы сандарды (jg, jge, jl, jle, jng, jnge, jnl және jnle) салыстыратын екі команда тобы бар. Бұл командалардың абривеатураларында таңбасыз сандарды салыстыру үшін above (жоғары) және below (төмен) сөздері, ал таңбасы бар сандарға - greater (үлкен) және less (кіші) сөздері қолданылады. Шартты өту командаларының бұл екі түрінің айырмашылығы таңбасы бар сандар үшін командалар -32К...0...+32К сандық өсінде қолданылатын «үлкен-кіші» ұғымын қолданады, ал табасыз сандар үшін  0...64К сандық осі қолданылады. Сол үшін бірінші командаларға 7FFFh (+32767) саны S000h (-32768) санынан көп, ал екіншілер үшін 7FFFh (32767) саны S000h (32768) санынан кіші. Таңбасы бар сандар үшін командалар 0 FFFFh (-1)-тен үлкен дейді , ал таңбасыз сандар үшін командалар – кіші. Шартты өту командаларын символдарды өңдеу үшін қолдануды қарастырайық. Біз пернетақтадан қандай да бір символдар қатарын енгізейік (мысалы, аты-жөні) және бағдарламада бұл символдар біз оны қалай енгізгенімізге қарамастан үлкен әріппен жазылуы керек.

Бағдарламаның басында экранға «Енгізіңіз!» деген қызметтік хабарлама шығады,ол қолданушыа адрестелген сұраныс болып табылады. Кейін DOS 3Fh функциясының көмегімен пернетақтадан қатарды енгізу орындалады. 3Fh функциясы деректерді түрлі құрылғылардан енгізе алады – файлдардан,порттан, пернетақтадан.  Түрлі құрылғылар олардың дескрипторымен идентификацияланады. Файлдармен жұмыс жасау кезінде әр файлдың дескрипторы осы ашу немесе құру процесі кезінде жүйемен құрылады, ал стандарттың құрылғылар үшін – пернетақта, экран, принтер және порттар үшін жүйенің жүктелуі кезінде осы құырлғыларға қыстырылатын дескрипторлар қолданылады. 

Пернетақтадан енгізу үшін 0 дескрипторы, ал экранға шығару үшін 1 дескрипторы қолданылады. 3Fh функциясын шақыру кезінде ВХ регистріне керекті дескрипторды енгізу керек, DX регистріне – пернетақтадан енгізілген символдарды қабыладуға арналған бағдарламадағы аймақ адресі, ал СХ регистріне – енгізіліп жатқан символдардың максималды саны. Біздің ойымызша қолданушы 80нен артық символ енгізбейді. Аз енгізуге болады; кез келген жағдайда қатарды енгізуді <Enter> пернесін басу арқылы аяқтау керек. 3Fh функциясы өңдеп болғаннан кейін АХ регистріне енгізілген символдардың нақты санын қайтарады (<Enter> пернесін басу кезінде  құрылатын 13 және 10 кодтарын да).  3.5 мысалда енгізілген символдар саны actlen ұяшығында кейін бағдарламада қолдану үшін сақталады. Actlen қадам цикліне әр енгізілген символды орыс әріптерінің шекарасымен салыстырып сараптау жүргізіледі.  Орыс қатарлы әріптері ASCII кодының екі диапазонында орналасады (а...п и р...с),  кіші  әріаке ауыстыру үшін олардың кодын 20h-қа азайтып отыру керек, ал екінші диапазоны әріптерді түрлендіру үшін 50h-қа. Сол себепті сараптау төрт салыстыру командасы сmр және сәйкес шартты өту командалары арқылы орындалады. Модификацияланған символ сол жерге buf буферіне жазылады. Сараптады аяқтағаннан кейін және енгізілген символдарды түрлендіріп болғаннан кейін buf құрамының экранға соңғы шығарылуы орындалады. Біз алдын ала қанша символ енгізілетінін білмегендіктен экранға шығару 40h функциясымен орындалады. 3Fh енгізу функциясындағы секілді,  40h шығару функциясы үшін де ВХ регистрінде енгізу құрылғысының дескрипторын көрсету керек, бұл жағдайда экранның, ал DX регистрінде -  шығарылатын қатардың адресі. Символдар коды таңбасыз сандар болып табылады және таңбасыз сандарға шартты өтуді қолдану дұрыс және жалғыз мүмкін жол болып табылады. Егер таңбалы және таңбасыз сандарғы үлкен-кіші ұғымын анығырақ қарастырсақ, онда біз қазір тек оң сандарды оң сандармен,теріс сандарды теріс сандармен салыстырып жатқанымызды байқауға болады, ja эквивалентті jg командасына, ал jb командасы эквивалентті jl командасына. Алайда мысалы, сандар коды мен орыс әріптерінің кодын салыстырғанда дұрыс нәтижені тек таңбасыз сандарға өту командалары арқылы ғана алуға болады. Таңбалы және таңбасыз сандардың айырмашылығы арифметикалық операцияларды қоладну кезінде, мысалы көбейту немесе бөлу операциялары кезінде көрінеді. Бұл жерде таңбалы сандар мен таңбасыз сандарға бөлек командалар қарастырылған:

mul – таңбасыз сандарды көбейту командасы;

imul – таңбалы сандарды көбейту командасы;

div -  таңбасыз сандарды бөлу командасы;

idiv - таңбалы сандарды бөлу  командасы.

 

Бұл командалардың айырмашылығын мысалмен көрсетейік.

Екі команда да, mul және imul, бұл жағдайда бірдей нәтиже береді, себебі оң таңбасыз сандар таңбалы сандармен сәйкес. Теріс сандарды көбейткенде бұлай болмайды.

Бұл жерде  mul және imul командаларының бір операндаға орындалатын әрекеті  түрлі нәтиже береді. Бірінші мысалда 252 ретінде интерпритацияланатын таңбасыз сан FCh 4-ке көбейтіледі,нәтижесінде таңбасыз 3F0 санын береді,яғни 1008. Екінші мысалда сол сан FCh таңбалы сан ретінде қарастырылады. Бұл жағдайда ол -4-ті құрайды. 4-ке көбейту FFF0h береді,яғни -16.

 

3. Санау жүйелері:  екілік, он алтылық. Сандарды бір жүйеден екіншігі ауыстыру: ондыққа,екілікке, он алтылыққа ауыстыру. Бөлшек сандарды ауыстыру. Таңбасы бар сандар. Машиналық команданың құрылымы. Команда операндтарын беру тәсілдері. Машиналық командалардың функционалдық классификациясы.

 

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

Екілік санау жүйесі — негізі 2 болатын позициялық есептеу жүйесі. Бұл санау жүйесінде натурал сандар не бары екі-ақ символдың көмегімен жазылады (олар әдетте 0 мен 1). Екілік жүйе сандық құрылғыларда қолданылады, себебі ең қарапайым және талаптарға сай болып табылады:

Жүйеде қаншалықты аз мән болса, соншалықты осы мәндермен операцияланатын бөлек элементтерді құрастыру да оңай. Екілік жүйенің екі саны көптеген физикалық құбылыстармен оңай көрсетілуі мүмкін: ток бар – ток жоқ, магниттік өрістің индукциясы алғашқы өлшемнен көп па жоқ па және т.б. Элементте жағдайлар саны қаншалықты аз болса, соншалықты оның бөгетке тұрақтылығы жоғары және тез жұмыс істей алады. Мысалы, үш жағдайды магниттік өрістің индукциясының өлшемі арқылы кодтау үшін екі алғашқы мәнді енгізу керек болады, бұл бөгетке тұрақтылыққа және ақпаратты сақтау сенімділігіне жағдай жасамайды.  

Екілік арифметика айтарлықтай оңай болып табылады. Көбейту мен қосу кестелері – сандарға жасалатын негізгі амалдар оңай болып табылады.  Сандарға биттік операцияларды орындау үшін логика алгебрасының аппаратын қолдану мүмкін.  Сандық электроникада екілік санау жүйесінде бір екілік разрядқа екі жағдайы бар (ашық,жабық) бір екілік логикалық элемент (шығысында логика бар инвертор) сәйкес келеді.

Сандарды түрлендіру

Екілік жүйеден ондыққа және кері түрлендіру үшін негізі 2 дәрежелердің келесі кестесін қолданады: 

512   256   128   64     32     16     8       4       2       1

1 санына бастап барлық сандар екіге көбейтіледі. 1-ден кейін тұрған нүкте екілік нүкте деп аталады. 

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

Сізге 110011 екілік саны берілген. Ол қандай санға эквивалентті? Бұл сұраққа жауап беру үшін ең алдымен бұл санды келесі түрде жазыңыз:

512   256   128   64     32     16     8       4       2       1

                                      1       1       0       0       1       1

                                      32     +16                      +2     +1

Содан кейін екілік нүктеден бастап солға жылжыңыз. Әрбір екілік бірліктің астына бір қатар төменге оның эквивалентін жазыңыз. Пайда болған ондық сандарды қосыңыз. Сонымен 110011 екілік саны 51-ге тең. 

Горнер әдісімен түрлендіру

Сандарды екілік жүйеден ондыққа бұл әдіспен  ауыстыру үшін сандарды солдан оңға қарай алдында алынған нәтижені жүйенің негізіне (бұл жағдайда 2-ге) көбейте отырып соммалау керек.   Мысалы,  1011011 екілік саны ондық жүйеге былай ауысады: 0*2+1=1 >> 1*2+0=2 >> 2*2+1=5 >> 5*2+1=11 >> 11*2+0=22 >> 22*2+1=45 >> 45*2+1=91  Яғни, ондық жүйеде бұл сан 91 болады. Немесе 101111 саны ондық жүйеге былай ауысады: 0*2+1=1 >> 1*2+0=2 >> 2*2+1=5 >> 5*2+1=11 >> 11*2+1=23 >> 23*2+1=47  Яғни, бұл сан ондық жүйеде 47 деп жазылады.

Бізге 19 санын екілік жүйеге ауыстыру керек болсын. Сіз келесі процедураны қолдана аласыз:

19 /2 = 9  қалдық 1

9  /2 = 4  қалдық 1

4  /2 = 2  қалдық 0

2  /2 = 1  қалдық 0

1  /2 = 0  қалдық 1

Сонымен, біз әрбір санды 2-ге бөлеміз де, қалдығына 1 немесе 0 жазамыз. Бөлуді бөлгіш 1 болғанша  жалғастырамыз. Қалдықтағы сандарды соңынан бастап бірінен кейін бірін жазамыз. Нәтижесінде 19 санынң екілік жүйедегі жазылуын аламыз: 10011.  

Горнер әдісімен түрлендіру

— бүтін санды негізі 10 болатын позициялық санау жүйесі. Әлемдегі ең ең тараған жүйелердің бірі. Сандарды жазу үшін көбінесе араб цифрлары деп аталатын  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,  символары қолданылады.

10 негізі адам қолындағы саусақтар санына байланысты деген ой бар. 

Позициялық ондық санау жүйесінің бұрынғы таныс жазбасы 595 жылы Индияда табылған. Ол кезед нуль тек Индияда ғана емес Қытайда да қолданылған. Бұл ескі жүйелерде бірдей сандарды жазу үшін символдар қолданылған, олардың жанына олар қандай тұрғандығы жазылатын. Одан кейін разрядтарды жазуды қойды, бірақ санды бәрібір оқуға болады, себебі әрбір разрядтың өзінің орны бар. Егер орын бос болса, оны нольмен белгілеу керек. Ежелгі вавилон мәтіндерінде бұндай белгі  пайда болды, бірақ оны санның соңына қоймаған.  Тек Индияда ноль өз орнын тапты, бұл жазба кейіннен бүкіл әлемге таралды. 

Индиялық нөмірлеу алдымен араб елдеріне, кейіннен Батыс Е Ол туралы орта азия математигі аль-Хорезми айтып берді. Позициялық жүйеде жазылған сандарды қосу мен азайтудың оңай әрі қолайлы ережелері оны өте танымалды қылды. аль-Хорезмидің  еңбегі арабша жазылғандықтан еуропада индиялық нөмірленуге дұрыс емес атау – «арабша» берілді. 

Ондық санау жүйесінде бір ондық разряд (дес.р) декада,децит деп аталады.  Сандық электроникада ондық санау жүйесінің бір ондық разрядына бір ондық триггер сәйкес келеді. 

Екілік компьютерлерде ондық сандарды екілік-ондық кодтауды қолданады, бір екілік-ондық цифра үшін төрт екілік разряд беріледі (екілік тетрада). Төрт екілік разрядтың 16 жағдайы болғандықтан екілік-ондық кодтау кезінде екілік тетраданың 16 жағдайының 6 қолданылмайды.  

Ондық санау жүйесі екі тәуелділіктің комбинациясы болып табылады. Әрбір разрядтың ішінде тәуелділік сызықты (1, 2, 3, ..., 9),ал разрядтар сызықты емес көрсеткішті  тәуелділікке ие (1, 10, 100, ...).

 Он алтылық санау жүйесі (он алтылық сандар) —  бүтін санды негізі 10 болатын позициялық санау жүйесі. Әдетте он алтылық сандар ретінде 0-ден 9-ға дейінгі ондық сандар және 10-нан 15-ке дейінгі сандарды белгілеу үшін А-дан Ғ-қа дейінгі латын әріптері қолданылады.

Сандарды он алтылық жүйеден ондыққа ауыстыру

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

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

5A316=5·162+10·161+3·160

=5·256+10·16+3·1=1280+160+3=144310

Сандарды екілік жүйеден он алтылыққа ауыстыру

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

Мысалы:

101101000112=0101 1010 0011=5A316

 

Сандарды ауыстыру кестесі                                                                                  0hex         =       0dec  =       0oct            0       0       0       0      

         1hex  =       1dec  =       1oct            0       0       0       1      

         2hex  =       2dec  =       2oct            0       0       1       0      

         3hex  =       3dec  =       3oct            0       0       1       1      

                                                                                                      

         4hex  =       4dec  =       4oct            0       1       0       0      

         5hex  =       5dec  =       5oct            0       1       0       1      

         6hex  =       6dec  =       6oct            0       1       1       0      

         7hex  =       7dec  =       7oct            0       1       1       1      

                                                                                                      

         8hex  =       8dec  =       10oct          1       0       0       0      

         9hex  =       9dec  =       11oct          1       0       0       1      

         Ahex =       10dec          =       12oct          1       0       1       0      

         Bhex =       11dec          =       13oct          1       0       1       1      

                                                                                                      

         Chex =       12dec          =       14oct          1       1       0       0      

         Dhex =       13dec          =       15oct          1       1       0       1      

         Ehex =       14dec          =       16oct          1       1       1       0      

         Fhex  =       15dec          =       17oct          1       1       1       1

 

4.  Жадыны қысқаша шолу. Жадының кіші адрестері. Кеңейтілген жады. Виртуалды жады. Блоктар тобы және үлкейген жады.

 

Кеңейтілген жады (ағыл. expanded memory) — негізгі жады жетпейтін MS-DOS қосымшаларының қосымша жадысына қол жеткізуге мүмкіндік беретін аппаратты-бағдарламалық жүйе.  Кеңейтілген жады жадының жоғарғы резервтелген аймағында (UMA) орналасқан терезесі арқылы беттей адрестеледі. Кеңейтілген жадының спецификациясы (ағыл. Expanded Memory Specification, EMS) 1984 жылы Lotus Software, Intel және Microsoft бірлестігінен құрылған. Сол үшін көбінесе LIM EMS қысқартуы кездеседі.1980 жылдардың соңынан 1990 жылдардың ортасына дейін EMS ойындарда және комерциялық қосымшаларда активті қолданылды. Алайда, қосымша жадының спецификациясы келгелі бері (XMS) аз қолданыла бастады. 

Сипаттама

IBM PC/XT  1 Мбайт адрестік кеңістігіне қол жетімді нақты режимде жұмыс жасайды. IBM негізгі жады үшін  640 Кбайтты қолдануды шешті , ал қалған 384 Кбайт ( 640-тан 1024 Кбайтқа дейінгі) ПЗУ және қосымша құрылғылар үшін резервтеді (см.: UMA).

Алайда  UMA-ның барлығы  қосымша құрылғылармен және ПЗУ-мен қолданылмайды. Сол үшін онда кеңеейтілген жадыға беттік қол жеткізуді ұйымдастыратын терезе бөлуге болады. Бағдарлама-драйвермен басқарылатын электронды сызба кеңейтілген жадының беттерін кез-келген уақытта терезеде тек бір ғана бет көрініп, қалғандары қол жетімсіз болатындай етеді.

Басында 64 Кбайт терезе алынған. Кейінірек басқару сызбасы модификацияланған. Терезе өлшемі нақты бір жүйеге байланысты эзгеруі мүмкін еді және онда бірден бірнеше бет көрсетіле алатын еді.

Құралдар

Кеңейту карталары

Басында кеңейтілген жады кеңейту карталарына – ISA-слотқа орнатылған электронды модульдерге  негізделген. Бұл модульдер жадыдан да, басқару сызбаларынан да тұрған.   1980 жылдары кең қолданысқа AST RAMpage, IBM PS/2 80286 Memory Expansion Option, AT&T Expanded Memory Adapter және Intel Above Board карталары ие болды.

Аналық платалар

Кешірек  Intel 80286 процессорлер негізіндегі аналық платаларда жады микросхемаларын орналастыруға болатын орындар пайда болды (ал кейін  SIMM-модулдеріне де). EMS басқару  сызбасы да аналық платада болды. Әдетте BIOS Setup-те EMS арқылы қанша жадыны қол жтімді етуге болатынын таңдауға болатын еді, ал қалғаны қосымша жады ретінде қол жетімді болып қалған.

Бағдарламалық эмуляция

Intel 80386 процессорының пайда болуымен EMS эмуляциялау (бағдарламалау арқылы ) мүмкіндігі пайда болады.

EMS-тің ең танымал менеджері Quarterdeck EMM және Qualitas 386MAX болады. Qualitas 386MAX кешірек  MS-DOS 4.01 EMM386.EXE рентінде қосылған.

Виртуалды жады — компьютердің жадысын адрестеу сызбасы, жады бағадрламалық қамтамаға үздіксіз немесе біртекті болып беріледі, ол нақтыда деректерді фактілі сақтау үшін жадының әр түрлерінің бөлек (резервті) аймақтары, қысқа уақытты (оперативті) немесе ұзақ уақытты (қатты дискілер) қоса қалдырады. Деректерді сыртқы есте сақтау құрылғыларында орналастырған жағдайда эжады, мысалы қатты дискіде арнайы бөліммен (partition) немесе қарапайым бөлімде бөлек файлмен берілуі мүмкін. Сондай – ақ виртуалды жадыны немесе деректерді дискіден алуды білдіретін swap(ағыл. swap, /swop/) термині бар.

Виртуалды жадының механизмін қолдану мүмкіндік береді:

Клиенттік бағдарламалық қамтамаларға жадыны адресациялауды жеңілдету;

Компьютердің оперативтік жадысында рационалды басқарады (онда жадының активті қолданылатын аймақтарын сақтайды);

Процестерді бірінен бірін ажыратады ;

Виртуалдық жадының беттік ұйымдастыру

Қазіргі операциялық жүйелердің көбісінде виртуалды жады беттік адресацияның көмегімен ұйымдасады. Оперативті жады беттері бөлінеді: белгіленетін жадының минималды бірлігі болып табылатын (яғни қосымшадан 1 байтқа сұраныс оған жады бетінің берілуіне алып келеді) фиксирленген жады ұзындығының аймақтары (мысалы 4096 байт). Процес жадыға виртуалды жадының көмегімен хабарласады, ол өзінде бет номерін немесе беттің ішіне жылжуда құрайды. Операциялық жүйе фиртуалды жадыны физикалыққа түрлендіреді,  керек болған жағдайда бетті қатты дисктен оперативті эжадыға жүктейді. Сұраныс жасағанда жадыны белгілеуге операциялық жүйе көп хабарласпаған беттерді қатты дискіге тастайды. Критикалық деректер (мысалы іске қосылған немесе жұмыс істеу бағдарламалар коды, жүйе ядросының жыдсы мен коды) әдетте оператыивті жадыда орналасады.

Microsoft Windows  операциялық жүйелерінде беттерді қатты дискілерде сақтайтын орын алдын ала белгіленуі керек. Қолданушы автоматты механизмге сене алады немесе өзі дискінің әр бөлімінде виртуалды жадының аймағының өлшемін көрсете алады. Операциялық жүйенің көрсетілген бөліктерінде оперативтік жадыдағы алынып тасталған беттерді сақтайтын керекті өлшемде pagefile.sys файлы құрылады. 

Виртуалды жадыны сегменттік ұйымдастыру

Негізгі мақала: жадының сегменттік адресациясы

Виртуалды кеңістік кез келген өлшемді бөліктерге – сегменттерге бөлетін виртуалды жадының ұйымдасытру механизмі. Бұл механизм, мысалы процес деректерін логикалық блоктарға бөлуге мүмкіндік береді.[1]  Әрбір сегмент үшін бет үшін секілді оған қолданушыны немесе оның процестерінң қол жеткізу ережелері берілуі мүмкін. Процестің жүктелуі кезінде сегменттердің бір бөлігі оперативті жадыға орналасады, ал екінші бөлігі дискілік жадыда орналасады. Бір бағдарламаның сегменттері оперативті жадад түрлі аймақтарда болуы мүмкін. Жүктелу кезінде жүйе процес сегменттернің кестесін құрады, онда әр сегмент үшін оперативті жадыдағы сегменттің бастапқы физикалық адресі,сегмент өлшемі,қол жеткізу ережелері,смодификация себептері немесе басқа да ақпараттар көрсетіледі. Егер виртуалды адресті кеңістіктер бір сегмент қосса ,онда бұл процестердің сегменттер кестесінде осы сегмент жүктелетін оперативті жады аймағына сілтеме жасалады.  Сегменттік ұйымдасытру жүйесі ьбғттік ұйымдастыру әдісіне каталогты функционерлейді: белгілі бір уақыт сайын жадыда керек сегменттердің жоқтығына байланысты үзілулер болып тұрады,жадыны босату керек болғна жағдайда кейбір сегментеттер шығарылады,операциялқы жадыға әр хабарласқан сайын виртуалды адрестеу физикалыққа түрленуі орындалады.Сонымен қатар жадыға хабарласу кезінде  керекті типтің берілген сегмнетке қол жеткізуге рұқсаты бар-жоғын текесереді.

Жадыны сегменттік ұйымдастыруда виртуалды жады жұппен берілуі мүмкін (g, s), бұл жерде g —  сегмент номенрі, ал s — сегменттегі жылжу.  Физикалық адрес сегменттер кестесінде g номері және s жылжу бойынша табылған. Бұл әдістің кемшілігі сегменттер деңгейіндегі фрагментациялауға немесе адресті түрлендіруде беттік ұйымдасуға қарағанда  баяулау.

Свопинг

Виртуалды жадыны іске асыру механизмдерінің бірі, бөлек қосылған процестер (әдетте активті емес) ОЗУ-дан қатты дискіге тасымалданады, осымен ОЗУ-ды басқа процестерді жүктеуге босатады. Бұл механизмнің беттіктен негізгі айырмашылығы процестер ОЗУ-мен қатты диск арасында толығымен тасымалданады,сол үшін кейбір процестер толығымен ОЗУ-да болмауы мүмкін. Процесті активизациялау шарты келгенде ол жады диспетчерінен шығаруды таңдауға арналған түрлі алгоритмдер бар сондай-ақ оперативті немесе дискілік жадыны жүктеліп жатқан процеске белгілеудің түрлі әдістері бар.

Шайкалту файлын фрагментациялау

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

Шайқалту файлын эффективті ұйымдастыру әдістері

swap‐файл үшін орын бөлудің бір тәсілі жадыны еселі белгілеу болып табылады, ол бойынша бұл файл көлемі 1,2,3-ке көбейтілген оперативті жадының көлеміне тең.

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

Қатты диск интерфейстің өткізгіштік қабілетін ескеру қажет (IDE/SATA). Шайқалту файлын оқу/жазудың ең жоғарғы жылдамдық бар дискіге орнатылуы керек.

  Windows-те кішігірім бөлімдерден оқу жылдамдығы NTFS[2]-ке қарағанда FAT32 көп, алайда  NTFS-тің бұзылуларға жоғарғы төзімділігін немесе қазіргі винчестерлердің мәндеріне байланысты, FAT32 бөлімдері аз қолданылады. 

Компьютере ОЗУ-дың біраз көлемі болса, (1 және одан көп гигабайт) және GNU/Linux және MS Windows ( Windows Vista-дан басқа) ОЖ қолдану арқылы шайқалтуды толығымен өшіруге болады. Windows Vista түрлі версияларын қолдану арқылы да шайқалтуды өшіруге болады, алайда бұл жүйенің ресур сиымдылығына 2 ГБ беттен аз емес физикалық жады керек емес.

Қосымша ақпараттар

Шайқалту файлынан (бөлімінен) ечсептеу жүйесінің жұмысында қолданылатын жасырын ақпаратты алуға болады. Сол үшін құпия деректермен жұмыс істеуде әдетте swap – ты тазалау жүргізіледі – мысалы, secure remove жиынынан sswap утилитасының көмегімен.

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

Жаңа бет үшін орын бөлгенде жадыда орналасқан бір бетті жою керек болып қалады. Беттерді орын басу ережелері жадыдан нақты қай бетті жою керектігі туралы шешім қабылдау үшін керек. Енді ешкімге қажет емес «өлі» бетті өшірген дұрыс. Егер де мұндай беттер болмаса, беттерді локалді немесе глобалді орын басу ережелері қолданылады:

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

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

Іздеудің ең көп қолданылатын критерилары:

Less Recently Used. Қол жеткізу ұзақ уақыт бұрын болған беттер өшіріледі. Last Recently Used. Жақында босаған беттер өшіріледі.

Кемшіліктер

Виртуалды жады деректерін сыртқы есте сақтау құрылғыларында орналастыру кезінде жадыға қол жеткізу баяулайды (оперативті есте сақтау құрылғыларына қарағанда). 

 

5. DOS модульдері. DOS негізгі компоненттері. ПЗУ-дағы BIOS жүйесі. Бастапқы жүктеу - IBMDOS.COM жүктеуші жазбасы.

 

Операциялық жүйелер

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

Unix-ұқсастар

UNIX-ұқсас жүйелерде swap көбінесе қатты дискінің бөлек бөлігінде орналасады, ол деректерге қол жеткізуді жылдамдатады, қарапайым бөлімде орналасқане swap-пен салыстырғанда. Сонымен қатар, swap-файлды қолдану мүмкіндігі де бар.

GNU/Linux үшін swap-файлды құру мысалы:

sudo dd if=/dev/zero of=/swap bs=1024 count=128K # swap үшін қажетті өлшемде файлды құру (ағымдық жағдайда 128 Мб)

sudo mkswap /swap # Файлдағы swap құрылымының инициалиязациясы

sudo /bin/sync # Дисктегі өзгертулерді алып тастау

sudo swapon /swap # swap қосу(өшіру - swapoff)

Microsoft Windows и Windows NT

Қатты дискінің облысы, свопингке арналған, бөлек файлда орналасады, шайқалту файлы деп аталатын, своп-файл (ағыл.swap file). Ол pagefile.sys деп аталады және С: дисктің түбір каталогында жүйе оны үнсіздікпен құрады. Келесіде пайдаланушы шайқалту файлының өлшемі және орналасуын басқаруына болады, мысалы, Басқару панелі, Жүйе пунктін қолдана отырып.

Windows 9x-те шайқалту файлы win386.swp деп аталады және Windows каталогында орналасады. System.INI файлының түзелтуінде оны Windows NT-мен бірге келесі қолдану үшін түбіртек каталогқа орналастыруға болады.

Енгізу-шығарудың базалық жүйесі (BIOS)

BIOS модулі әрбір есептеу жүйесі үшін дара және оны дайындаушымен қойылады. Бұл модульде келесі құрылғылардың аппараттық-байланысты драйверлері кездеседі:

Клавиатурасы бар консольды дисплей (СОМ).

Жол бойынша баспағы беру құрылғысы (РRN).

Байлыныстың тізбекті каналы (АUХ).

Сағаттар/күнтізбе (СLOCK).

Бастапқы жүктеудің дискілік құрылғысы (блоктық-бағытталған құрылғы).

BIOS тұрақты жадыда орналасқан (тұрақты есте сақтау құрылғысында, ПЗУ) джәне компьютер архитектурасында ерекше орынды алады. Бұл жүйені қарастыруға болады, бір жағынан, аппараттық құралдардың құрама бөлігі ретінде; екінші жағынан, BIOS DOS-тың бағдарламалық модульдерінің бірі болып саналады. Осы бағдарлама модуліне кіретіндер компьютердің өмірлік қабілеттілігін қолдау бойынша маңызды тапсырмаларды орындауды қамтамасыз етеді.

BIOS-тың бірінші функцияларының бірі – машинаны қосқан кездегі негізгі аппараттық компоненттерді автоматты түриде тестілеу, оперативті жадыны қоса алғанда (RAM - Random Access Memory). Егер жадыны немесе басқа да аппараттық компоненттерді тестілеу кезінде қате табылса, BIOS экранға сәйкес хабарламаны шығарады. Осымен машинаның жұмысы тоқтатылады және пайдаланушы жарияланған қатені жоюға шара қолдануы тиіс. BIOS-тың екінші маңызды функциясы, тестілеуден соң іске кірісетін, - DOS бастапқы жүктеуінің блогын шақыру. Сондықтан DOS – күрделі жүйе, бірнеше модульдерден тұратын, оны жадыға жүктеу бірнеше сатылардан тұрады; алғаш BIOS жүйелік дискіден оперативті жадыға бастапқы жүктеудің арнайы блогын жүктейді, сосын оған басқаруды жібереді, ол да, өз кезегінде DOS-тың басқа модульдерінің жүктелуін жүзеге асырады. BIOS-пен мұндай екі сатылы жүктеудің ұйымдастырылуы кезінде іздеу және DOS-тың әртүрлі модульдері баптаулары жайлы көмектер алып тасталынады. BIOS жақсы жұмысының ең бір шарты – бұл жүйелік дискінің фиксирленген орындарында бастапқы жүктеу блогының табылуы. Осымен ПК-да жүйелік дискі жіңішке немесе қатты дискінің ролін ойнауы мүмкін.

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

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

Логикалық, немесе процессорлық үзілулер стандартты емес жағдайлар кезінде туындайды негізгі процессор негізінде – нольге бөлу, регистрлерді қайта бөлу, «тоқтау нүктесі» пайда болуы және т.б.

Бағдарламалық үзілу – ең кең категория. Олар дағдыланады, бағдарлама басқа бағдарлама жағынан анықталған сервисті алға әрекеттенген кезде, ол сервис көбінесе аппараттық құралдар жұмысымен байланысты болады. Әрбір үзілудің өзінің бірегей номері бар және онымен анықталған ішкі бағдарлама байлынысты болуы мүмкін, туындаған жағдайда қызмет етуге шақырылған. Қызмет етуші ішкі бағдарламаның өзі, жалпы айтиқанда, басқа үзілудің әсерінен тоқтатылуы мүмкін, бірақ, ішкі бағдарлама жұмысы периодында жиірек, кейбір үзілулерге қызмет ететін, басқа үзілулер "маскаланады", яғни, бірден қызмет етпейді, тек кезекке қойылады. Сонымен, машинаның аппараттық компоненттерінде, DOS-тоың өзінде және қолданбалы бағдарламаларда үзілу дағдылануы мүмкін, қызмет етуге қажет болатын. BIOS-қа тапсырма жүктеледі, төменгі деңгейлі үзілуге қызмет ететін – аппарттық компоненттермен тікелей басқаруды қажет ететіндерді. Осы үзілулерге 0-ден 31-ге дейінгі (он алтылық номерлер 0 - 1F) номерлер меншіктелінген. Басқа үзілулер – 32-63 номерлерімен (оналтылық номерлер 20 - 3F) – жоғары деңгейге қатысты, және оларға қызмет ету DOS-тың басқа модульдеріне жүктеледі.

Осылай, BIOS ПК-ның аппараттық құралдар айналасында өзіндік бейнеге ие бағдарламалық қабықша болып табылады, басқа бағдарламаларға мүмкіндіктер ұсына отырып, сонымен қатар DOS-тың өзіне де, үзілу механизмі арқылы аппараттық компоненттерге байланыса отырып.

Бағдарламаларды ассемблерлеу (*.asm*-нен .com-файлды алу)

Сіз өзіңіздің ассемблерлік файлыңызды құрдыңыз. Айталық, сіз оны prog.asm деп атадыңыз. Онда:

  • Егер сіз Macro Assembler 5.00 - 5.10 версиясын (MASM 5.00 - 5.10) қолданатын болсаңыз:

Командалық жолда келесілерді көрсету қажет:

> MASM.EXE PROG.ASM /AT

Нәтижеде PROG.OBJ файлы құрылады, link.exe құрастырушы көмегімен құрастыру қажет:

> LINK.EXE PROG.OBJ /t

Құрастырушы PROG.COM құрады, оны орындалуға жібереді

  • Егер сіз Macro Assembler 6.11 - 6.13 версияларын (MASM 6.11 - 6.13) қолданатын болсаңыз:

Командалық жолда келесілерді көрсету қажет:

> ML.EXE PROG.ASM /AT

Нәтижеде екі файл құрылады: PROG.OBJ және PROG.COM. Prog.obj бізге енді қажеті болмайды, оны өшіруге болады, ал prog.com орындалуға жіберуге болады.

  • Егер сіз Turbo Assembler (TASM) қолдансаңыз:

Командалық жолда келесілерді көрсету қажет:

> TASM.EXE PROG.ASM

Егер prog.asm-де қателер кездеспесе, онда нәтижеде PROG.OBJ файлы құрылады, оны tlink.exe құрастырушы көмегімен құрастыру керек:

> TLINK.EXE PROG.OBJ /t /x.

Tlink.exe prog.com файлын құрады, оны кейін орындалуға жіберу қажет

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

  1. Tlink32.exe файлды компиляцияға жібермейді, қатені береді:
    Fatal: 16 bit segments not supported in module prog.asm;
  2. Ассемблер 32RTM.EXE файлын таба алмайды;
  3. LINK мынаны шығарады: LINK : warning L4021: no stack segment
  4. <Ассемблер қатені береді: **Error** prog4.asm(15) Near jump or call to different CS
  5. Ассемблерленген файл жұмыс істемейді: компьютер келеңсіз жағдайда қалады (бағдарлама қажет болғандай жұмыс жасай алмайды: шығарылатын жолдың орнына – қандай да бір түсініксіз символдар), бағдарламаны дұрыс тергенімен (нақты нақты, кітаптағы мысалдай)…

Tlink32.exe файлды компиляцияға жібермейді, қатені береді:
Fatal: 16 bit segments not supported in module prog.asm

TASM32.EXE және TLINK32.EXE - ассемблер және құрастырушы Windows ОЖ бағдарламаны жазуға арналған! MS-DOS ОЖ бағдарламаны ассемблерлеу үшін TASM.EXE және TLINK.EXE (MASM 6.11 ұсынамыз) қажет

Ассемблер (TASM.EXE) 32RTM.EXE файлын таба алмайды.
TASM 5.0 тек қана Windows ОЖ басқаруымен жұмыс істейді. Егер Windows сізде болмаса, онда TASM-ды ескі версиялардан (1.0 - 4.0) іздеуге тура келеді, MASM 5.10 версиясына дейін 32RTM.EXE файлы қосылған

LINK шығарады:

LINK : warning L4021: no stack segment Берілген жазба мынаны куәландырады, Сіз стекті *.EXE-файлда көрсетуді ұмыттыңыз. Егер сіз *.COM типіндегі бағдарламаны жазсаңыз, она *.EXE сияқты ассемблерлеңіз, *.COM-файл үшін қажетті параметрлерді түсіре отырып, онда берілген *.COM бағдарлама толық жұмыс істемейді. Егер Сіз *.EXE-файл құрсаңыз, онда осы жазбаны елеусіз қалдырыңыз, немесе стектің сегментін құрыңыз. *.COM-файлды алу үшін Қосымша № 01 (Ассемблирование) қараңыз

Ассемблер (TASM) қатені шығарады:

**Error** prog4.asm(15) Near jump or call to different CS Сіздің бағдарламаңызға CSEG segment жолынан кейін мынаны орналастырыңыз: ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG

Ассемблерленген файл жұмыс істемейді: компьютер келеңсіз жағдайда қалады (бағдарлама қажет болғандай жұмыс жасай алмайды: шығарылатын жолдың орнына – қандай да бір түсініксіз символдар), бағдарламаны дұрыс тергенімен (нақты нақты, кітаптағы мысалдай)…
Проблема мынада, Сіз *.COM-файлды жаздыңыз, оны *.EXE сияқты ассемблерлеңіз.

Үзілу функциялары

Үзілу 16h

Бұл үзілу BIOS (ПЗУ), MS-DOS емес (21h сияқты). Оны операциялық жүйе жүктелуіне дейін шақыруға болады, сол уақытта 21h үзілуі сияқты тек қана IO.SYS / MSDOS.SYS (яғни, MS-DOS ОЖ анықталған бөлігі) жүктелуінен кейін қол жеткізерлік.
10h функциясы – кез келген батырманы басқанға дейін бағдарламаны тоқтатады


Үзілу 20h

20h үзілуінің орындалуының нәтижесінде, бағдарлама өзінің орындалуға жіберілген (жүктелген, шақырылған) жеріне қайтады. Мысалы, Norton Commander немесе DOS Navigator-да. Осы үзілуді шақыру үшін регистрлердегі қандай да бір мәндерді көрсетудің қажеті жоқ


Үзілу 21h

09h функциясы жолды экранға шығарады, оның адресі DX регистрінде көрсетілген, курсордың ағымдағы позициясына.
3Dh функциясы файлдың ашылу үшін қызмет етеді
3Eh функциясы файлды жабу үшін қызмет етеді.

 

6. COMAND.COM файлы және ішкі командалар.Сыртқы командалар. DOS инициялизациясы

 

MS-DOS командалары туралы. MS-DOS командаларының типтері

 

Екі типті командалар бар:

- ішкі командалар;

- сыртқы командалар.

Ішкі командалар – ең қарапайым, көп қолданылатын командалар. MS-DOS жүйелік дискетасында сақталған файлдар тізімін қарастырғанда сіз бұл командаларды көрмейсіз. Олар  COMMAND.COM үлкен файлының құрама бөлігі болып табылады. Сіз ішкі команданы тергенде ол бірден орындалады.

 

MS-DOS келесі ішкі командалары бар:

 

Break     Del       Mkdir      Set

Chdir      Dir       Path       Shift

Cls         Echo    Pause     Time

Copy      Exit      Prompt   Type

Ctty       For      Rem        Ver

Date      Goto     Ren        Verify

If          Rmdir    Vol

Сыртқа командалар дискіде бағдарламалық файлдар секілді орналасады. Олар орындалмастан бұрын дискіден оқылуы керек. Кез келген кеңейтілуі .COM,.EXE немесе .BAT болған файлдар сыртқы команда ретінде қарастырылады. Мысалы, FORMAT.COM және DISKCOPY.COM командалары сыртқы командалар болып табылады. Барлық сыртқы командалар файлдарды құрайтындықтан сіз өзіңіздің командаларыңызды құрып,оларды MS-DOS-қа қоса аласыз.Сіз құрған барлық бағдарламалар (қолданылатын бағдарламалау тіліне қарамастан) .EXE кеңейтілуіне ие болады. Сыртқы команданы теруде файл атының кеңейтуін терудің қажеті жоқ.

MS-DOS келесі сыртқы командалары бар:

Assign       Link        Attrib        More

Backup      Print       Chkdsk      Recover

Command   Restore   Diskcopy    Share

Exe2bin      Sort       Find          Subst

Format       Sys        Join

DOS ішкі командаларын  command.com командалық процессоры орындайды.

DOS ішкі және сыртқы командаларын қолдану жүйелік бағдарламалау ортасына жатады.

1. Ағымдық дискжетектегішті ауыстыру командасы:

a: - a дискжетектегішке өту:

b: - b дискжетектегішке өту:

c: - c дискжетектегішке өту:

2. Каталогтың   мазмұнын шығару командасы: dir

Каталогтың мазмұнын экрандық (қатарлы) шығару, егер мазмұн өте үлкен болса: dir/p

dir a:\ -  а: дискіндегі  түпкі каталогтың мазмұнын шығару командасы.

dir>dir.txt командасы ағымдық каталогтың мазмұнын dir.txt мәтіндік файлы түрінде сақтауға мүмкіндік береді.Бұл бағдарламалардың жұмыс нәтижелерін мәтіндік режимде мәтіндік файлға жазудың жалпы ережесі. Мысал: ide.com > ide.txt.

3.  Ағымдық каталогты ауыстыру командасы: cd каталог аты

Ағымдық дискінің түпкі каталогына өту: cd\

Ішкі каталогтан каталогқа өту: cd..

4. Каталогты құру командасы: md  каталог аты

5. Бос каталогты жою командасы: rd  каталог аты

6. Мәтіндік файлдың құрамын экранға шығару командасы:

type  файл аты

7. Монитор экранын тазалау командасы: cls

8. Файлдарды көшіру командасы:

copy файл1 аты файл2 аты – бір файлды басқа файлға көшіру;

copy  файл аты каталог аты – файлды каталогқа көшіру;

copy файл аты prn -  файлды принтерде баспаға шығару.

9. Мәтіндік файлды құру:

copy con: файл аты, Enter басу, мәтінді қатармен енгізу,

әр қатардың соңында Enter, содан соң соңында F6 немесе Ctrl+Z және Enter.

10. Екі және одан да көп мәтіндік файлдардың құрамын біріктіру

(файлдардың конкатенациясы): copy 1-ші файл аты + 2-ші файл аты жаңа файл аты

11. Файлды жою командасы: del  файл аты немесе erase  файл аты

12. Файлдың атын өзгерту: ren файл аты файлдың жаңа аты

13. DOS версиясын шығару: ver

14. Диск белгісін шығару: vol

15. Ағымдық датаны шығару: date

16. Ағымдық уақытты шығару: time

17. Exit -  DOS командалық процессорынан шығу.

Ескерту: пернетақтадан көрсетілген командаларды командалық қатарға енгізіп болғаннан кейін  Enter пернесін басу керек.

 

DOS негізгі сыртқы командалары ( MS-DOS 6.22 версиясы үшін).

 

DOS сыртқы командалары С: дискісінде  DOS каталогында орналасқан қосымша бағдарламаларды (утилиталарды) орындайды.

  1. format диск аты: - дискіні форматтау (дискеттер үшін format a: немесе format b:).

Жүйелік дискіні құру: format  диск аты: /s

Мұқият болыңыз: дискіні форматтау кезінде ондағы ақпараттың барлығы жойылады!

2. fdisk – қатты дискіні бөлімдерге бөлу (логикалық дискілер С, D, E және сол сияқты).

Назар аударыңыз: қатты дискіні бөлімдерге бөлу кезінде ондағы барлық ақпарат жойылады!

3. sys диск аты: - DOS ядросының файлдарын дискіге (дискетаға) тасымалдау, жүйелік дискіні (дискетаны) құру. Сондай-ақ DOS ауыстыру (версиясын жаңарту) үшін қолданылады.

4. mem – жедел жадының картасын шығару. Көбінесе mem/c/p немесе mem/d/p (кілт p – ақпаратты беттеп шығару постраничный вывод информации) командалары қолданылады.

5. chkdsk c: /f – файлдық жүйені тексеру және жоғалған кластерлерді қалпына келтіру.

6. scandisk – файлдық жүйені және дискіні логикалық бұзылуларға тексеру. Дискеталар үшін scandisk a:  немесе scandisk b:

7. label диск аты: - дискідегі,дискетадағы белгіні құру немесе жаңарту.

8. undelete диск аты: - кездейсоқ өшірілген файлдарды қалпына келтіру.

9. diskcopy диск аты: диск аты:  - дискетаның нақты көшірмесін жасау.

 

10. print файл аты prn – файлды фондық режимде принтермен баспаға шығару. Фондық баспаға шығаруды болдырмау: print /t

11. graphics – ақпаратты экраннан баспаға шығаруды қолдау (Print Screen батырмасын басу кезінде).

12. defrag c: /fd – файлдардың фрагментациясын жою және қатты дискіде ақпараттың орналасуын оптимизациялау ( бұл бағдарлама Norton жиынындағы Speed Disk Utilities бағдарламасына аналогты).

13. deltree каталог аты – каталогтар ағашын жою.

Назар аударыңыз: Бұл команданы тек егер сіз каталогтар ағашын жоюға сенімді болсаңыз ғана қолдануға болады! Кері жағдайда  маңызды ақпарат жоғалады!

14. msd – компьютер  диагностикасы.

15. edit - MS-DOS Editor мәтіндік редакторын шақыру.

16. qbasic - BASIC бағдарламалау тілін шақыру.

17. doskey – командалық қатардың құрамын түзетуді жеңілдететін бағдарламаны шақыру ( DOS енгізу командаларын).

18. tree c:\ каталог аты /f  - көрсетілген каталогтың құрамын шығару.

19. msav – дискілерді MS-Antivirus антивирустық бағдарламасымен тексеру.

20. memmaker – жедел жадыны тарату оптимизаторы.

 

MS-DOS mem.exe утилитасы үшін командалар форматы:

 

mem - ОЗУ стандартты картасы;

mem/c/p  - жүктелген бағдарламалардың тізімін береді;

mem/d/p – ішкі құрылғылар туралы ақпарат береді (мысалы: con, prn, LPT1 және т.б.) ;

mem/f/p – адресациямен бос жады көлемі ;

mem/m бағдарлама аты – көрсетілген жүктелген бағдарлама алатын жады көлемі  (резидентті, com және exe кеңейтілуімен);

кілт /p ақпаратты беттеп шығаруды береді.

 

MS-DOS-та файлды құру

MS-DOS-та файл құру үшін керек:

1. Команданы командалық қатарға шығару: copy con: файл аты және Enter басу.

Мысалы: copy con: c:\mark\proba.txt

2. Мәтінді шығарып,F6 немесе Сtrl-Z басу, бұл қатардың соңын білдіреді, Enter басу.  MARK каталогында proba.txt файлы құрылады. Файлдың атын толық жолмен көрсету керек.

  1. Егер файл ағымдық каталогта құрылып жатса толық жолды корсетпеуге болады.

Мысал: copy con: name.txt және ары қарай М2 көрсетілгендей.

 

MS-DOS-та функционалды пернелер беру

F1 –буферден экранға бір символдап көшіреді.

F2 –буферден экранға барлық символдарды көрсетілген символға дейін көшіреді.

F3 –буферден экранға барлық символдарды көшіреді.

F4 –буфердегі символдарды нақты бір символға дейін өткізеді.

F5 –барлық символдарды экраннан буферге көшіреді, оларды команда ретінде орындауға тырыспайды.

F6 –қатардың соңын білдіреді (немесе CTRL-Z).

MS-DOS-тағы басқа пернелерқолданылмайды, бірақ көптеген қолданбалы бағдарламаларда қолданылады.

SUBST виртуалды дискісін құру командасын қолдану

МЕ каталогындағы файлдардан тұратын виртуалды диск құру үшін (мысалы Е) командалық қатарға жазу керек: subst e: c:\me немесе subst e: c:\mark\refis REFIS каталогындағы файлдар үшін. Е: дискісіне өту кез келген диск үшін жалпы ереже бойынша орындалады. Бұл кейбір кезде бағдарламаның іске қосылуын жеңілдетеді, Path командасына жаңа каталогты қоюға болмайтын кезде  ( Path командасында каталогтардың жалпы ұзындығы 128 байттан аспайды). Бұл команданы autoexec.bat файлына қоюға болады, онда виртуалды диск әрдайым орнатылатын болады. Subst командасы кеаталогтың аты үшін синонимді анықтау командасы деп аталады, көп қолданылатын каталогтың атын термеу үшін қолданылады. Е: виртуалды дискісінде файлдарды және каталогтарды құру және жою кезінде С: дискісіндегі МЕ каталогында да сол орындалатын болады.

Осындай жолмен екінші виртуалды  Ғ: дискісін құруға болмайды. Виртуалды дискіні құру кезінде жедел және дискілік жадыда айтарлықтай өзгерістер болмайды. Е: виртуалды дискіін жою командасы subst e: /d.  Subst командасы  DOS-тың сыртқы командаларына жатады.

DOS-тың кейбір ішкі командалары туралы.

Егер командалық қатарға echo және verify командаларын шығарса, онда олардың ағымдық жағдайын білуге болады: echo is on немесе echo is off; verify is on немесе verify is off.

Егер path командасын шығарса, онда path командасы autoexec.bat файлынан беріледі, яғни, path каталогында көрсетілген ағымдық каталогтар тізімі.

 Егер set командасын шығарса, онда оның ағымдық жағдайы көрсетіледі, яғни autoexec.bat файлының ортаның айнымалысына жататыны беріледі: path, prompt, set, және де сomspec=c:\command.com.

 

7. Ассемблердегі негізгі бағдарламалау. Ассемблердегі бағдарламаның өмірлік циклі. Бағдарламаның трансляциясы. Бағдарлама компановкасы. Ассемблер синтаксисы.

 

Assembler&Win32

Ассе́мблер (ағыл. assembler —жұмысшы-құрастырушы) — копьютерлік бағдарлама, машиналық кодтағы бағдарламаға ассемблер тілінде жазылған бағдарламаның бастапқы мәтінің компиляторы. Тілдің өзі секілді (ассемблердің) , ассемблерлер  нақты архитектураға, операциялық жүйеге және тіл синтаксисының нұсқасына спецификалық болып табылады. Сонымен бірге мулльтиплатформаланған және тіпті әмбебап (шектеулі әмбебап, себебі төменгі деңгейлі тілдедерде аппаратты – тәуелсіз бағдарламаларды жазуға болмайды) ассемблерлер, олар түрлі платформаларды және операциялық жүйелерде жұмыс істей алады. Соңғыларға сондай - ақ  кросс-ассемблерлер тобын бөлуге болады, олар басқа архитектураға және ОЖ – ға  орындалатын модульдерді (файлдарды) және машиналық кодты құрастыра алады.

DOS үшін ассемблерлер

DOS операциялық жүйесі үшін, ең танымал ассемблерлер Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM), және Watcom Assembler (WASM) болып табылады. Сонымен қатар кезінде қырапайым А86 ассемблері танымал болған.

Microsoft Windows

Microsoft Windows операциялық жүйесі пайда болғаннан кейін TASM32 деп аталатын  TASM кеңейтілуі пайда болды, ол Windows ортасында орындалатын бағдарламаларды жазуға мүмкіндік берді.  TASM соңғы нұсқасы MMX инструкцияларын қолдайтын TASM — 5.3, қазіргі уақытта Turbo C++ Explorer қосылған.  Бірақ ресми бағдарламаның  дамуы  толығымен тоқтатылған. Microsoft  Microsoft Macro Assembler деп аталатын өзінің өнімін қолдайды. Ол қазіргі уақытқа дейін дамып келеді, соңғы  версиялары  DDK жиынына қосылған. Бірақ DOS үшін бағдарламалар құруға  бағытталған  бағдарламаның  нұсқасы  дамып жатқан жоқ. Сонымен  қатар Стивен Хатчессон «MASM32» деп аталатын MASM- да бағдарламалау пакетін  құрды.

GNU және GNU/Linux

GNU операциялық жүйесінің құрамына binutils пакеті кіреді, ол өзіне AT&T синтаксисін қолданатын,  gas (GNU Assembler) ассемблерін қосады, басқа Intel-синтаксисінде  қолданылатын ассемблерге қарағанда. 

Тасымалдаушы ассемблер

Сонымен қатар ассемблердің ашық  жобасы  бар,  оның  версиялары түрлі операциялық  жүйелер үшін қол жетімді және осы жүйеге объекітік файыл алуға мүмкіндік береді. Бұл ассемблер NASM (Netwide Assembler) деп аталады.

Yasm —NASM версиясын басынан BSD лицензиясы бойынша жазылуы.

flat assembler (fasm) — жас ассемблер BSD-лицензиейсын қайта лицензиялауы үшін шектеу қоюдың модифицерленуі. KolibriOS, GNU/Linux, DOS және Microsoft Windows версиялары бар, Intel-синтаксисін ұстанады және AMD64 инструкмциясын қалайды.

RISC Архитектурасы

MCS-51

8051 — микроконтроллердің классикалық архитектурасы. Оған MetaLink корпарациясынан шыққан  кросс-ассемблер ASM51 бар.

AVR

Қазіргі уақытта Atmel (AVRStudio 3 и AVRStudio4)   өндірісінің  2 компиляторы бар. Екінші версиясы – онша емес біріншіні өзгерту. Сонымен бірге ассемблер WinAVR  құрамында да бар.

Ассембірлеу және компиляциялау

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

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

Ассемблер синтаксисі

Алмасу (секіру)

Мәліметтерді нақты өңдеу үшін ассемблерде бағдарламаның нақтылығы керек. Бұл шартты алмасуларды пайдалану арқылы мүмкін. Шартты алмасу бұл жалауша регистрінің жағдайына тәуелді кейбір адрестер бойынша басқару командасын процессорға беру, басқаша айтқанда секіру.  Бұл адрес ұзақ немесе жақын болуы мүмкін. Секіру келесі командадан 127 байт алдын немесе 128 байт кейін болатын болса ол жақын деп аталады. Ал ұзақ секіру бұл  [-128,127] осынша байт кейін секіру. Бағдарламаның кез-келген секіре бергені мағынасыз. Әрбір команда өз операциясының нәтижесіне байланысты жалауша регистрлерін өзгертіп отырады. Негізінен секіру командасының алдында нәтижесіне байланысты жалауша регистерлерін өзгертіп отыратын салыстыру командалары жүреді.салыстыру командасы екеу: cmp және test. cmp. кеңірек әмбебап. Test командасы жайында мен сіздерге кейінірек айтып берем.

Cmp командасы екі операнданы салыстырады. Ол екі мәнді салыстырып (регистр, жады, негізгі мән), егер олар тең болса  Z (zeroflag) нол жалаушасын орнатады:

     Cmp eax, ebx

     Cmp edx, 045567890h

     Cmp [ebx], esi

     Cmp byte ptr [VALUE1], 045h

Жалауша регистрі.

 Жалауша рфегистрі есептеу мен басқа оқиғаларға байланысты орнатылатын және тасталынатын жалауша жиынына ие болады. Ең негізгілерін қарастырамыз: 

ZF (Zero flag) Нол жалаушасы

Бұл жалауша есептеулер нәтижесі нол берген кезде орнатылады.   This flag is set when the result of a calculation is zero (салыстыру бұл сәйкес жалаушаларды орнату мен нәтижені сақтаусыз есептеу).

SF (Sign flag) Белгі жалаушасы

Егер орнатылған болса, онда есептеу нәтижесі – терістеу саны. 

CF (Carry flag) алмастыру жалаушасы

Алмастыру жалаушасы есептеуден кейін сол жақ шеткі биттен тұрады

OF (Overflow flag) Толу жалаушасы 

Есептеу нәтижесінің толғандығын көрсетеді, яғни нәтиже қабылдауышқа қарағанда жоғары. Жалаушалардың өте көптеген түрлері бар (паритет жалаушасы (pf), алмасудың көмекші жалаушасы (af), трассировка жалаушасы (tf), үзілу жадлаушасы (if), басқару жалаушасы (df), енгізу/шығару деңгейінің артықшылық жалаушасы (iopl) , қайта жаңарту жалаушасы (rf),  вертуалды режим жамлаушасы (vm)), бірақ біз оларды қолданбайтын болғанымыздан, мен олар жайында айтпайақ қоямын.

Секірулер.

Кең таралған jz шартты өту командасына мысал келтіремін:

Cmp eax, 42h

Jz metka2

Егер еах регистірі 42 тең болса, онда басқару metka2 белгісінен кейін бірінші командаға беріледі. 

Сонымен қамтар  jmp безуалды өту командасы бар. Ол басқаруды кез-келген жағдайда береді. «ол үшін call командасы керек». Мен жауап беремін: «call стекке қайтару адресін тығады, ал jmp стекке тиспейді». Шартты өтулер тек жақын секірулер жасай алады, ал jmp командасы қысқа және ұзын секірулер жасай алады. Барлық шатты өтулердің   кестелері осы.

Циклдарды ұйымдастыру. 

Кейде циклды ұймдастыру керек,  ЕСХ регистірінде көрсетілген бір өлшемінің қайталануын жасау қажет. Соған сәйкес цикл денесінде ЕСХ мәнін азайту керек. Дәл осыған loop  командасы арналған. Ол ЕСХ регистірінің  нөлге тең емеспа соны тексереді,  егер ол нөлге тең болса, онда ЕСХ регистірінің мәні 1 кеміп, операндада көрсетілген жылуға кіші секіру жасалынады.

Mov ecx, 023h

repeat:

 ……..; міндетті түрде кіші қашықтық

Loop repeat

Цмикл денесі 23h   реттен кейін орындалады. .

Loope командасы дәл солай жасайды, бірақ секіру алдында ZF жалаушасы орнатылғанба соны тексереді, орнатылған болса секіру жасалынады. Loopz командасыда дәл соны орындайды.  loopne ижәне loopnz командалары loope командасы не жасаса соны жасайды, бірақ секіруді ZF жалаушасы түсірілген болса жасайды. 

Ассемблер синтаксисы

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

 

1 сурет. Ассемблер сөйлемінің форматы 

 

2 сурет. Директива форматы

 

3 сурет. Команда және микрокоманда форматы

 

Бұл суреттердегі:

таңба аты – бағдарламаның ағымдық мәтінін білдіретін қосымшаның бірінші байтының адресі болып табылатын, идентификатор;

аты – бірдей директивалардың бір-бірінен ажырататын идентификатор;

операция коды (КОП) және директива – транслятор директивасы немесе машиналық микрокоманда, командаға сай мнемоникалық мән;

операнда – әрекеттер орындалатын обьектті білдіретін ассемблер директивасы немесе микрокоманда, команда бөлігі.  Ассемблер операндасы сандық және мәтіндік константалармен, таңба және кейбір сөздер мен операцияның белгілерін пайдаланумен айнымалы идентификаторларымен жазылады.

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

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

Бағдарламаның мәтінін жазу барысында символдар болып:

Барлық латын әріптері: A—Z, a—z. Сонымен қатар тақырыптық және қатарлық әріптер эквиваленттер болып саналады;

Сандар: 0 ден 9 дейін;

Белгілер:  ?, @, $, _, &;

Ажыратқыштар: . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^.

 Ассемблер сөйлемі өзімен транслятор үшін мәні бар, соңында рұхсат берілген символдардың синтаксистік бөлінбейтіндігімен көрінетін лексемнен құралады.

Лексем болып: идентификатор – бағдарламаның операция коды, айнымалы аты және таңба атауы секілді мәндерді қолданатын рұқсат етілген символдар нәтижесі. Идентификаторларды жазу ережесі келесідей: идентификатор бір немесе бірнеше символдан тұруы мүмкін. Символ ретінде латын әріптерін, сандар және кейбір арнайы белгілерді — _, ?, $, @ қолдануға болады. Идентификатор сан символынан басталмайды. Идентификатор ұзындығы 255 символ болуы мүмкін. Бірақ транслятор бастапқы 32 символын ғана қабылдап, қалғандарын қайтарады. Сонымен қатар трансляторға жазбалық символдар мен қатарлық символдарды ажыратуды немесес олардың айырмашылығын қабылдамауды көрсетуге болады.  Бұл үшін командалық қатардың опциялары қолданылады: /mu, /ml, /mx;

символ тізбектері – біреулік немесес екеулік тырнақшаларға алынатын символ нәтижесі; 

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

Ондық сандар өзінің теңеуі үшін қосымша символдарды көрсетуді талап етеді, мысал үшін 25 немесе 139. 

Оналтылық сандар өзінің жазылуында көптеген шарттарға ие:

Біріншіден, олар 0 ден 9-ға дейінгі сандардан, қатарлық және жазбалық латын әріптерінен: a, b, c, d, e, f немесе A, B, C, D, E, F.

Екіншіден, трансляторда оналтылық сандарды анықтауда қиындықтар туындауы мүмкін, себебі олар 0 ден 9-ға (мысалы 190845) дейінгі сандармен қатар, әріптерден (мысалы, ef15 ) де басталады. Трансляторға берілген лексема идентификатор немесе ондық сан емес екендігін түсіндіру үшін, бағдарламалаушы қандай да бір жолмен оналтылық санды ерекшелеп отруы керек. Бұл үшін оналтылық санның соңына «Һ» латын әріпін жазып отырады. Егер де оналтылық сан әріптен басталатын болса, онда  оның алдына алып жүруші нол жазылады: 0ef15h.

Осылайша, біз ассемблер бағдарламасы қалайша құрылатынын көрдік. Бірақ, бұл қарапайым беті ғана.

Негізінен әрбір сөйлем, оның үстінен кейбір әрекеттер орындалатын обьект жазбаларынан тұрады. Бұл әрекеттер операндалар деп аталады.

Оларды былай ажыратуға болады:

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

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

 

8. Бағдарламаны жөндеу және дайындау. Бағдарламаны жөндеу. МАКЕ утилитасы.

 

Бағдарламаны дайындау және жөндеу.

Ассемблер тілінде бағдарламаны жөндеу және дайындау процессі ағымдық мәтінді, трансляцияны, құрастыруды және жөндеуді дайындау кезеңдерінен тұрады.  Бағдарламаның ағымдық мәтінін дайындау кез-келген мәтіндік редактордың, ең болмағанда Norton Commander бағдарламасына тұрғызылған немесе одан да ыңғайлы редактор Norton Editor. Microsoft Word секілді заманауи мәттіндік процессорды қолдану барысында, бұл бағдарламалардың трансляторға түсініксіз болатын формат жайындағы қызметтік ақпаратты шығыс файлына қосатынын ескерген жөн. Алайда, негізінен барлық мәтіндік редакторлар мен процессорлар шығыс файлына ешқандайда қызметтік символдарсыз «таза мәтін» шығаруға мүмкіндік береді. Ал біздің жағдаймызыда дәл осы режимді пайдаланған жөн. Негізінен ағымдық мәтінді дайындау үшін Windows жүйесінің кез-келген редакторын қолдануға болады, мысалы, WordPad  бағдарламасымен немесе Блокнотпен. Бірақ бұл жағдайда орыс шрифтімен қиындықтар пайда болады. Мәлім болғандай,  Microsoft корпорациясы өзінің орысталынған өнімдері үшін DOS қосымшаларында қолданылатын стандарттармен  сәйкес келмейтін орыс символддарының жеке кодтарын қабылдаған. Орыс мәтіндерін коментарий ретінде қолданатын немесе оны экран бетіне шығаратын бағдарламаны Windows редакторларының бірінде дайындасақ, онда оны DOS ортасында жүктеу кезінде орыс әріптерінің орнына мағынасыз символдардың терімін көретін боласыз. Сондықтан да, MS-DOS басқарумен орындауға арналған бағдарламаларды  DOS ортасында да дайындаған дұрыс. Ағымдық мәтінді файл. ASM кеңейтілімге ие болуы керек. Келесі операция бағдарламаның ағымдық мәтінін трансляциялаудан, яғни ағымдық тілдің қатарларын машиналық команда кодтарына түрлендіруден тұрады. Бұл операция ассемблер тілінің трансляция көмегімен (яғни, ассемблер бағдарламасы арқылы) орныдалады. IBM, Borland, Microsoft корпорацияларының танымал бағдарламалық қамтамасыздандыру  өңдеушілері, өз мүмкіндіктері мен белгілеу жүйелерімен өзгешеленетін транслятор нұсқаларын ұсынады.  Алайда кез-келген транслятордың кіріс тілі  барлық ассемблер үшін бірдей, сондықтан да берілген кітаптың мысалдарын жөндеу және дайындау барысында көрсетілген кез-келген бағдарламамен пайдалануға болады. Алдын ескертіліп өткендей TASM 5.0 (бұл бағдарламалардың фирмалық атаулары   -         Turbo        Assembler,          Turbo Link және Turbo Debugger, ал атулар соларға сйәкес файлдар - TASM.EXE, TLINK.EXE и TD.EXE)  пакетінің бағдарламаларын қолданғанбыз.   Трансляциядан кейін екі файл пайда болады – трансляция листингі және .OBJ кеңейтілімді обьектті файл. Листинг өзімен қандай да бір редакторда оқуға арналған мәтіндік файлды ұсынады және команданың машиналық кодтарымен бірге трансляцияланған бағдарламаның ағымдық мәтінінен тұрады.  Транслятормен қандай да бір қателер табылған жағдайда листингке осы қателер жайындағы хабарламалар да қосылады. 4 суретте коментарилер бөлек қосымшаларға алынған  листингтің қысқартылған мәтінін келтірілген.  

 


4-сурет.  Бағдарлама трансляция листингі

 

Листингке қарай отырып, жалпы мінездеменің көптеген қажетті сәттерін айтып кетуге болады. Алдын айтылып өтілгендей assume, segment, ends, end  операторлы бағдарлама қосымшасы, қандай да бір машиналық кодтарға трансляцияланбайды және жадыдан көрінбейді. Олар тек ғана трансляторға команда (assume),  сегмент шекарасы (segment және end) және қатар жайындағы қызметті ақпаратты беріп отыру үшін қажет.

Бағдарламаның әрбір трансляцияланатын қосымшасына анықталған жылжу сәйкес келеді, сонымен қатар жылжуды орнату әрбір сегментте жеке орындалады. Бірінші команда mov AX,data команда сегментінің басынан нолге тең жылжуға ие. Ол 3 байт орын алады, сондықтан да келесі команда 3 байтынан басталып, сәйкес жылжуға ие болады.  Транслятор толығымен mov AX,data командасының кодын анықтай алмайды. Бұл командада АХ регистіріне data сегментінің сегменттік адресі жіберіледі. Алайда бұл адрес бағдарламаның орындалатын файлын жадыға жүктеу процесінде ғана танымал болады. Сондықтан да листинте осы адрестің орнына бұл орында белгісіз сегменттік адресс тұру керек екенін білдіріп тұратын,  s әрпімен белгіленген нол тұрады.  Тағын да бір ВА 0000 кодымен белгіленген команда 8 листингте орналасады. Бұл командада DX регистріне мәліметтер сегментінде (өріс атауының алдында орналасқан offset кілттік сөзі msg ұяшығының құрамы жайында емес оның жылжуы жайында айтатын болады ) орналасқан msg атымен өрістің жылжуы орналасады. Msg өрісі деректер сегментінің басында орналасқан және оның сегмент басынан жылжуы команда кодында көрсетілгендей  0 ге тең. Неге бұл команда relocatable  сөзінің қысқартылуы бола тұра т әрпімен белгіленген?

Бұл сұраққа жауап беру үшін бізге бағдарлама сегменттері жадыда орналасатынын көру керек.  Алдын айтылғандай кез-келген сегмент  жадыда 16 байттан кем адресте, яғни 16-байтты жады блогында орналаса алады. Жадыдағы бағдарламаның нақыт адресі, DOS алып отыратын өлшем, компьютер конфигурациясына тәуелді. Айталық, команда сегментінің сегменттік адресі 11Һ байт өлшемге ие (13 листинг қатарында көрсетілгендей), яғни бүкіл параграфты алып отырады және қосымша бір байт. Деректер сегменті 14Һ байт өлшемге (19 листинг қатары) ие және өзінің орналасуы үшін бір параграфтан көбіректі аталап етеді. Деректер сегменті параграф шекарасынан басталатындықтан оған 1308Һ сегменттік адресс беріліп, сегменттер арасында 15 байтты бос аралық пайда болады. Көпмегабайтты жадыдан 15 байтты жоғалту, әрине түкте емес, алайда кейбір жағдайларда ол маңыздырақ болады. 

 

 

5 сурет. Жадыда үнсіз келісім бойынша туралау (а) және байттау (б) кезінде бағдарлама сегментінің орналасуы.

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

data segment byte

Мұндай жариялау жүйеге деректер сегментін 5.б суретте көрсетілгендей етіп жүктеуге мүмкіндік береді. Деректер сегменті, оның соңғы параграфының (біздің жағдайымызда 1307Һ адревсі бойынша) шекарасынан бастап команда сегментін жартылай жабады. Деректер команда сегментінің соңғы командаларына орналасып қалмауы үшін, олар төменге қарап жылжып, команда сегментінен кейін басталады. Команда сегменті 1307Һ сегменттік адресіне 1 байтқа шыққан кездегі мысалымызда, деректерді осы 1 байтқа жылжыту керек. Нәтижесінде, деректер сегменті басталатын және листингте 0 жылжуға ие  msg өрісі, 1 жылжуға ие болады. Деректер сегментіндегі адрестер бір байт алға жылжиды. Нәтижесінде деректер физикалық жадыда командалардан кейін ешқандай бос орынсыз, тығыз орналасады. алайда, команда сегментіндегі барлық мәліметтерге  түрлендірулер сегменттерді жабу көлеміне түзетілуі керек, біздің жағдаймызда – 1 байтқа.  Бұл түзету жүйемен жадыға бағдарламаны жүктегеннен кейін орындалады, бірақ оны жүктер алдында. Көрсетілген түзетулерді талап ететін адрестер трансляция листингісінде «г» әрпімен белгіленеді. Айтылғаннан маңызды және күтпеген қорытынды шығады: жадыдағы бағдарлама командасының коды трансляция листингісінде көрсетілген кодтармен сәйкес келмеуі мүмкін. Бұл жағдайды, бағдарламаны, трансляция листингісіне үнемі сай келе бермейтін және жадыда не орналасқанын нақыт көрсететін интерактивті жөндеуші арқылы жөндеу кезінде ескеру керек. Трансляция листингісін қарауға қайтайық. Бізбен бағдарламаға енгізілген деректер де трансляцияланды: жүктелуші файлға мәтін символдарының орнына осы символдардың ASCII кодтары түседі. Сонымен, «П» әріпі 8Fh кодына, «р» әріпі ЕО кодына және т.с.с. түрленеді. Экран бетіне осы кодтарды шығару барысында компьютердің видеожүйесі оларды қайта бағдарламаның ағымдық мәтінінде жазылған символ бейнесіне айналдырады. Трансляция листингісінен жеке құралған бағдарламалардың өлшемін аңғаруға болады. Біздің жағдайымызда, команда сегментінің ұзындығы 11h = 17 байт құрайды, деректер сегментінің ұзындығы - 14h = 20 байт, ал стек астына  біз бағдарламадан қанша сұрасақ, сонша орналасқан - 100h = 256 байт. Ал жалпы бағдарламаның өлшемі сегмент ұзындығының мөлшерінен көбірек болады, біріншіден, сегменттер арасындағы бос аралықтардан (бізде оларға 15 + 12 = 27 байт кетеді), және екіншіден, бағдарламаға бағдарламаның міндетті 256байт өлшемге ие  префиксін қосу есебінен. Алдын айтып өткеніміздей, бағдарламаны трансляциялау нәтижесінде, екі файл пайда болады – листингпен және бағдарламаның обьектті модулі.

Обьектті файл транслятор жұмысының негізгі нәтижесі болып табылады және өзімен машиналық кодқа түрленген бағдарлама мәтінін ұсынады. Алайда бұл файлда команда кодтары бар, бірақ олар орындала алмайды.  Орындалатын бағдарламаны алу үшін, обьектілі файлды құрастыру керек.  Обьектілі файлды құрастыру құрастырушы (байланыс редакторы) бағдарламасының көмегімен орындалады. Бұл бағдарлама мұндай атқа ие болу себебі, оның негізгі қызметі – файлға файлдардың негізгі бағдарламасымен, ішкібағдарламаларын қосу және олардың арасындағы байланысты баптау. Алайда қарапайым, ішкі бағдарламалардан тұрмайтын бағдарламаларды да құрастыру керек. Себебі, құрастырушыда екінші бір функция бар – обьектілі файлдың форматын оперативті жадыға жүктелетін және орындалатындай етіп өзгерту және  түрлендіру керек.  Құрастырушы бағдарламасы бар файл негізінен LINK.EXE атына ие болады, алайда бұлай болмауы да мүмкін.  Мысалы, TASM пакетінің құрастырушысы TLINK.EXE деп аталады. Құрастыру нәтижесінде жүктелетін немесе  .ЕХЕ кеңейтілімімен орындалатын файл пайда болады. Дайын бағдарламаның жұмысын меңгеру және жөндеуді интерактивті жөндеушінің көмегімен орындаған жөн.  Интерактивті жөндеуші жөнделетін бағдарламаны қадам немесе тоқтау нүктелерімен орындауға мүмкіндік береді, экран бетіне регистр құрамын және жады аймағын шығарады, бағдарлама жадысына жүктелгенді модификациялауға және бағдарламаның орындалуын ыңғайлы формада басқаруға мүмкіндік береді. Қысқа түрде TASM пакетіндегі TD.EXE нің негізгі жұмыстарын қарастырамыз. Жөндеушімен жұмысқа кірісерде жұмыс каталогында жүктелуші (Р.ЕХЕ) және ағымдық (P.ASM) файлдар бар екеніне көз жеткізу керек, себебі жөндеуші өз жұмысында осы екі файлды да қолданады. Жөндеушіні жүктеу үшін келесі команданы енгізу керек

td р

Экран бетінде жөндеуші кадры пайда болады. Жөндеуші кадрында екі терезе – жөнделетін бағдарлдаманың ағымдық мәтінімен  Module терезесі және бағдарламаны орындау процесінде берілген айнымалылардың өзгеру қадамын бақылау үшін Watches терезесі (6 сурет). Watches терезесі бізге қажет емес, оны терезенің сол жақ жоғарғы бұрышындағы кішкентай шаршыға тышқанмен шерту арқылы алып тастауға болады немесе <Alt>+<F3> командасын енгізу арқылы. Терезелер арасындағы қосылу <F6> пернесінің көмегімен жүзеге асырылады.

 

6 сурет. Жөнделетін бағдардламаның мәтінімен жөндеушінің бастапқы кадры.

Бағдарламаны жөндеу процесінде экран бетіне көптеген қосымша терезелерді шығаруға тура келеді; олар бір-бірімен жабылып қалып, бір-бірін жиі жасырады. Олардың барлығын бір мезгілде көру үшін терезелер өлшемін кішрейтуге тура келеді, ал терезелердің өзін экран бойымен орналастыру керек. өлшемдерін өзгерту және терезенің орны <Ctrl>+<F5> командасымен қосылады, осыдан кейін бағытты пернелер терезелерді экран бойымен орналастырады, ал сол пернелер <Shift> пернесінің басулы тұрған уақытысында оның өлшемін өзгертуге мүмкіндік береді.  Терезе қалып-күйінің режимінен шығу <Enter> пернесін басу арқылы жүзеге асады.

Жөндеушінің бюастапқы терезесі бағдарламаны жөндеу үшін аз ақпарат береді. Онда бағдарламалар курсордың онадласқан жеріне (<F4> пернесі)  дейін командадан кейін команда (<F8> пернесі) бөліктеп орындалады. Сонымен қатар Watches терезесі арқылы деректердің берілген өрістерінің өзгеруін бақылауға болады.  Алайда  ассемблер тілінің дәрежесінде бағдарламаны жөндеу үшін жалаушалар регистрімен қоса процессордың барлық регистрлерін міндетті түрде бақылау керек, сонымен қатар көптеген жағдайда бағдарлама сыртында (мысалы, үзілістер векторын немесе жүйелік кестелер) деректер өрісін де.  Мұнан да ақпараттырақ болып жоғарғы мәзірмен  Vicw>CPU  пункті арқылы немесе <Alt>+<V>+<C>  командасымен шақырылатын «процессор терезесі» болып табылады (7 сурет).

7-сурет. Ішкітерезелермен процессор терезесі

 

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

DS және ES  сегменттік регистрлерінің құрамы бірдей және HF5h құрады. Бұл дегеніміз, бағдарлама 11F50 физикалық адресінен бастап, яғни 70-ші килобайтқа жақын жадыға жүктелген. Жадының алғашқы 70 Кбайты немен бос емес сонда? Негізінен компьютер қарапайым жадыда DOS (16 Кбайт көлемінде) тің аз ғана бөлігі кеңейтілген жадының қызметтік драйверлері және резидентті бөлім COMMAND.COM орналасатындай етіп конфигурацияланады. DOS тің негізгі бөлігі, қалған драйверлер және қажетті резидентті бағдарламалар кеңейтілген жадыға орналасады. бұл жағдайда жадының басындағы жүйелік аймақтар 20-25 Кбайт орынды ғана алады. Осыған қарамастан, біздің бағдарламамыз 25-ден емес 70-ші Кбайттан басталады. Бұл, бағдарламаның  бірінші жадыға өзі жүктелетін, кейін жөнделетін бағдарламаны жүктейтін жөндеушінің басқаруымен іске асырылғаны үшін осындай болды. егер де біз бағдарламаны жөндеушісіз іске қосқанымызда ол жадының басқа орнына, оның басна жақынырақ жерге түсер еді. Көптеген жағдайда бұл үлкен маңызға ие емес, себебі сүйікті бағдарламамыз жадының кез-келген жерінде сәтті орындалуы керек, алайда келесіні ескеру керек: жөндеуші бағдарламаның операциялық ортасын өзгертеді (жадыдан оны басқа жерге апарады). Нақты айтқанда, жөндеушінің басқаруымен бағдарлама DOS та орындалған секілді орындалмайды.

Жалпы қызметтегі барлық регистрлердің (АХ, ВХ, СХ, DX, SI, DI және ВР) құрамы 0 ге тең. Осы жерден қорытынды шығаруға болады, DOS бағдарламаны жадыға жүктей отырып, процессор регистрлерін тазалайды. Алайда шын мәнінде бұл олай емес! регистрлерді DOS емес, жөндеуші тазалайды.  Бағдарламаны қарапайым жүктеу кезінде регистрлер құрамы тамаша болып, олардың орнында нол болады деп айта алмайсың.

Сонымен бағдарламаны жадыға жүктегеннен кейін DS және ES регистрлерінің құрамы біркелкі болды. Бұл қарапайым жағдай, себебі орындалар алдында екі регистр де  бағдарлама префиксіне көрсетеді. Префикстен кейін команда сегменті орналасады және префикс үнемі нақты lOOh (яғни, 16 байтта 10h параграфтар) алып отқандықтан, CS құрамы біздің жағдайымызда HF5h + 10h = 1205h тең болуы керек. Бұл дәл осылай (7 сур. қара). Біздің мысалымызда бағдарлама begin белгісінен кейін орындалу керек, себебі дәл осы белгіні біз end аяқталушы директиваның операндасы ретінде көрсеттік. Бұл белгі команда сегментінің ең бірінші командасына жатады және оның мәні 0 ге тең болуы керек. Сондықтан да көрсеткіш командасының ағымдық мәні, 7 счуретте көрініп тұрғандай, 0 ге тең болуы керек. Ары қарай, команданы орындау кезінде, ІР мәні өседі. <F8> пернесін басу арқылы бастапқы екі команданы орындаймыз. Бұл операциядан кейін бағдарлама нәтижесі 8 суретте көрсетілген.

8 сурет. Алғашқы екі команданы орындағанна кейінгі бағдарлама жағдайы

Команда көрсеткіші 5 мәнін алғанын және келесі командаға,сәйкес адресі 5 ке тең  mov AH,09h көрсетеді. DS сегменттік регистрі 1207h мәніне ие болды, және ол деректер сегментінің сегменттік адресіне сәйкес келеді. Команда сегменті бізде 11h байт орын алып тұр және жадыдан 2 параграф талап етеді. Команда сегменті 1205h сегменттік адреске ие, осыған сәйкес деректер сегментінің сегменттік адресі 1207h қа тең болуы керек, бізге керегі де осы. Процессор жалаушаларының жағдайы көрсетілетін процессор терезесінің оң колонкасына мән береміз. Алдын айтылғандай, жалаушалар жағдайы әрбір команданы орындағаннан кейін процессормен қайта орнатылады және олармен қандай да бір жағдайда  команда нәтижесі жайында айтуға болады. Басынан ақ бізде тек ғана ІҒ (і жөндеуіш терезесінде) жалаушасы ғана орнатылған еді, бұл аппараттық үзілістердің өқосылған механизміне куә болады; ал қалған жалаушалар тасталынған.  Алғашқы екі команданы орындағаннан кейін жалауша регистрінің жағдайы өзгермеген. Себебі, сілтеме командасы movжалауша жағдайын өзгертпейді. Біздің бағдарламамызда mov және hit тан бюасқа ешқандай команда болмағандықтан, біздің мысалымыздағы жалаушалар регистрлерін функционирлеу арқылы бақылау мүмкін болмайды.

Енді стекті қарастырайық. Деректер сегментінің өлшемі бізде 14h байт және оның астында жадыдан 2 параграф бөліп алу қажет. Бұл стектің сегменттік регистрін SS - 1209п құрамын түсіндіреді. Стек астына 256 байт апарылған, сондықтан да SP ағымдық жағдайы 100Һ жылжуына сәйкес келеді. Енді add [bx+si],al біртүрлі командалармен толтырылған команда терезесінің төменгі бөлігіне назар аударалық. Мұндай командалар және осындай көлемде бздің бағдарламамызда жоқ және оларды команда сегментінің арасындағы аралықты және нолдермен толтырыдлған деректер сегментін деассемблерлеу үшін жөндеуші ойлап тапқан. 0000h коды жөндеуші жасап шығарған add [bx+si],al командасына сәйкес. Осылай сегменттік бағдарламалардың жадыда орналасуы жөніндегі және бағдарламаны жадыға жүктеу барысындағы процессор регистрінің инициализациялау жайында айтылған барлық  ойларды дәлеледедік.

Дамп терезесіне көңіл бөлейік. Жөндеушіні іске қосу барысында дамп терезесіне DS:0000h адресінен бастап жады құрамы шығады. Экран бетіне басқа нәрселер шығару үшін, процессордың ішкі терезесі үшін қосымша мәзір ашатын <Alt>+<F10> командасын пайдалану қажет. Бұл мәзірдің түрі команданы енгізу барысында қандай терезе белсенді болғанына байланысты. 9 суретте дамп терезесінің қосыша мәзірі көрсетілген.

9 сурет. Жадының дамп терезесінің қосымша мәзірі

Көбірек бұл мәзірдің бірінші пунктін Goto қолдануға тура келеді. Бұл пунктің көмегімен кез-келген адресті беріп және осы аймақтың дампын алуға болады. 10 суретте DS:0 түрінде бастапқы адресті енгізгеннен кейінгі дамп терезесінің құрамы бейнеленген. Күткеніміздей, осы адресте біздің жалғыз берілгеніміз, экран бетіне бағдарламамен шығарылатын - мәтін қатары орналасқан. Дамп терезесінде нолдермен толтырылған сегменттер арасындағы бастапқы аралық көрсетілген.

10 сурет. Деректер сегментінің дампы

 

9. Деректерді сипаттау. Қарапайым бағдарлама мысалы. Бағдарламаның талдануы. Ассемблердегі бағдарламаның өмірлік циклы. Ассемблердегі бағдарлама құрылымы.  Сегментация дерективалары. Ассемблер деректерінің қарапайым типтері. Бағдарламаның сегменттік құрылымы. 

 

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

 

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

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

3.Ассемблер тіліне бағдарламаны құруды жеңілдету үшін енгізілген күрделі типтегі деректер. Күрделі типті деректер (массивтер, құрылымдар, жазбалар, біріктірулер) базалық типтер негізінде құрылады. Күрделі типті деректерді енгізу  жоғарғы деңгейлі тіл мен ассемблердің айырмашылығын тегістеуге көмектеседі.

Жай типтегі деректер:

  • Байт -  0-ден 7-ге дейін номерленген сегіз кезекпен орналасқан биттер,0 биті ең кіші бит болып табылады;
  • Сөз – жүйелік адрестері бар екі байттат тұратын кезектілік. Сөздің өлшемі – 16 бит; сөзде биттер 0-ден 15-ке дейін номерленеді. Нольдік биттен тұратын байт кіші байт деп аталадығ ал 15-биттен тұратын байт – үлкен байт. Intel микропроцессорлары маңызды ерекшелікке ие – кіші байт әрқашан кіші адрес бойынша сақталады. Сөздің адресі оның кіші байтының адресі болып табылады.  Үлкен байттың адресі сөздің үлкен бөлігіне қол жеткізу үшін қолданылуы мүмкін. 
  • Екі еселенген сөз – жүйелік адрестер бойынша орналасқан төрт байттан (32 бит) тұратын кезектілік. Бұл биттерді номірлеу 0-ден 31-ге дейін жүргізіледі. Нольдік биттен тұратын сөз кіші сөз деп аталады, ал 31-биттен тұратын сөз – үлкен сөз деп аталады. Кіші сөз кіші адрес бойынша сақталады. Екі еселенген сөздің адресі оның кіші сөзінің адресі болып табылады. Үлкен сөздің адресі екі еселенген сөздің үлкен бөлігіне қол жеткізу үшін қолданылуы мүмкін.
  • Төрт еселенген сөз – жүйелік адрестер бойынша орналасқан сегіз байттан тұратын (64 бит) кезектілік. Биттерді ноиірлеу 0-ден 63-ке дейін жүргізіледі. Нольдік биттен тұратын екі еселенген сөз кіші екі еселенген сөз деп аталады, ал 63-биттен тұратын екі еселенген сөз – үлкен екі еселенген сөз деп аталады. Кіші екі еселенген сөз кіші адрес бойынша сақталады. Төрт еселенген сөздің адресі оның кіші екі еселенген сөзінің адресі болып табылады. Үлкен екі еселенген сөздің адресі төрт еселенген сөздің үлкен бөлігіне қол жеткізу үшін қолданылуы мүмкін.

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

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

Барлық дерективалар қатарлы мәндерді беруге мүмкіндік береді, бірақ жадыда олар сіз дерективада оларды қалай сипаттасаңыз солай көрінеді. Сол үшін қатарларды анықтау үшін  db дерективасын қолдануға тырысыңыз. Мұндай жолмен берілетін қатарлар тырнақшаға алынуы керек. Бұл тырнақшалар біреулік  (' ')  немесе екеулік  ("")  болуы мүмкін. Егер қатардың ішіне мұндай екі шектеуішті қатар қойса, онда бұл тырнақша қатардың бөлігі болу керек дегенді білдіреді.

Деректерді анықтау дерективалары

Жалпы жағдайда деректерді хабарлаудың барлық дерективалары мынадай синтаксиске ие:

[аты] директива dup_өрнек [,dup_өрнек]

dup_өрнек синтаксисінің параметрі келесі болуы мүмкін:

  • ?                     (инициялизацияланбаған деректер)
  • значение         (деректер элементінің мәні)
  • қайталаулар саны DUP(dup_өрнек [,dup_өрнек ]) ( массивтерді хабарлау және инициялизациялау)

Жай деректерді хабарлау мен инициялизациялау директиваларына жатады:

DВ (Define Byte) – байтты анықтау

 Db директивасымен келесі мәндерді беруге болады:

  • диапазоннан мән қабылдайтын өрнек немесе константаны:
  • таңбасы бар сандар үшін -128...+127;
  • таңбасы жоқ сандар үшін 0...255;
  • HIGH және LOW операцияларын қолданатын 8-биттік салыстырмалы өрнек;
  • Бір немесе бірнеше символдардан тұратын символдық қатарды. Қатар тырнақшаға алынады. Бұл жағдайда қатарда қанша символ болса, сонша байт анықталады.

 DW (Define Word) – сөзді анықтау

 Dw директивасымен келесі мәндерді беруге болады:

 -  диапазоннан мән қабылдайтын өрнек немесе константаны:

        таңбасы бар сандар үшін -32768...32767;

        таңбасы жоқ сандар үшін 0...65535;

-  16 немесе одан аз бит алатын өрнек туралы,  ол ретінде 16-биттік сегменттегі жылжу немесе сегмент адресі қолданылуы мүмкін;

-  Тырнақшаға  алынған 1- немесе 2-байттық қатар.

DD (Define Double word) – екі еселі сөзді анықтау

 Dd директивасымен келесі мәндерді беруге болады:

-  диапазоннан мән қабылдайтын өрнек немесе константаны:

8086 үшін:

      таңбасы бар сандар үшін -32768...+32767;

      таңбасы жоқ сандар үшін 0...65533;

 i386 және жоғары үшін:

       таңбасы бар сандар үшін -2147483648...+2147483647;

        таңбасы жоқ сандар үшін 0...4 294 967 295;

-  16-биттік сегмент адресінен  және 16-биттік жылжудан тұратын салыстырмалы немесе адресті өрнек;

-  тырнақшаға алынған ұзындығы 4 символдан тұратын қатарды.

DQ (Define Quarter word) – төрт еселенген сөзді анықтау

DQ директивасымен келесі мәндерді беруге болады:

-  диапазоннан мән қабылдайтын өрнек немесе константаны:

          МП i8086 үшін:

                таңбасы бар сандар үшін -32 768...+32 767;

                таңбасы жоқ сандар үшін 0...65 535;

        МП i386 және жоғары үшін:

                таңбасы бар сандар үшін -2 147 483 648... +2 147 483 647;

                таңбасы жоқ сандар үшін 0...4 294 967 295;

-  32 немесе одан аз биттен  ( i80386 үшін) немесе 16 немесе одан аз биттен тұратын (Intel микропроцессорларының кіші модельдері үшін) салыстырмалы немесе адрестік өрнек;

-  таңбасы бар константаны -2**63...2**63 - 1 диапазоннан;

-  таңбасы жоқ константаны 0...2**64 – 1 диапазоннан;

-  тырнақшаға алынған ұзындығы 8 символдан тұратын қатарды.

DF (Define Far word) – алыс сөздің көрсеткішін анықтау

DP (Define Pointer) /I  48 бит көрсеткішін анықтау

DF және DP директиваларымен келесі мәндерді беруге болады:

 -  диапазоннан мән қабылдайтын өрнек немесе константаны:

        8086 үшін:

                таңбасы бар сандар үшін -32 768...+32 767;

                таңбасы жоқ сандар үшін 0...65 535;

        i386 және жоғары үшін:

                таңбасы бар сандар үшін -2 147 483 648...+2 147 483 647;

                таңбасы жоқ сандар үшін 0...4 294 967 295;

-  32 немесе одан аз биттен  ( i80386 үшін) немесе 16 немесе одан аз биттен тұратын (Intel микропроцессорларының кіші модельдері үшін) салыстырмалы немесе адрестік өрнек;

-  16-биттік сегменттен және 32-биттік жылжудан тұратын адрестік өрнек;

-  таңбасы бар константаны -2**47...2**47 - 1 диапазоннан;

-  таңбасы жоқ константаны 0...2**48 - 1 диапазоннан;

-  тырнақшаға алынған ұзындығы 6 символдан тұратын қатарды.

DT (Define Ten Bytes) - 10 байт анықтау

DT директивасымен келесі мәндерді беруге болады:

-  диапазоннан мән қабылдайтын өрнек немесе константаны:

        8086 үшін:

                таңбасы бар сандар үшін -32 768...+32 767;

                таңбасы жоқ сандар үшін 0...65 535;

        i386 және жоғары үшін:

                таңбасы бар сандар үшін -2 147 483 648...+2 147 483 647;

                таңбасы жоқ сандар үшін 0...4 294 967 295;

-  32 немесе одан аз биттен  ( i80386 үшін) немесе 16 немесе одан аз биттен тұратын (Intel микропроцессорларының кіші модельдері үшін) салыстырмалы немесе адрестік өрнек;

-  16-биттік сегменттен және 32-биттік жылжудан тұратын адрестік өрнек;

-  таңбасы бар константаны -2**79...2**79 - 1 диапазоннан;

-  таңбасы жоқ константаны 0...2**80 - 1 диапазоннан;

-  тырнақшаға алынған ұзындығы 10 символдан тұратын қатарды;

-   0...99 999 999 999 999 999 999 диапазонындағы қапталған ондық константаны.

Жадыны массив астына резервтеу үшін DUP директивасы қолданылады

area            dw     128 dup(?) ; көлемі 128 сөз болатын жады резервтеледі

string db     50 dup(‘*’) ; қатар ‘*’ символ кодымен толтырылады

array dw     256 dup(128)       ; 256 сөзден тұратын массив 128 санымен инициализ.

db     3 dup(5 dup(8))   ;15 сегіздік

Turbo Assembler-де идентификаторға мәнді меншіктеу үшін қолдануға болатын екі директива бар: EQU және “=”. EQU директивасын қолдану кезінде идентификаторларға қатарлы да, сандық та мәндер беруге болады:

EQU аты өрнек

Бұл жерде «өрнек» лақап ат, сан немесе қатар болуы мүмкін

         psevd         equ    ax, @data            ;лақап ат

         numb          equ    23*5                    ;сан

         str               equ    ‘my string’ ;қатар

EQU басқа директивасының көмегімен идентификаторды қайта анықтау егер оған бұрын қатарлы мән берілген болса жүзеге асырылады. 

Директива = тек қана сандық мәнді беру үшін қолданылады.

 аты = өрнек

аты идентификаторына өрнекті есептеу нәтижесі меншіктеледі.  Өрнек константа немесе салыстырмалы сегменттің адресі болуы мүмкін және жаңа идентификатор немесе =директивімен анықталған идентификатор болуы мүмкін

var1=45

var2=var1+5*34-21

var1=50

EQU және “=”  директивалары жадыға резервтелмейді.

Мысалдар:

1. Деректерді анықтау директиваларын қолдану мысалы

dat     segment para 'data'

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

v1db         db   ?                                        ; инициализацияланбаған

v2db         db   'Сіздің тегіңіз'        ;символдық қатар

v3db         db   56                                      ;ондық константа

v4db         db   04fh                         ;он алтылық константа

v5db         db   0110100b                ;екілік константа

v6db         db   1,'dat','name',42       ;кесте

v7db         db   8 dup(0)                   ;сегіз ноль

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

v1dw         dw   aff3h                       ; он алтылық константа

v2dw         dw   01101111               ; екілік константа

v3dw         dw   v5db                       ;адрестік константа

v4dw         dw   24,5,7                     ;3 константа

v5dw         dw   3 dup(*)                 ;3 жұлдызша

;екі еселенген сөзді анықтау

v1dd         dd       ?                                    ;анықталмаған

v2dd         dd       'FAdf'                   ;символдық қатар

v3dd         dd       08234                  ; ондық константа

v4dd         dd       v3dw-v4db         ;адрестердің түрлілігі

v5dd         dd       017h,05fh           ;екі константа

;төрт еселенген сөзді анықтау

v1dq         dq       ?                                    ;анықталмаған

v2dq         dq       a83dh                   ;константа

;он байтты анықтау

v1dt         dt       'Family'                 ;символдық константа

d1     equ    25

d2     =       v3db

d1     equ    d2

dat          ends

             end

қарапайым деректерді сипаттау директиваларының көмегімен хабарланған кез-келген айнымалыға ассемблер үш атрибутты меншіктейді:

  1. Сегмент (seg) -  айнымалыдан тұратын сегменттің басының адресі.
  2. Жылжу (offset) байтта айнымалысы бар сегменттің басынан.
  3. Типі (type) – Деректерді хабарлау директиваларына сәйкес айнымалымен берілетінжадының санын анықтайды..

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

Бағдарлама -калькулятор:

Он алтылық сандарды қосу және азайту

0100 CALL 0171     сұраныс –бірінші санның филтрі

0103 MOV  BH,AL    BH-тағы бірінші санның көшірмесі

0105 MOV  AH,08

0107 INT  21

0109 CMP AL,2B сұраныс – операция таңбасының филтрі: "+" немесе " "

010B JZ   0111     2Bh - "+"

010D CMP  AL,2D    2Dh - "-"

010F JNZ  0107

0111 MOV  AH,02

0113 MOV  DL,AL

0115 INT  21

0117 MOV  DH,DL    DH-тағы операция таңбасының көшірмесі

0119 CALL 0171     сұраныс – екінші санның фильтрі

011C MOV  BL,AL    BL-дағы екінші санның көшірмесі

011E MOV  AH,08

0120 INT  21

0122 CMP  AL,3D    сұраныс -  "=" (3Dh) таңбасының филтрі

0124 JNZ  0120

0126 MOV  DL,AL

0128 MOV  AH,02

012A INT  21

012C CMP  DH,2D    операция таңбасын тексеру

012F JZ   013A     еегер "-" 13Ah-қа өту болса

0131 ADD  BL,BH    сандарды қосу

0133 CMP  BL,0F    операция нәтижесін тексеру

0136 JLE  0157     егер бір разряд болса онда 157h

0138 JA   014E     егер екі разряд болса 14Eh

013A CMP  BH,BL    азайту үшін тексеру

013C JB   0144     өту, егер BH < BL

013E SUB  BH,BL    егер BH > BL, онда BH - BL

0140 MOV  BL,BH

0142 JMP  0157     баспаға шығаруға өту

0144 SUB  BL,BH

0146 MOV  AH,02    егер нәтиже теріс болса,

0148 MOV  DL,2D    онда қатарға "-" таңбасын қосу

014A INT  21

014C JMP  0157     баспаға шығаруға өту

014E MOV  DL,BL

0150 MOV  CL,04

0152 SHR  DL,CL

0154 CALL 0161

0157 MOV  DL,BL

0159 AND  DL,0F

015C CALL 0161

015F INT  20

===========================

0161 ADD  DL,30    Процедура: "символы экранға шығару"

0164 CMP  DL,3A    символ коды DL регистріне беріледі

0167 JL   016E

0169 ADD  DL,07

016C MOV  AH,02

016E INT  21

0170 RET

===========================

0171 PUSH DX       Процедура: " hex-цифраны енгізу-фильтрі"

0172 MOV  AH,08    енгізілген сан AL регистріне қайтып оралады

0174 INT  21

0176 CMP  AL,30

0178 JB   0174

017A CMP  AL,46

017C JA   0174

017E CMP  AL,3A

0180 JB   0186

0182 CMP  AL,41

0184 JB   0174

0186 MOV  AH,02

0188 MOV  DL,AL

018A INT  21

018C SUB  AL,30

018E CMP  AL,09

0190 JLE  0194

0192 SUB  AL,07

0194 POP  DX

0195 RET

Бағдарламаның сегменттік құрылымы

Жоғарыда көрсетілгендей жадыға хабарласу сегменттердің – физикалық адрестеу кеңістігінің кез-келген аймағына қойылатын логикалық түрлендірулердің көмегімен жүзеге асырылады. 16-ға бөлінген, яғни кіші он алтылық цифрасыз сегменттің бастапқы адресі сегменттік регистрлердің біріне енгізіледі; содан кейін берілген сегменттік адрестен басталатын жады аймағына қол жеткізе аламыз. Қалайша жады сегменттері ұғымы бағдарлама құрылымында көрінеді? Бағдарлама құрылымы бір жағынан процессор архитектурасымен (егер жадыға хабарласу тек сегменттердің көмегімен жүзеге асырылса, онда бағдарлама сегменттерден тұруы керек), екінші жағынан бұл бағдарламаның орындалуы басқаратын операциялық жүйенің ерекшеліктерімен анықталады.   Бағдарлама құрылымына тааңдалған транслятордың жұмыс імтеу еределері де әсер етеді – түрлі трансляторлар бағдарламаның ағымдық мәтініне ерекшеленетін бірнеше талаптар қояды. Бұл кітапты дайындау кезінде бағдарлама мысалдарын трансляциялау және жөндеу үшін  Borland International корпорациясының  TASM 5.0 пакеті қолданылған; ол көптерезелі жөндеушінің болуымен өте қолайлы. Бұл принциалды емес, кітапт кездесен мысалды оқушы кез-келген ассемблерде оның сипаттамасымен танысып алып орындай бере алады. Бұл бөлімде біз қарапайым мысалдармен сегменттік адресациялау ерекшеліктерін және қосымша бағдарламаны орындау кезінде процессор регистрінің ролін қарастырамыз. Алайда, бағжарлама жұмыс істеу қабілетіне ие болу үшін біз оған қаралып жатқан сұрақтарға тікелей қатысы жоқ,бірақ оның дұрыс функциялануы үшін қажетті бірнеше элементтер қосамыз. Иұндай элементтерге негізінде DOS функциясын шақыру жатады. Бағдарламаның толық мәтінін келтіре отырып, біз қысқаша түсінік беріп өтеміз.

; Мысал. Үш сегменті бар қарапайым бағдарлама

; Сегменттік регистрлердің сегменттерге сәйкестігін көрсетеміз
assume CS:code,DS:data

;Команда сегментін  сипаттаймыз 
code segment ; Команда сегментін ашамыз

begin: mov AX,data ; DS-ті баптаймыз

mov DS,AX ;деректер сегментіне;
Экранға мәтін қатарын шығарамыз
mov АН,09h ; DOS экранға шығару функциясы
mov DX,offset msg ; Шығарылып жатқан қатардың адресі
int 21h ; DOS  шақыру
; Бағдарламаны аяқтаймыз
mov AX,4C00h ; DOS бағдарламаны аяқтау функциясы
int 21h ;DOS шақыру
code ends ; Команда сегментін жабамыз
; Деректер сегментін сипаттаймыз
data segment ; Деректер сегментін ашамыз
msg db "Бағдарлама жұмыс істейді!$' ;шығарылатын қатар
data ends ;деректер сегментін жабамыз
; Стек сегментін сипаттаймыз
stk segment stack ;Стек сегментін ашамыз
db 256 dup (?) ; стекке  256 байт береміз
stk ends ; Стек сегментін жабамыз
end begin ; кіріс нүктесімен мәтін соңы

Бағдарламаның негізгі мәтінін пернетақтамен енгізу кезінде үлкен әріптерді де, кіші әріптерді де қолдануға болады; транслятор қабылдайды, мысалы  MOV AX,DATA және mov ax.data қатарларын бірдей қабылдайды. Алайда сәйкес кілттердің көмегімен хабарламаның бөлек элементтерінде трансляторды үлкен және кіші әріптерді ажырататын етіп істеуге болады. Бұл кітапта бағдарлама мәтіндерінде және тілдің операторларын сипаттау кезінде негізінде кіші әріптер қолданылады,тек регистрлер көрініңкі болу үшін үлкен әріптермен жазылған. Ассемблер тілінің хабарламасы одан нүктелі үтірмен (;) ерекшеленетін коментарилерден тұруы мүмкін. Керек болған жағдайда коментарилер бір қатарды алуы мүмкін (ол да әрине «;» белгісінен басталады). Ассемблер тілінде коментарилерді аяқтайтын белгі болмағандықтан, оларды жоғарғы деңгейлі тілдердегі секілді тілдің хабарламасының ішіне жазуға болмайды. Ассемблер тілінің әрбір хабарламасы ең қысқасы да бөлек қатарда болуы керек.

Бағдарламада үш сегмент сипатталған: аты code командалар сегменті, аты data деректер сегменті және аты stk стек сегменті. Әр сегментті сипаттау  segment кілттік сөзінен басталады және end кілттік сөзімен аяқталады. Сегменттер аты еркін таңдалады. Бағдарлама мәтіні трансляцияны аяқтайтын end ассемблер директивасымен аяқталады.Бұл директиваның операндасы ретінде бағдарламаға кіру нүктесі көрсетіледі; біздің жағдайда бұл begin белгісі.

Бағдарламада сегменттерді сипаттау реті мәнге ие емес. Көбінесе бағдарламаны деректер сегментінен бастайды, бұл бағдарламаның оқылуын біршама жеңілдетеді және кейбір жағдайларда әлі сипатталмаған деректерге жүгінетін командалар интерпритацияларында мүмкін болатын біркелкі еместерді болдырмайды. Біз бағдарламаның басында командалар сегментін орналастырдық, одан кейін – деректер сегментін және соңында – стек сегментін; мұндай реттілік бағдарламаны жөндеу кезінде қолайлы болып табылады. Есте сақтау керек, компьютердің оперативті жадысына сегменттер оларды бағдарламада сипаттаған ретте түседі (егер ассемблердің арнайы құралдарымен жадыға сегменттердің жүктелуінің басқа реті берілмесе).

Сегменттер бағдарламаға segment және ends ассемблер директиваларының көмегімен енгізіледі.  Ассемблер директивасы деген не? Бағдарлама мәтінінде екі типті кілттік сөздер кездеседі:  процессор командалары (mov, int) және транслятор директивалары (бұл жағдайда  "транслятор" және "ассемблер" терминдері   синоним болып табылады,  олар ассемблер тілінде жазылған ағымдық мәтінді бағдарламаның орындалуы кезінде процессормен қабылданатын кодтарға түрлндіретін бағдарламаны белгілейді).ассембелр директиваларына сегменттердің басы мен аяғын белгілеу segment и ends;  қолданылатын деректердің типін сипаттайтын кілттік сөздер (db, dup);  stack секілді сегментті арнайы сипаттайтындар және т.б. Директивалар бағдарламаны трансляциялау кезінде қолданатын  қызметтік ақпаратты трансляторға жіберу үшін арналған. Алайда, машиналық кодтардан тұратын орыналатын бағдарламаның құрамына бұл қатарлар кірмейді, себебі бағдарламаны орындайтын процессорге олар керек емес. Басқаша айтқанда, segment және ends типті операторлар машиналық кодқа трансляцияланбайды,ассемблермен бағдарламаны трнсляциялау кезінде  қолданылады. Бұл сұрақпен біз бағдарлама листингілерін қарастырғанда да кезлесеміз.

Ассемблердің тағы бір директивасы бағдарламаның бірінші сөйлемінде қолданылады:

 assume CS:code,DS:data

Бұл жерде  code  сегментінің  CS сегменттік регистріне сәйкестігі және  data сегментінің  DS сегменттік регистріне сәйкестігі орнатылады. Бірінші хабарламаның code  сегменті командалар сегменті болып табылатындығын және осы сегментте кездесетін белгілер дәл осы сегментке тиісті екені көрсетілген, бұл ассемблерге өту командаларын дұрыс трансляциялауға көмектеседі. Біздің бағдарламада белгілер жоқ және сөйлемнің бұл бөлігін түсіріп тастауға болатын еді, бірақ қиын  бағдарламаларда олар керек ( MASM трансляторын қолдану кезінде хабарламаның бұл бөлігі кез-келген,тіпті өте қарапайым  бағдарламада да керек). Екінші хабарлама трансляторға data деректер сегментінің өрістеріне хабарласатын сөйлемдерді дұрыс өңдеуге көмектеседі.Жоғарыда айтылып өткендей, процессор жадысына хабарласу үшін екі құраушы адреске ие болу керек: сегменттік адрес және жылжу. Сегменттік адрес әрқашан сегменттік регистрде болады.Алайда процессорда екі сегменттік регистр бар, DS және ES, жадыға хабарласу үшін олардың кез-келгенін қолдануға болады. Процессор команданы орындау кезінде нақты қай регистрден сегменттік адресті алу керектігі білу керек,сол себепті жадыға DS немесе ES регистрлері арқылы хабарласу түрлі кодталады.  data сегментінің  DS регистріне сәйкестігін хабарлай отырып, біз трансляторға  DS регистрі арқылы кодтауды ұсынамыз.
   Жадыға жүгінумен команданың орындалуы кезінде DS регистрінде керекті сегменттің сегменттік адресі болады деген сөз емес.  Керекті адрес сегменттік регистрде болмайды.  Assume директивасы сегменттік регистрлердің құрамына емес тек командалардың кодталуына әсер етеді.Сол үшін кез-келген бағдарлама деректер сегментіне адресациялау үшін қолданылатын сегменттік регистрге осы сегменттің сегменттік адресі жүктелетін сөйлемнен басталуы керек. Біздің мысалда осылай екі команданың көмегімен жасалған

mov AX,data ; DS баптаймыз

mov DS,AX ;деректер сегментіне

біздің бағдарлама осылардан басталады.  Алдымен data атының мәні (яғни  data сегментінің адресі) процессордың жалпы қызметтегі АХ регистріне mov командасымен жүктеледі, содан кейін АХ регистрінен  DS регистріне тасымалданады. Мұндай екі сатылы операция процессор өзінің архитектурасына байланысты адрестің сегменттік регистрге тікелей жүктелуін орындай алмағандықтан керек.АХ регистрін «бастапқы пунк» ретінде қолдануға тура келеді. DS регистріне деректер сегментінің сегменттік адресін орналастырып, біз осы сегменттің өрістеріне хабарласу мүмкіндігін алдық. Бағдарламада бірнеше деректер сегменті бола алатындықтан, операциялық жүйе өздігінен DS керекті мәнін анықтай алмайды, оны «қолмен» инициялизациялауға тура келеді. 1-1 бағдарламасының қызметі экранға деректер сегментінде сипатталған "Бағдарлама жұмыс істейді!' мәтіндік қатарын шығару болып табылады. Бағдарламаның келесі сөйлемі осы операцияны орындайды. Бұл тікелей емес,  MS-DOS операциялық жүйесінің қызметтік командаларына хабарласу арқылы орындалады,оны қысқарту үшін біз бұдан былай оны  DOS деп атаймыз.

Процессор командаларының және ассемблер тілінің операторлары   құрамында деректерді экранға шығару командасы жоқ (пернетақтадан енгізу,дискідегі файлды жазу және т.б. командалар секілді). Экранға бір символды шығарудың өзі күрделі операция болып табылады, оны орындау үшін процессор командаларының ұзын кещектілігі керек. Бұл кезектілікті біздің бағдарламаға қосуға болатын еді, бірақ одан оңайы операциялық жүйеге көмекке жүгіну.  DOS құрамына бағдарламалардың үлкен көлемі кіреді, олар стандартты және көп қолданылатын  функциялар – экранға шығару және пернетақтадан енгізу және т.б.

 DOS-қа хабарласу үшін Жалпы қызметтегі регистрге АН керекті функцияның номерін енгізу керек, басқаларға – осы функцияны орындауға арналған деректерді, содан кейін hit 21h (int - от interrupt, үзіліс) командасын орындау керек,ол DOS-ты басқаруды береді. Экранға мәтін қатарын шығаруды  09h функциясымен іске асыруға болады, ол  DS:DX регистрлерінде шығарылатын қатардың толық адресі болуын талап етеді.  DS регистрін біз инициализацияладық,   DX регистріне қатардың салыстырмалы адресін енгізу қалды, ол деректер өрісінің атымен msg ассоцияцияланады.Шығарылатын қатардың ұзындығын көрсетудің қажеті жоқ, себебі 09h функциясы DOS экранға көрсетілген адрестен доллар белгісіне ждейін шығарады. Нақты функция үшін керекті барлық регистрлерді толтырғаннан кейін int 21h командасын орындауға болады, ол DOS шақырады. Орындалып жатқан бағдарламаны қалай аяқтайды? Шындығында бағдарламаның аяқталуы – бұл қиын операциялардың кезектілігі,оған жадыны босату,экранға сұрансты шығаратын жүйелік бағдарламаны (нақты – командалық процессордың COMMAND.COM) шақыру жатады. Бұл барлық операцияларды 4Ch номері бар DOS функциясы орындайды.  Бұл AL регистрінде біздің бағдарламаны аяқтайтын код бар деп есептейді. Егер бағдарлама сәтті аяқталса аяқталу код 0-ге тең болуы керек, сол үшін біз бір сөйлемде mov AX,4C00h  АН 4Ch-қа жүктейміз, ал  AL – 0 және бізге таныс командамен  int 21h  DOS-ты шақырамыз.

Келтірілген бағдарламаын тексеріп шығу үшін оны алдымен трансляциялап,скомпонавать ету керек. Бағдарламаның негізгі мәтіні  P.ASM файлында сақталған болсын. Трансляция ассемблерді шақырумен жүзеге асырылады TASM.EXE келесі DOS командасының көмегімен:

tasm /z/zi/n p/p,p

/z кілті ассемблер қате тапқан бағдарламаның негізгі қатарын экранға шығаруға рұқсат береді.  
 /zi кілтібағдарламаның орындалуы кезінде керек емес бірақ жөндеушімен қолданылатын ақпаратты объекілік файлға қосылуын басқарады                                                                      /n кілті бағдарламадағы символдық белгілеулердің бірқатарынлистингіге шығуын басады,осыдан листингінің информативтілігі төмендейді,бірақ оның көлем көбейеді.
Кейін тұрған параметрлер файл аттарын анықтайды: негізгі (P.ASM), объектілі (P.OBJ) және листингтің (P.LST). Керек болған кезде трансляторды шақыру қатарына файлдардың толық атын олардың кеңейтілуімен көрсетуге болады, бірақ оның керегі жоқ.
 Компановщикті шақыру қатары келесі түрде болады :

tlink /x/v p,p

 

/х кілті әдетте керек емес компоновка листингісінің құрылуын басады.
/v кілті жөндеушімен қолданылатын ақпаратты жүктемелі файлға жібереді. Кейінгі параметрлер модуль аттарын білдіреді: объектілі (Р.ОЫ) және жүктемелі (Р.ЕХЕ).
 Бұл кітапты оқуда көп бағдарлама жазатындықтан, командалық файл құрған дұрыс (аиыме,мысалы А.ВАТ), ол бір типті трансляция және компонвка операцияларын орындайды. командалық файлдың мәтіні қарапайым түрде мынадай болуы мүмкін:

tasm /z/zi/n p,p,p

tlink /х/v р,р

Дайындалған Р.ЕХЕ бағдарламасын іске қосу .р.ехе командасымен орындалады.Бағдарламаның жүктелуі кезінде сегменттер суретте көрсетілгендей жадыда орналасады. 

Сурет. Бағдарламаның жадыдағы бейнесі

 

Бағдарламаның жадыдағы бейнесі бағдарламаның префиксі сегментінен басталады   (Program Segment Prefics, PSP). PSP көлемі әрқашан 256 байт; ол бағдарламаның орындалу процесі кезінде жүйемен қолданылатын кестелерден және деректер өрісінен тұрады. PSP-дан кейін бағдарлама  сегменттері олардың бағдарламада жарияланған реті бойынша орналасады. Сегменттік регистрлер автоматты келесі түрде инициялизацияланады: ES және DS  PSP басына көрсетеді (бұл оның құрамын сақтап,бағдарламада PSP хабарласуға мүмкіндік береді), CS -  команда сегментінің басына, aл SS -  стек сегментінің басына.  IP командалар көрсеткішіне бағдарламаға кіру нүктесінің салыстырмалы адресі жүктеледі  (end директивасының операндасынан), ал  SP стек көрсеткішіне – стектің жарияланған өлшеміне тең өлшем, нәтижесінде стек көрсеткіші стектің соңына көрсетеді (оның шеңберіндегі бірінші сөзге). Бағдарламаның жадыға жүктелуінен кейін адресацияланған болып деректер сегментінен басқа сегменттердің барлығы табылады. DS регистрін инициализациялау бағдарламаның бірінші қатарларында осы сегментті де адрестелген етуге мүмкіндік береді. Сурет 1.9 Intel процессорлерінің архитектурасының ерекшелігін тағы бір рет дәлелдейді: жадының кез—келген ұяшығының адресі екі сөзден тұрады, біреуі жадыда сәйкес сегменттің орналасуын анықтады, ал екіншісі – осы сегмент шеңберіндегі жылжу. 

Сегменттік регистрлердің бірінде сақталатын адрестің сегменттік бөлігінің мәні нақты және қорғалған режимде әртүрлі;  МП 86-да адрестің сегменттік  бөлігі оны 16-ға көбейткеннен кейін, жадыдағы сегмент басының физикалық адресін анықтайды. Бұдан келетіні, сегмент әрқашан адрестен басталады,16 еселі, яғни жадының 16-байттық блоктың шекарасында. Сегменттік адресті параграф номері ретінде қарастыруға болады. Сегмент өлшемі ондағы деректердің көлемімен анықталады, бірақ ешқашан 64 Кбайттан көп болмайды.

Командалар сегментінің сегменттік адресі CS регистрінде сақталады, аладрестелетін байтқа жылжу – IP командалар көрсеткішіне. Бағдарламаның жүктелуінен кейін IP-ға бағдарламаның бірінші командасының жылжуы жазылады; процессор оны жадыдан оқып, IP құрамын осы командасының ұзындығына дейін көбейтеді ( Intel процессорларының командалары  1- ден 6 байтқа дейінгі ұзындыққа ие болуы мүмкін),нәтижесінде IP бағдарламаның екінші командасына көрсетеді. Бірінші команданы орындап,процессор жадыдан екіншіні оқиды, IP мәнін тағы көбейтеді. Нәтижесінде IP-да әрқашан кезекті команданың жылжуы болады. Сипатталған алгоритм өту,ішкі бағдарламаларды шақыру және үзілулерге қызмет жасау  командалары орындалған кезде ғана бұзылады.Деректер сегментінің сегменттік адресі DS регистрінде сақталады, aл  жылжу жалпы қызметтегі регистрлердің бірінде болуы мүмкін, мысалы ВХ немесе SI. Алайда МП 86-да екі деректер регистрі сегменті бар - DS және ES. Қосымша сегменттік регистр ES көбінесе бағдарламаға кірмейтін деректер өрісіне хабарласу үшін қолданылады, мысалывидеобуферге немесе жүйелік ұяшықтарға. Алайда керек болған жағдайда оны бағдарлама сегменттерінң біріне де баптауға болады. Егер бағдарлама улкен көлемді деректермен жұмыс жасаса, олар үшін екі сегмент қарастыруға болад және олардың біріне DS регистрі арқылы, ал екіншісіне -  ES арқылы хабарласуға болады.

 

10. Арифметикалық командалар. Жалпы шолу. Бүтін екілік сандар. Ондық сандар. Бүтін екілік сандарға орындалатын арифметикалық операциялар. Деректерді көрсету.

 

Арифметикалық командалар операндтар кодын сандық екілік немесе екілік-ондық кодтар ретінде қарастырады. Бұл командалар бес негізгі топқа бөлінген:

Фиксирленген үтірі бар операциялар командалары (қосу,азайту,көбейту,бөлу);

Қалқушы үтірі бар операциялар командалары (қосу,азайту,көбейту,бөлу);

Тазалау командалары;

Инкремент және декремент командалары;

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

Фиксирленген үтірі бар операциялар командалары процессор регистріндегі кодтармен немесе жадыда қарапайым екілік кодтармен жұмыс жасайды.  Қосу командасы (ADD)  екі кодтың соммасын есептейді. Азайту командасы  (SUB) екі кодтың айырмасын есептейді. Көбейтіу командасы (MUL) екі кодтың көбейтіндісін есептейді (нәтиженің разрядтылығы көбейткіштің разрядтылығынан екі есе көп). Бөлу командасы (DIV) бір кодты екінші кодқа бөледі. Бұл барлық командалар таңбасы бар сандармен де, таңбасы жоқ сандармен де жұмыс істей алады. 

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

 Тазалау командалары (CLR) жады ұяшығына немесе регистрге нольдік кодты жазуға арналған. Бұл командалар нольдік кодты жіберу командаларымен ауыстырылуы мүмкін, бірақ арнайы тазалау командалары жіберу командаларына қарағанда жылдам орындалады.  Тазалау командалары кейде логикалық командалар тобына жатады, бірақ бұдан олардың маңызы өзгермейді.

Инкремент (бірге көбейту, INC) және декремент (бірге азайту, DEC) командалары өте қолайлы болып табылады. Оларды бірге соммалау немесе бірді азайту командаларымен ауыстыруға болады,бірақ  инкремент пен декремент соммалау мен азайтудан  жылдам орындалады. Бұл командалар бір кіріс операндасын талап етеді, ол шығыс операндасы да болып табылады.

 Салыстыру командасы (CMP белгіленеді) екі кіріс операндтарын салыстыруға арналған. Ол осы екі операндтардың айырмасын есептеуге арналған,бірақ шығыс операндасын қалыптастырмайды, осы есептеудің нәтижесі бойынша процессордың жағдай регистрінде  (PSW) биттерді өзгертеді. Салыстыру командасынан кейінгі команда (әдетте бұл өту командасы) процессор жағдайы регистріндегі биттерді сараптайды және олардың мәндеріне байланысты әрекеттер орындайды (өту командалары туралы 3.3.4 бөлімінде қарастырылған).  Кейбір процессорларда жададағы екі операндтардың кезектілігінсалыстыратын командалар қарастырылған. (мысалы, 8086 процессорында және соларға сәйкестер). Командалар жиынында келесі арифметикалық операциялар бар: қосу, тасымалдау жалаушасын ескеріп қосу, азайту, инкременттеу, декременттеу, салыстыру, ондқ коррекция, көбейту және бөлу.

АЛУ-да таңбасыз бүтін сандарға амалдар орындалады. Екі операндты операцияларда:қосу (ADD), тасымалдаумен қосу (ADDC) и азайту (SUBB) аккумулятор бірінші операнд болып табылады және  операция нәтижесін қабылдайды. Екінші операнд таңдалған жұмыс регистрлерінің банкінің  жұмыс регистрі, жанама-регистрлі және тура адресациясы бар деректердің ішкі жадының регистрі немесе тікелей деректер байты болуы мүмкін.  Көрсетілген операциялар жалаушаларға әсер етеді:толып кету,тасымалдау, аралық тасымалдау, және процессор жағдайындағы сөздегі шындық жалаушасы (PSW). Тасымалдау разрядын қолдану  қосу  (ADDC) және азайту (SUBB) операцияларында нақтылықты бірнеше рет жоғарылатуға мүмкіндік береді..

Таңбаны ескеріп қосу және азайту операцияларын орындау  PSW регистрін толтыру жалаушасы (OV) бағдарламалық басқаруы көмегімен жүзеге асырылуы мүмкін. Аралық тасымалдау жалаушасы (АС) екілік-ондық жүйеде операциялардың орындалуын қамтамасыз етеді.

Инкременттеу және декременттеу операциялары жалаушаларға әсер етпейді. Салыстыру операциялары қызмет операндына да,  операнд көзге де әсер етпейді, бірақ олар тасымалдау жалаушаларына әсер етеді. Тек аккумуляторда орындалатын үш арифметикалық операция бар:А аккумуляторының құрамын тексеретін екі команда (JZ, JNZ) және екілік-ондық кодтарды қосуда ондық коррекция коандасы. Қосу операциясы кезінде  А аккумуляторының құрамы  В регистрінің құрамына көбейтіледі және нәтиже келесі түрде орналасады: кіші байт  В регистрінде, үлкен -  А регистрінде.

 Бөлу операциясын орындау кезінде бөлудің бүтіні А аккумуляторына орналасады, қалдық – В регистріне.

Деректерді көрсету

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

 Алдымен ьтаңбалы және таңбасыз бүтін сандарды қарастырайық. Таңбасыз деген атауды сандар олардың арасында теріс сандар болмағандықтан алды. Бұл сандардың ең қарапайым түрі:байтта,сөзде немесе екілік сөзде жазуға болатын екілік сандардың барлық диапазонын құрайды. Байт үшін таңбасыз сандар 00h (0)-ден FFh (255)-ке дейін гі мәндерді қабылдауы мүмкін; сөз үшін -  0000h (0) -тен  FFFFh (65535) –ке дейін;екілік сөз үшін -  00000000h (0)-ден  FFFFFFFFh (4294967295)-ке дейін.

Есептеу техникасының қосымшаларының үлкен көлемінде сандао үшін белгі деген ұғым жоқ. Бұл дұрыс, мысалы, жады ұяшықтарының адрестері үшін,  ASCII символдарының кодтары үшін,көптеген физикалық өлшемдерді есептеу нәтижесі үшін,компьютерге жалғанатын  құрылғыларды басқару кодтары үшін.   Мұндай сандар үшін ұяшыққа жазылатын сандардың барлығын қолданған дұрыс. Алайда егер оң және теріс сандармен де жұмыс жасайтын болсақ, барлық сандардың жартысын оң, қалған жартысын теріс деп есептеуіміз керек. Нәтижесінде санның өзгеру диапазоны екі есе азаяды. Оң және теріс сандар жабылып қалмау үшін кодтау жүйесін қарастыру керек.

Есептеу жүйесінде теріс сандарды қосымша кодта жазу қабылданған, бұл код  турадағы барлық нольдерді бірге, бірлерді нольге ауыстырып(кері код), алынған санға бірді қосу арқылы алынады. Бұл байттық сандарға да (8-биттік), өлшемі сөз немесе екілік сөз болатын сандарға да әділ болып табылады (сурет 1).

Сурет 1. Түрлі өлшемдегі теріс сандардың құрастырылуы

 

Мұндай теріс сандарды құрастыру әдісі оларға арифметикалық операцияларды жылпы ережелер бойынша дұрыс жауапты беретіндей етіп орындағанымен қолайлы.    Осылайша +5 және -5 сандарын қосу 0 береді;  5-тен 3-ті азайту кезінде 2 болады;  -5-тен -3-ті азайту -2 береді және т.б. Теріс санның құрастырылу алгоритмін қарастыра отырып, барлық теріс сандар үшін жоғарғы битте екілік бірдің болатынын байқауға болады. Ал оң сандар, керісінше жоғарғы битінде 0-ге ие. Сондай-ақ,  сурет 1-ден көріп отырғандарыңыздай, теріс 8-битті санды сөзге түрлендіру кезінде оны сегіз екілік бірлермен толтыру керек.Ал оң 8-биттік санды сөзге түрлендіру үшін сегіз екілік нольмен толтыру керек. Таңбасы бар сөзді екілік сөзге түрлендіру кезінде де осындай, бірақ бұл жерде 8 емес, 16 бір немесе ноль жазу керек болады. МП 86 командалар жүйесінде және ассемблер тілінде бұл операциялар үшін арнайы командалар - cbw және  cwd қарастырылған.

 Айта кету керек, санның таңбасы шартты.Бір сан, мысалы сурет 1 көрсетілген 8 – биттік санды FBh бір кезде теріс сан ретінде (-5), ал бір кезде оң сан немесе дұрысы таңбасыз сан  (FBh=251) түрінде қарастыруға болады.

Сурет 2 16-биттік сандардың олардың машиналық көрінісі, таңбасыз және таңбамен мәндері көрсетілген таңдалға кестесі келтірілген. Кестеден көрініп тұрғандай, өлшемі сөзбен тең таңбасы бар сандар үшін оң мәндер диапазоны  0-ден 32767-ге дейін, ал теріс мәндер диапазоны -1-ден  -32768-ге дейін.

 Сурет 2. 16-битті сандардың таңбасыз және таңбамен көрінісі.

 

Сурет 3 –те 8-битті сандар үшін аналогты кесте көрсетілген. Кестеден көрініп тұрғандай, өлшемі байтпен тең таңбасы бар сандар үшін оң мәндер диапазоны  0 – ден  127-ге дейін, ал теріс мәндер диапазоны -1- ден  -128-ге дейін.

Сурет 3.  8 -битті сандардың таңбасыз және таңбамен көрінісі.

 

Сандарды өңдеумен айналысатын процессор командаларының арасында санның таңбасына  қарамайтын командаларды (мысалы, inc, add, test), таңбасыз сандарды өңдеуге арналған командаларды (mul, div, ja, jb и др.), сондай-ақ арнайы таңбасы бар сандарды өңдеуге арналған командаларды (imul, idiv, jg, jl және т.б.) айтып өтуге болады. Бұл командаларды қолдану ерекшеліктері келесі бөлімде қарастырылатын болады.

Сандарды көрсетудің басқа түрін – қолданбалы   аймақтар қатарында қолданылатын екілік-ондық форматты (binary-coded decimal , BCD) қарастырайық. Бұндай форматта деректерді кейбір өлшеу құралдары береді; IBM PC компьютерлерінің нақты уақытының КМОП-сағаттарымен ағымдық уақыт туралы ақпаратты сақтау үшін қолданылады.    МП 86 –да мұндай сандарды өңдеуге арналған бірқатар командалар қарастырылған. Екілік – ондық формат екі түрде болады: қапталған және ашылған. Бірінші жағдайда байтта 00-ден 99-ға дейінгі екі разрядты ондық сан жазылады. Санның әрбір цифрасы байттың жартысын алады және екілік форматта сақталады.  Сурет 4 – тенкөруге болады, ондық санның байтында екілік-ондық форматта жазу үшін жазылатын ондық санды  һ символымен шығару керек.

Сурет 4. қапталған екілік-ондық формат.

 

Машиналық сөзде немесе16-разрядты регистрде екілік-ондық форматта 0000-ден 9999-ға дейінгі төрт разрядты ондық сандарды сақтауға болады (Сурет 5).

Сурет 5. Сөзде 9604 ондық санын жазу.

 

Ашылған формат қапталған форматтан әрбір байтта тек бір ғана ондық санның жазылуымен (баяғыдай екілік түрде) ерекшеленеді. Бұл жағдайда сөзде 00-ден 99-ға дейінгі ондық сандарды жазуға болады (Сурет 6).

 Сурет 6. 98 ондық санының ашылған түрдегі жазылуы.

 

Аппаратурада ондық сандарды сақтауда әлдеқайда экономды қапталған формат қолданылады; көбейту және бөлу тек ашылған сандармен ғана, ал қосу мен азайту екеуімен де қолданыла береді. Екілік-ондық сандарға мысалдар келесі бөлімде қарастырылады.

 

11. Таңбасыз екілік сандарды қосу\азайту. Таңбалы екілік сандарды қосу\азайту. Үлкен өлшемді операндаларды азайту және қосу. Деректердің сипатталуы.

 

Қалқымалы нүктелі екілік сандарға арифметикалық операциялар.

Соңғы үлгідегі ЭЕМ – де қалқымалы нүктедегі сандар машинаның жадысында сақталады, мантиса мен түзейтілген түрдегі коды бар. Осы сандарға жасалынатын барлық арифметикалық әрекеттер, дәл жартылайарифметикалық формаларға орындалатындай орындалады. Реттілік пен мантиса бөлек өңделеді.

Қосу (азайту). Қосу (азайту ) операциясы келесідей тізбек бойынша орындалады.

  1. р=р1-р2 азайтылуы арқылы бастапқы сандардың реттілігі салыстырылады.
  2. Егер ртеттілік  теңдігі нөлге тең болса,  онда бұл дегеніміз  бірдей атаулы мантиса бірдей салмаққа ие екенін білдіреді.
  3. Сандардың реттілігін теңестіруде, төменгі реттілікпен оңға қарай  Ар реттілігінің айырмасына қарай жылжиды.
  4. Мантисса реттілігін теңестіргеннен кейін сандарды қажет ететін операцияға сәкес дестелеуге  болады.  2,3. Кестесіндегі деректерге сәйкес азату операцися қосу операциясына алмастырылады. Айтылғандарға әрекет ОК немесе ДК жалпы ере же бойынша жүргізіледі.
  5. Нәтиже реттілігі үлкен реттілікке теңестіріліп алынады.
  6. Егер мантисса нәтижесі нормаланбаған болса, онда реттілік  мәнін нормаға және түзету жүргізіледі.

Мысал. Екі санды қосу  А10=+1.375; B10=-0.625.

А2=+1.011=0: 1011*101; B2=-0.101=-0:101*100.

Нормальды түрде бұл сан келесідей түрге ие болады:

1. Δp=p1-p2=1-0=1 реттілігін азайтамыз. Машинада бұл операция қосымша кодқа қосуды түрлендіру арқылы орындалады:

 

Δр≠ 0 –екенін анықтаймыз.

 

2. бірінші санның реттілігі екінші санның реттілігінен бір сатыға үлкен. Реттіліктерді теңестіру қажет.

3. теңестіру үшін, екінші санды оңға қарай бір разрядқа жылжыту қажет.

[B2]исх=0: 0 1: 101

после сдвига

[B2]п=0: 11:0101

[mB]дк= 1: 1011

4.Мантиссаны қосамыз.

С санды манисса – оң .

5.С реттілік саны үлкен реттіліктің санына тең р = +1.

[С2]п=0: 1 0: 0110.

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

  1. мантиссаны солға қарай бір разряд жылжыту арқылы нормализовать етіп және сәйкесінше реттілік мәніне бірді алып тастаймыз:

 

Деректерді сипаттау

 

Негізінен барлық бағдарлама өзі жұмыс істейтін деректер тізімінен тұрады. Экранға шығаруға раналған символды жолдар болуы мүмкін; бағдарламаның орындалу ретін белгілейтін немесе азайтуда ескерілетін сандар болуы маүмкін; ішкі бағдарлама адрестері үзілістерді өңдірушілер немесе бағдарлама өрістерінің адрестері; арнайы кодтар, мысал, экранға шығарылатын символдар түсінің коды т.б.  бағдарлама текстінде анқталған деректерден басқа, бағдарламаға  алдын ала алынып қойған өрістер кіреді олар бағдарламаның орындалу ретін толтырады, мысалы, есептеу нәтижесі бойынша немесе файылдан оқу арқылы. Барлық деректер және кейінге сақталған өрістердің   барлығы   бағдарлама сегментінің  деректерінде анықталуы керек (негізінде олар  сегметтер декетерінде емес сегменттер командасында  анықталуы мүмкін ). Деректерді анықтауда  ең басты үш  ассемблер директивасы  қолданылады: db (define byte,байтты анықтау) байтты жазу үшін, dw (define word,сөзді анықтау) сөзді жазу  үшін  және dd (define double, қосарланған  сөзді анықтау)  қосарланған  сөзді   жазу  үшін:

db 255
dw 6.5535
dd 100000000

айтылғандардан басқада директивалар бар, мысалы  df (define fanvord, 6 байттық өрісті анықтау), dq (define quadword, ширақ сөзді анықтау) немесе dt (define tcraword, 10 байтты айнымалыны анықтау), бірақ  олар  өте  аз  пайдаланылады.

Деректерге  қатынасу  үшін  олардың  атауы  болуы  керек. Деректер   атаулары  құрамына  латын  әріптерін  және цифрларын  қоса  алады, сонымен бірге  арнайы  белгілерді,  мысалы, астын сызу белгісі (_),доллорды  ($)   және  комерциялық  at (@).  Атаудың  ұзындығын  кейбір ассемблерлер  шектейді (мысалы, ассемблер MASM - 31 симсимволды ), бірақ  басқалары емес,  бірақ  атаудың  ұзын болуы   бағдарлама  оқуын  қиындатады. Деректерге  ат  бергенде  оларды  нақты  бір  деректі  білдіретін  етіп  таңдау  қажет,  мысалы counter счетчике арналған  немесе filename  файыл  атына  арналған:

counter dw 10000
filename db "a:\myfile.001'

Сандық  деректерді  түрлі есептеуіш  жүйелеріне  жазуға  болады; басқаларынан көбірек  ондық  және  16-санау  жүйелері  қолданылды:

size dw 256 ;В ячейку size записывается
                            ;десятичное число 256
setb7 db 80h ;В ячейку setb7 записывается
                    ;16-ричное число 80h

Жоғарыда  келтірілген  комментаридің  тура  емес екенін  айтқан жөн.  Компьютер  жадысында  тек  екілік  кодтар  сақталуы  мүмкін.  Егер  біз  бір  ұяшықта  ондық  сан 128 жазылған десек, біз  ұяшықтың  физикалық  құрамын  емес, бағдарламаның  бастапқы  текстіндегі осы  санның  формасын  келтірген болар  едік. Аталуы Size созінде    0000000100000000 екілік  коды  жазылады, ол 256  ондық  санының  екілік  эквиваленті  болып  табылады. Екінші  Setbit  атаулы  байттық    жағдайда, 80һ он алтылық санының  екілік  эквиваленті  жазылады,  ол 10000000 құрайды  ( осы  ұяшық  атау  алған  , 7 бит).

Массив  маңынан  орын  алып  қою  үшін,  dup (duplicate, дублировать) операторы  қолданылады, ол  байтты  көбейтуге  мүмкіндік  береді, сөзді  немесе  екілік сөзді:

rawdata dw 300 dup (1); алдын  ала сақталған 300 сөз; 1 санымен толтырылған
string db 80 dup ('^')  ; '^' белгісімен толтырылған 80байт алдын ала сақталады.

Деректерге  символдық  атаулар  беру    бағдарламалық  қосымшада олардың  деректердің  адрестерін  ойламай қатынасуға  болады. Мысалы,

mov AX,size

командасы  АХ  регистіріне size (число 256)  ұяшығының ішіндегіні сегменттер  деректерінің қай  жерінде  бұл  ұяшық  анықтьалғанына  тәуелсіз және  физикалық  жадының  қай  жеріне  түскеніне тәуелсіз кіргізеді. Ассемблер  тілін  пайдаланушы  программист,  бағдарлама  ұяшығына  адрестердің  қалай  бөлінетінін  жақсы  білуі  керек сонымен  қатар  тек  символдық  белгіленілермен  ғана  емес   адрестер  белгіленулерімен  де  жұмыс  жасай  алуы  керек. Осы  сұрақты  талқылау  үшін,  түрлі  типтер  анықталатын  сигменттер деректерін  қарастырамыз. Сол  жақ  колнкада сегментт  басынан  есептелінетін деректердің  жылжуын  көрсетеміз (он  алтылық  формадағы) .

data segment
0000h counter dw 10000
0002h pages db "Страница 1"
000Ch numbers db 0, 1, 2, 3, 4
0011h page_addr dw pages
data ends

Деректер  сигменті  counter деп  аталатын  деректен  басталады,  ол сөз (2 байт) ретінде  сипатталып  және  10000 санынан  тұрады. Көрініп  тұрғандай  оның  жылжуы  0 – ге  тең. Бұл  дерек  2 байт  орын  алады,  ал  одан  кейінгі   pages дерегі  2 жылжытуға  ие  болды. Pages  дерегі текстін  10  символдан  тұратын  жолын  сипаттайды  және жадыда  сондай  байт  орын  алады,  сондықтан  келесі  numbers дерегі  осыған  сәйкес 2 + 10 = 12 = Ch адресіне  ие  болды. Numbers  өрісінде 5  юайттық  сан  жазылған,  сондықтан  сегменттегі page_addr  атауға  ие дерегі Ch + 5 = 11h адресі юойынша  орналасады. Ассемблер  сегметті  транслятциялауды  бастағанда (бұл  жағдайда  деректер  сигменті) оған  қатысты адрестерді  есеп  беруін  бастайды. Бұл  есеп  транслятордың арнайы  қосымшасында  жүргізіледі (не  программы!),  ол  ағымдық  адрестің  счетчигі  деп  аталады  және  (S) мен  белгіленеді. Деректер  өрісін  өңделуіне  қарай,  олардың  символдық  белгіленулері ассемблерде  құрылатын  атаулар  кестесінде  ағымдық  адрестің счетчигінің  мағынасымен  бірге  сақталады. Басқаша  айтар  болсақ  біз  енгізген  символдық  атаулар  олардың  жылжытуына  тең  мағынаға  ие  болады. Осыған  сәйкес  counter трансляторы 0-ге,  pages - 2, numbers – Ch тең. Сондықтан қосымша

page_addr dw pages

ассемблерде келесідей  болып көрінеді

page_addr dw 2

Талқыланғанды деректерді  жариялау  кезінде  қолдануға  тура  келеді. Мысалға  біз  экранға  " 2 бет", " 3 бет ", " 4 бет " жолдарын  шығарғымыз  келсе. Осы жолдардың  барлығын деректер  сигментінде  бөлек-бөлек  сипаттауға  болады, бірақ бұл жадыны сырыпсыз  пайдалануға  әкеледі. Экономды  түрде  жасауға  болады: экранға сол   pages бетті  шығару,  бірақ  онда  беттердің  нөмірін модификациялау  керек. Нөмірді  модификациялауды  келесідей  команда  арқылы  орындауға  болады:

mov pages + 9, ' 2'

Бұл  жерде  бізге  жолдан қажетті  символдың  жылжуын   өзіміз қолмен  анықтадық, ассемблерде  барлық  деректер  бірін - бірінен  кейін бағдарламада  жарияланғандай  орналасады. Pages атуы  қандай  мәнге  ие  болса  да, pages + 9  мәндері әрдайым беттер  нөмірінің  байттарымен  сәйкес  келеді. Осындай әдісті numbers дерегіне  үндеу  кезінде  де қолдануға  болады,  ол өзі  5 санан  тұратын  массив  түрінде  келеді. Бірінші  санның  адресі  жай numbers  тең болады, екінші  санның  адресі - numbers + 1, үшіншінің  адресі третьего - numbers + 2 және т.б. келесі  команда DL регистріндегі осы  массивтің  соңғы элементін  оқиды:

mov DL,numbers+4

numbers массивінде  бірнеше  сандарды  біріктіру  нені  берді? Ештене  егер  біз  ол  сандарға  бөлек-бөлек  қатынасатын  болсақ.  Бұл  массивті  келесідей  етіп  біріктірген  ыңғайлы  болар  еді:

nmb0 db 0
nmbl db 1
nmb2 db 2
nmb3 db 3
nmb4 db 4

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

mov SI,4                   ; Массивтегі элемент индексі
mov DL,numbers[SI] ;Адресі бойынша шақыру
                                  ;numbers + SI тұратындар

Кей  жағдайда  массив  элементіне  индекс  арқылы  қатынасқан  жөн,  немесе  олардың  аталуы  бойынша.  Ол  үшін  массив  сипаттамасына  ассемблердің label (метка) дериктивасы  арқылы  қосымша адрестің  сиволдық  сипатталуын  қосу  керек:

numbers label byte
nmb0       db    0
nmbl        db    1
nmb2       db    2
nmb3       db    3
nmb4       db    4

numbers белгісі  byte сипаттаушысымен  жариялануы  тиіс,  өйткені осы  белгі  соңынан  жазылған  деректер байт  ретінде  сипатталған  және  біз  олармен  дәл  байтт ретінде  жұмыс  істеуді  жоспарлап  отырмыз. Егер  бізге  массивке  сөз  қажет болса,  онда  массивтің  бөлек  элементтерін dw директивасының көмегі    арқылы жариялауға  тура келеді, ал  numbers белгісіне word сипаттауышынг  береміз:

numbers label word
nmb0       dw     0
nmbl        dw     1
nmb2       dw     2
nmb3       dw     3
nmb4       dw     4

Соңғы  екі  деректердің  сипатталуында  қандай  айырмашылық  бар? Айырмашылық  бар және  ол  үлкен. Екі жағдайда  да, 0 ден 4 сандар  тізбегі  жазылса  да,  бірінші  нұсқада әр  бір  санға  жадыдан  бір  байт  бөлінеді,  ал  екінші  де – сөз. Егер  біз  болашақта  массивтің  мәнін  өзгертетін  болсақ,  онда  бірінші  нұсқада  әр бір  санға  0 ден 255 дейінгі  мән  беруге  болады,  ал  екіншіде – 0 ден 65535 дейін. Деректерді  сипаттау  түрін  таңдағанда, ассемблер қоладнылатын  деректердің  өлшемін  тексереді  және байттарға  сөз  сияты  ал сөздерге  байтт сияқты  қатынас  жасағысы  келген  командаларды  жібермейді.  Numbers массивінің  соңғы  сипатталу нұсқасын  қарастырамыз. Әр бір элементт маңынан тұтас  сөз  бөлінсе де,  бірақтан шынайы сандары  үлкен емес  және  байттқа  беймарал  сияды. Бірақтан  байттық  регистірге  алдын  ала  көшіру  арқылы  онымен байт  сияқты  жұмыс  істеуге  елігуі  мүмкін:

mov AL,nmb0 ; nmb0-ден AL-ға тасымалдаймыз
mov DL,nmbl ; nmb1  AL тасымалдаймыз
mov CL,nmb2 ;nmb2  AL тасымалдаймыз

олай  жасауға  болмайды. Транслятор  үлкен  қателік  туралы хабарлама  шығарады – типтердің  сәйкеспеуі және объектік  файыл  құрмайтын болады. Бірақтан  көп  жағдайда  бұндай  операцияға  тәуелділік  пайда  болады. Бұндай  жағдайға   арналып byte ptr (byte pointer,байттық көрсеткіш) арнайы атрибуттық  операторы  қарастырылған, оның көмегімен  бір команда  орындалу  барсында  операнда  өлшемін  өзгертуге  болады:

mov AL,byte ptr nmb0
mov DL,byte ptr nmbl
mov CL,byte ptr nmb2

бұл  командаларды  трансятор  дұрыс  деп  қарастырады.  Көп  жағадайда  кері  операцияны  орындауды  қажет  етеді – байттар парына   сөз  ретінде  қатынасу.  Бұл  үшін word ptr операторын  қолдану  керек:

okey db 'OK'

mov AX,word ptr okey

мұнда  екі  байтта okey айнымалысынан АХ регистіріне  көшіріледі. Сонымен бірге қатар  бойынша  бірінші «О» әріпінен тұратын аз  адресті байт ,  кіші  бөліміне  өтеді  АХ - регистр AL,  ал екінші  реттік  байт "К", АН регистріне  барады. Осы  уақытқа  дейін айнымалы  болып келетін  деректер  туралы  айттық, яғни оларға  жады  бөлінетінін  және  оларды  модифицирлеуге  болатыны  жайлы. Ассемблер  тілі  сонымен  бірге  символды  түрде  белгіленген  сандардың  тұрақтыларын қолдануға  және бағдарлама  текстінің  барлық  жерінде қолдануға мүмкіндік  береді:

maxsize = 0FFFFh
mov CX,maxsize mov CX,0FFFFh

соңғы  екі команда  түгелімен эквивалентті. Тұрақтыны  анықтауда  арифметикалық операцияларды  орындауға  болады. Бізге  экранда  символ  позициясын  көрсету  керек болсын.  Әр  бір  символдың бейне  жадыда екі  байт  бойынша  жазылатынын  ескере отырып, экран жолы 80 символды ұзындыққа ие, ал  биіктігі  25 жолдан тұрады  кейбір  символды  экранның  ортасын қою  үшін, келесіде  болуы тиіс:

position=80*2*12+40*2

тұрақтыны  текстік  жолдың  ұзындығын  анықтау  үшін  ыңғайлы:

mes db 'Ждите'
mes_len = $-mes

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

 

12. Ассемблер бағдарламасындағы динамикалық кітаптарды өңдеу (DLL)

 

Динамикалық кітаптарды өңдеу (DLL)

Динамикалық кітапхана рұқсат етілген процедураларды сақтау орны болып табылады. DLL- кітапхана механизмі  Windows операциялық жүйесімен бірге пайда болған және оның бір бөлігі болып табылады. Бұл механизімнің мәні мынада, процессті құрастыруда жасалып жатқан модульді қолданылатын процедуралардың өздері енгізілмейді, тек DLL- кітапханада бар атауларымен бірге олардың аттары(номерлері) ғана енгізіледі. Бұл  механизм  MS DOS-ты бағдарламалау кезінде әртүрлі тілдегі модульдерді байланыстыратын жалғыз амал. Windows ортасында DLL-кітапхана механизмі орынды, нағызы болып табылады. Ол процедураларды топтастыруды ассемблер тілінде өңдейді де, содан оларды динамикалық байланыс механизмін қолдайтын жоғары деңгейлі бағдарламаларда да қолданыла береді.

Бұл кітаптар әмбебап механизмі болып табылады, белгілі бір тілге ғана тәуелді емес, DLL-кітапхана өңдеу ортақ принциптері барлық тілдерге бірдей. Сол үшін DLL-кітапханасын өңдеу кезінде мұндай кітапханаларға ортақ талаптарды еске алу қажет. DLL-кітапхана құрылымының кейбір өзгеше элементтері бар жай қарапайым бағдарлама. Ассемблер тілінде DLL-кітапхананы құру және қолдану процессін қарастырайық. Ол үшін экран бетіне жолды 10 рет шығаратын консольді құрылым өңдейік. Параметірлерді жіберу және қайта алу процедурасы кезінде ұзындық және жол адресі төрт регистірлерге EAX, EBX,ECX,EDX беріледі. Offfffffff мәні болып қайталанады. Процесті қадам бойынша талқылайық.

DLL-кітапхана текстін өңдеу

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

;maket_dll.asm - текст DLL-кітапханалар. :бір функциядан тұрады    - WriteCon
locals
.model flat.STDCALL ; жады модельі flat.
Объявление внешними используемых в данной программе функций Win32 (ASCII):
: процедура хабарландыруы WriteCon общедоступной publicdll WriteCon
.data
.code
DllMainproc
arg №h I nst: dword. @@event: dword. @<ano_use: dword
@@m: moveax.l
ret
DllMainendp
WriteCon ргос :см. дискету и prg05_ll.asm из главы 5 arg@@adr_str:dword.@@len_str:dword
ret
endp WriteCon endDllMain

Мысалыда DLL-кітапхана ассемблердің жай файлы ғана болып табылатыны жақсы көрсетілген. Ең соңында көрсетілген END директивасы, кіріс нүктесінің атына шейін. Бірақ осы жерден бастап түсінбеушілік пайда болады. Негізінде бұл біз ассемблерде кез келгенбағдарламаларда көрсететін жай ғана кіріс нүктесі емес, бұл қатаң белгілі бір жағдайда басқарылатын DLL-кітапханадағы каманда адресі камонда тізбегініңбіріншісі болып табылады. DLL-кітапханасының инициализация кодын біріктіреміз. Бұл компьютердің мақсаты – белгілі бір оқиғалардың болуын DLL-кітапхана инициализация бойынша қажетті әрекеттерді орындау. Егер де бәрібір DLL-кітапханада инициализация бар болса, онда ол айқындалған талаптар бойынша өңделу керек.

Инициализация кодының толық құрылымы нұсқасы мынадай

includeWindowConA.inc;осы файлда флагтың бар екенін тексеріңіз "
DllMain ргос
arg hlnstDLL:dword. event:dword,fImpLoad:dword
cmp [event].DLL_PROCESS_ATTACH
jne m DLL_PROCESS_ATTACH үшін әрекет орындау
cmp [event].DLL_THREAD_ATTACH
jnem : DLL_THREAD_ATTACH үшін әрекет орындау
cmp [event]. DLL_THREAD_DETACH
jnem DLL_THREAD_DETACH үшін әрекет орындау
cmp [event].DLL_PROCESS_DETACH
jnem DLL_PROCESS_DETACH m: moveax.l үшін әрекет орындау
ret DllMainendp

Бұл  біз келтірілген мысалдағы минималды   нұсқасы былай

DllMain ргос
arg hlnstDLL:dword. event:dword,fImpLoad:dword
m: mov eax.l
ret DllMainendp

Немесе былай

DllMain: m: moveax.l ret 12

DLL-кітапханасын құратын процедура кодын жазуда бағдарламаны өңдеудегі қарапайым тәртіп қолданады. Мәліметті баяндау да қарапайым ассемблер бағдарламасынан ешқандай айырмашылығы жоқ. өйткені қорытындысында DLL-кітапхананың код және мәлімет процедурасы процестің кеңістік адресі және оның мәліметтерімен және кодымен бірдей болады.

DLL-кітапхананың бастапқы текстің трансляциясы және үйлестіру тәсілі

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

TASM0PT=/m3 /mx /z /q /DWINVER=0400 /D_WIN32_WINNT=0400
!1f $d(DEBUG)
TASMDEBUG=/zi
LINKDEBUG=/v
lelse
TASMDEBUG=/1
LINKDEBUG=
lendif
!if Sd(MAKEDIR)
IMP0RT=import32
lelse
IMP0RT=import32
lendif
${NAME).EXE: $(OBJS) $(DEF)
t1ink32 /Tpd /aa /c $(LINKDEBUG) $(OBJS).$(NAME).. S(IMPORT). $(DEF) .asm.obj:
tasm32 KTASMDEBUG) S(TASMOPT) $&.asm

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

make -DOEBUG -fmakefile_dll.mak >p.txt

Қорытындысында бірнеше файлдар құралады, оның санағы транслятор tasm 32  және үйлестіру тәсілі(компоновка) nk 32 қаншалықты ойдағыдай болғанына байланысты анықталады. Бұл қорытындыны тез бағалау үшін біз қорытындының барлығын p.txt  файлға қайта қайтарайық. Бұл файлды қарап шығып, басқа файлдарға талдау жасамай DLL-кітапхананы құрудың табыстылығын бағалауға болады. Синтаксистік қате болған жағдайда оларды түзетіп, make-файл жіберуін орындауды қайталау керек. Ойдағыдай үйлестіруді орындау үшін тағы бір файл қажет -.def кеңейтілуімен. Қажетті және жеткілікті файл құралдары maket_dll.def төменде көрсетілегн

LIBRARY maketjll DESCRIPTION 'Win32 DLL' EXPORTS WriteCon @1

 Lib – файылын жасау

DLL-кітапханада орындалатын ішкі функциялардың тұрған орнын қалай көрсету керек? Егер де мазмұн бірақ DLL-кітапханасын қолданса ешқандай қыйындық болмас еді – керектісін көрсет және әрі қарай мазмұн жинау процесін жалғастыра бересің. Ал егерде DLL-кітапханада мазмұн біреуден көп болса немесе оншақты болса, онда бұл жағдайда басқа шешім керек етеді. DLL-кітапханада информацияна орталанған сақтау кезінде lib – файлы қолданылады. Бұл файл DLL-кітапхана функциясын енгізу туралы анықтама (справочник) болып табылады. Бұл жағдайда ешқандай жол көрсетілмейді, өйткені DLL-кітапхананы қарау кезінде операциялық жүйе оны келесі алгоритімдер бойынша іздейді:

  1. каталогтан, ехе-файл мазмұныннан тұратын
  2. процедураның ағымдық каталогында
  3. Windows-тың системалық каталогында
  4. Windows негізгі каталогында
  5. өзгермелі PATH ортасында көрсетілген каталогтарда

TASM папкасында LIB –файлдау құру үшін Implib.exe утилитасы тағайындалған. Біздің мысалыда lib – файлын құру үшін келесі командалық жолды орындау қажет

IMPLIB.EXE maketjll .lib maket_dll.DLL >p.txt

DLL-кітапханасын қолданып құрылымын жинау

Мақсатты құрылым жинау үшін make-файлмазмұнын қарастырайық

NAME = maket
OBJS = $(NAME).obj
DEF = $(NAME).def
lif Sd(DEBUG)
TASMDEBUG=/zi
LINKDEBUG=/v
'.else
TASMDEBUG=
LINKDEBUG=
lendif
TASMOPT=/m3 /z /q # /DWINVER=0400 /D_WIN32_WINNT-0400
# /mx
lif Sd(MAKEDIR)
IMPORT=$(MAKEDIR)\import32+maket_dll
lelse
IMPORT=import32+maket_dl1
lendif
$(NAME).EXE: $(OBJS) $(DEF)
tlink32 /Tpe /aa /x /c $(LINKDEBUG) $(OBJS).$(NAME).. $(IMPORT). $(DEF) .asm.obj:
del $(NAME).EXE
tasm32 $(TASMDEBUG) /ml $(TASMOPT) $&.asm...

Енді 2 make-файл (жинау үшін .dll және .exe) қолдана отырып, олардың мазмұнына салыстыру анализ жасауға болады. Өзгермелі IMPORT-та DLL-кітапханада керекті функциялар (егер lib-файлдар бірнеше болса, онда олар + белгісімен сұрыпталады) туралы мағлұматтан тұратын lib-файлдың атаулары көрсетіледі.

Ехе құрылымын жинау үшін үйлестірушінің (компоновшик) ключі қажет. DEF-файлының maket.def құрылым мазмұны:

NAME maket
DESCRIPTION 'Assembly Console Windows Program'
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
EXPORTS

DLL-кітапханасын қолданып құрылымның жұмыс қабілеттілігін тексеру

Алдынғы қадамдардағы құрылыстың жұмыс істеу қабілеттілігін тексеру үшін отладчик TD32.exe қолдануға болады. Айтпақшы онымен жұмыс жасап жатқан кезде DLL-кітапханасынан процедурадағы клдқа қалай өтіп жатқанына көңіл аударыңдар. Сіздер бұған көмектесетін белгісіз бір жерден пайда болған JMP командаларын көресіздер.

DLL-кітапханасын өңдеу кезінде сіздің ойыңызға сұрақ туады, басқа тілдермен өңделген құрылымдармен қосылушылығы туралы. TASM амалдарының көмегімен өңделген DLL-кітапханасы Microsoft Visual Studio пакетінен DumpBin.exe утилитасының көмегімен қаншалықты сыйатынын тексеру.

Оны келесі жол қатарын жұмысқа қосамыз.

DUMPBIN.EXE -exports maketjJll.DLL>p.txt

Сонда сіз p.txt файылында DLL-кітапханасының  maket_dll.dll экспорт бөлімі туралы есеп аласыз. Алған қорытындыға анализ жасап, сіз Microsoft фирмасының бағдарламалық амалында DLL-кітапханасын танып білу кезінде проблемалар жоқ. Сонымен біз қажетті функцияға тола кітапхананы Visual C/C++, VisualBasic және т.б. тілдерінде бағдарламалау кезінде қолдануға болады. Ұмытпау керек, практикада DLL-кітапхананың загрузкасы процестің адрестік кеңістігінде  3 амал жүреді: анық, анық емес, қайырма. Жоғарыда жинаған құрылым анық емес болды және DLL-кітапханасының загрузкасы құрылымның қзін қосқанда болжам етеді. Ал анық амалы құрылған жұмыс жасапа жатқан кезде болжайды. Сол үшін Win32 API-да арнайы функциялар қолданылады:

HINSTANCE LoadLibraryC LPCTSTR lpLibFileName ):
HMODULE LoadLibraryExtLPCTSTR lpLibFileName,HANDLE hF1le, DWORD dwFlags):

DLL-кітапхана загрузкасының 3 амалы – қайырма загрузка. Бұл загрузка түрі DLL-кітапханасы, DLL-кітапханасының кез-келген экспортық объектісіне рұқсатын жүзеге асыруын керек етпегенше, процестің адрестік кеңістігіне енбейді.

 

13. Берілгендермен алмасу командалары. Берілгендерді қайта жіберу. Портқа енгізу-шығару. Аппараттық құрылғыларды бағдарламалау

 

Сопроцессормен берілгендерді алмасу командалары (LDC, STC)

Егер шарт ақиқат болса, бұл командалар орындалады. 6-кестеде барлық әртүрлі шарттардың орындалуы көрсетілген. 1-суретте екі команданың да машиналық коды келтірілген.

Сурет1 Сопроцессормен берілгендерді алмасу командалары

 

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

Сопроцессор өрісі

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

CRd өрісі және N биті әртүрлі сопроцессорлармен әртүрлі интерпретациялануы мүмкін болған ақпаратты сақтайды. Бірақ CRd регистрі әрқашан жіберілуі қажет болған регистр рөлін орындайды (немесе блоктық жіберуде тізімдегі бірінші регистр), ал N биті жіберу ұзындығын анықтайды: N=0 болғанда алмасу тек бір регистрмен (CRd) жүзеге асырылады, N=1 болса – барлық регистрлермен (есеп контекстін ауыстырып – қосу үшін).

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

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

Команданың орындалуы кезінде жылжу өрісінің құрамы солға 2 битке жылжиды (4-ке көбейту) және кейін базалық регистр (Rn) құрамымен қосылады немесе  одан алып тасталады (U=0); бұл іс-әрекеттер жіберуден бұрын (Р=1) немесе одан кейін (Р=0) орындалуы мүмкін.

Базалық регистрдің модификацияланған мәні оған қайта жазылған (W=1) немесе командалар орындалғанға дейін өзінің бұрынғы мәнін сақтауы мүмкін. Одан басқа, SDC және  STC командалары LDR және STR командаларынан ерекшелене пост-индексті адрестеуде әрдайым базалық регистрлер модификациясы жүзеге асатын (W=1) W битінің мәнін нақты көрсетуді талап етеді.

Алдынғы- индексті адрестеу командасында жылжу қосылған (алынған)  базалық регистр құрамы жіберу үшін бірінші сөздің адресі ретінде пайдаланылады. Екінші сөз (егер бірден көп сөз жіберілсе) бірінші сөзге қарағанда бір сөзге артық адрес бойынша жазылады/оқылады және келесі әр бір сөз үшін жіберу адресі 4 байтқа инкременттеледі (өсіріледі).

Адресті теңестіру

Базалық адрес бір сөздің шекарасы (4 байт) бойынша теңестірілуі қажет.  Бірақ  A[1:0] адресінің кішкене 2 битін жадыны басқару жүйесі пайдалануы мүмкін, мысалы, сөздерді жіберу эмуляциясы үшін, 4 байттық (8 биттік адрестеу) немесе 2 жарты сөздік (16 биттік адрестеу) таңдаулар тізбегін орындағанда.

R15 регистрін пайдалану

Егер Rn регистрі – бұл R15 регистрі болса, онда Rn құрамы команданың өзінің адресі және қосымша 8 байт болады. Мұнда командадағы қайта жазу биті нөлденген (сброс) болуы қажет. (W=0)

Берілгендерді жіберу кезіндегі үзілістер (data aborts)

Егер SWP командасында пайдаланылатын адрес жадыны басқару жүйесі үшін қол жетімсіз болса, онжа жады диспетчері бұл туралы ABORT сигналын орнату арқылы белсенді жоғары қалып – күйге (состояние) хабарлауы мүмкін. Егер W=1, онда базалық регистр құрамын өзгертуге үлгіреді, бірақ, процессор қалып-күйі сақталады.  Үзілістің себебі анықталынып және жөнделіп болған соң үзілген команданы сәтті қайталау  мүмкіншілігінің қамын ойлаудың бір бөлігі сопроцессорға жүктеледі.

Машиналық тактілер саны

LDC және STC  командалары (n-1)S+2N+bl –ден кейін орындалады, бұл жерде n-жіберілетін сөздердің саны,  b-сопроцессордың бос тактілерін орындау үшін қажетті машиналық тактілер саны,  S,N және l машиналық тактілер типінен тәуелді.

Ассемблер синтаксисі

<LDC| STC> {cond} {L} p#,cd,<Адрес>

Бұл жерже: {cond} команданың орындалу шартының екі символдық мнемоникасы (6-кестеге қараңыз)

LDC: жадынан жүктеу және сопроцессорға жөнелту

STC: сопроцессордан жүктеу және жадыға жазу

{L}: бір неше сөздерді жіберу қажеттілігін анықтайды (N=1)

p#: команда адрестелген сопроцессор номері

cd: CRd өрісі үшін cопроцессор регистрі нөмірін анықтайтын өрнек.

<Адрес>: келесі құсқалар болуы мүмкін:

Адрес компиляция процесінде өрнекке сәйкес есептелінеді:

<өрнек>

Ассемблер РС құрамын базалық адрес ретінде, ал өрнекті константа түріндегі жылжу ретінте пайдаланып, команданы орындауға ұмтылады. Мұндай жағдайда бұл адрес РС регистріне қарағанда алғы-индексті болып табылады.

Егер есептелген адрес мүмкін болған шекарадан шығып кесте, онда қате генрацияланады:

Алғы-индексті адрестеу:

[Rn] – нөлден жылжу

[Rn, <#өрнек>] {!}

<өрнек> - байттарда жылжу

Соңғы –индексті адрестеу:

[Rn], <#өрнек>,

Бұл жерде

<өрнек> байттарда жылжу

{! } : есептелген адресті базалық регистрге қайта жазуға рұқсат береді. (W битін командада бірге орнатады).

Rn: жалпы мақсаттағы регистр нөмірін анықтайтын өрнек.

Ескерту:  егер Rn=R15, онда ассемблер жылжудан 8 ді алып тастайды, бұл  ARM7TDMI    командалары конвейерінің дұрыс жұмыс істеуі үшін қажет.

Компьютерлік технологияда порт – бұл сол арқылы берілгендер қабылданатын және жіберілетін қарапайым байланыс. (физикалық немесе логикалық). Жиі порт деп аталатындар:

Аппараттық порт – кабел немесе вилка жалғанатын компьютердің апараттық қамтамасының қандай да бір элементіндегі разъемі (LPT –портты, тізбектелген портты,  USB-ді қараңыз)

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

Желілік (тораптық) порт – TCP және  UDP протоколдарының параметрлері.

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

Аппараттық құралдарды бағдарламалау

Аппаратураны – видеожүйе, пернетақта, тізбектес немесе параллелді интерфейс және т.б. сияқты компьютердің штаттық перифериялық құрылғыларын, сондай-ақ, егер ол ғылыми зерттеуді автоматтандыру немесе технологиялық процессті басқару үшін қолданылса, компьютерге жалғанатын стандартты емес өлшеуі немесе құрылғыларды басқарушы құрылғыларын – бағдарлаалау – ассемблер тілінің ең бір маңызды қолданылуы болып табылады.

Біріншіден, бағдарламалардан аппаратураны басқару жиі максималді жылдам  іс-әрекетті талап етеді. Екіншіден, төмеңгі деңгейде аппаратураны басқаратын бұл бағдарламалар регистрлерге және олардың бөлек биттеріне қатынас жасау жолымен процессордың «таза» командаларына қарағанда эффективтілігі аз, сол операцияларды тіл процедураларының көмегімен ұйымдастырылатын жоғары деңгей бағдарламалау тілдерін пайдаланудан жиі ешқандай пайда таппайды. Үшіншіден, аппаратураны бағдарламалауда, әсіресе,  сараптамалық, бағдарланатын құрылғы қабылдайтын команда және сигналдардың уақыттық және оқиғалық тізбегін қатаң бақылау маңызды, өйткені, процессордың анықталған командасымен тілдің әрбір сөйлемі толық ұйымдастырылатын ассемблер тілін сондай қолданғанда ғана нәтижеге жетеміз.

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

Дайындықты күту режимін құрылғы қандай да  бір команданы қабылдаған соң оны орындау үшін белгілі бір уақыт талап еткенде пайдалану қажет. Мысалы, компьютер басқа компьютерлермен немесе телефон желісімен байланысатын тізбектес портқа ақпараттың келесі порциясын (байт) тізбектес интерфейс құрылғысымен байланыс канатына алдынғы порциясы жіберілмегенше жөнелтуге болмайды.

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

Үзіліс режимі баяу перифериялық қондырғыға қарағанда байланыстың маңызды тәсілі болып табылады. Бұл жағдайда құрылғы тек қана компьютердің жүйелік магистралы нің адрестер, берілгендер және басқару желілеріне (линии) емес, тағы бір арнай бөлінген үзіліс желісіне (линия- сызығына, сымына) де жалғанады. Үзіліс режимінде құрылғыға қашан қызмет көрсету қажет екенін оның өзі шешеді және бұл туралы компьютерге үзіліс сигналын жіберуді процессор хабарлайды. Пайдаланушы қандай да бір пенені басқанда әрқашан үзіліс сигналын жіберетін пернетақта типтік мысал болып табылады. Компбютердің штаттық құрылғыларының үлкен бөлігі – тышқан, дискілер, таймер және т.б. – үзіліс режимін пайдаланады. Аппаратура сирек оқиғаларды тіркеген кезде немесе өлшенетін берілгенедер аппаратурада белгілі бір уақыт ағынында жинақталып және кейін компьютерге дереу бүкіл қорабымен қайта жіберелгенде, бұл режим өлшеуіш аппаратурамен байланыс үшін сондай жағдайларда типтік мысалы болады. (сай келеді.)

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

Бұл дегені, әр бір құрылғыға бір немесе бір неше порт орналастырылады (закрепление) және құрылғыны бағдарламалау in және out командаларын қолданбастан жүзеге асырылады. (егер бағдарланатын құрылғы берілгендердің ағынын жібере алатын болса, онда ins және cuts командаларынан да тыс).

Қарапайым жағдайда құрылғыларды бағдарламалау құрылғыдан оқу жағдайында in немесе оған жазу жағдайында out жалғыз командасын орындауға алып келеді.

Қарастырамыз, мысалы, аппараттың үзілістері маскирование(қолқаға енгізу, қолқалау) және размаскирование (қолқадан шығару) процедуралары. Компьютер құрамына енетін үзіліс контроллерінің әр екеуінде маска (қолқа)  регистрі бар. (2-сурет). Маска (қолқа) битіндегі 0 мәні үзіліс сигналының өтуіне рұқсат береді, 1 мәні жол бермейді. Үзіліс сигналы маска (қолқа) арқылы немесе үзілістер контроллері арқылы өтіп, микропроцессордың INT кірісіне түседі. Маска (қолқа) регистрлерін бағдарламалау жүргізуші контроллер үшін 21һ және басқарылатыны үшін А1һ порты арқылы жүзеге асырылады. Масканың  (қолқаның) бастапқы мәні есептеу жүйесінің конфигурациясынан тәуелді компьютердің бастауыш жүктеу бағдарламаларымен орнатылады. 2-суретте көрсетілген А8һ мәне типтік болып табылады. Мұнда бірінші тізбектес портқа жалғанған жүйеслік таймер, пернетақта, тышқан маскасының (қолқасының)  мәндері жасырылмаған (қолқадан шығарылған) болып табылады.

Сурет 2 Үзілу контроллерін басқарушы маска регистрі

 

IRQ2 жүргізушінің кірісіне жалғанатын СОМ1, жұмсақ диск және де басқарылатын контроллерден шығыс. Параллелдік порттың екеуі де жасырылған (қолқаланған) (LPT1 портына жалғанатын принтер әдетте жиі пайдаланылмайды, ал екінші паралледі порт жиі жоқ болады және ештеңе жалғанбаған екінші тізбектес порт. Басқаша айтқанда, барлық қажеттілер жасырылмаған (қолқадан шығарылған) және барлық қажетсіздер жасырылған (қолқаланған).

Әрқашан үзілістің бір ғана белсенді көзі болып табылатын жүйелік таймер үзілісін жасырылған (қолқалау) қажеттілігі пайда болады. Компьютерге өлшеуіш құрылғылардан түсетін берілгендер ағынын үзу қолжетімсіз болатын автоматтандырылған өлшеуіш жүйелері үшін мұндай жағдай типтік мысал болып табылады. Кез-келген қабылдау процесінің үзілісі қабылданатын ақпараттың бөлігін жоғалтуға әкелуі және құрылғы жұмысын бұзуы мүмкін. Таймер үзілістеріне жол бермеу үшін командалардың мынадай тізбегін орындау қажет:

In Al, 21h ; маска (қолқа) регистрін оқу

Or Al, 1 ; 0 битіне 1 ді орнату

Out 21h, Al ; масканың (қолқаның) жаңа мәнін жазу

Есептеу жүйесінің бастапқы қалып-күйін таймерден рұқсат етілген үзілістермен қалпына келтіру келесідей жүзеге асырылады:

 

In Al, 21h ; маска (қолқа) регистрін оқу

Or Al, 0FEh ; 0 битіне 0 ді орнату

Out 21h, Al ; масканың (қолқаның) жаңа мәнін жазу

Құрылғыға ерікті қатынау режимінің қолданылуына басқа да бір мысал болып 5 бөлімде айтылғандай, өзіне нақты уақыт сағатын және де компьютер конфигурациясы туралы ақпаратты және кейбір кездері парольді қосатын энерго-тәуелсіз КМОП-микросхеманы бағдарламалау болып табылады. КМОП-жадының жалпы көлемі 64 байтты құрайды (00һ тан бастап 3Ғһ қа дейін ) ; КМОП-жадының байттарына қатынау 70һ және 71һ порттары арқылы жүзеге асырылады.

КМОП-микросхемада микропроцессорлық техникада кең пайдаланылатын оның жеке ұяшықтарына қатынау тәсілі ұйымдастырылған. Егер КМОП-жадыны енгізу-шығарудың адрестік кеңістігінде оның 64 ұяшығына қатынау үшін тікелей бағдарламалағанда, онда 64 адрес ажыратуға тура келетін еді. Адрестер пайдаланатын сандарды қысқарту үшін микросхема құрамына екі қызметші регистр енгізілген – адрестік және берілгендер. Адрестік регистрге (70һ порты) қатынау талап етілген КМОП-жады ұяшығының нөмірі жазылады. Бұдан кейін берілгендер регистрін (7 Ні порты) оқу таңдалған ұяшық құрамын оқуға мүмкіндік береді, ал берілгендер регистріне жазу берілгендерді осы ұяшыққа жіберуді орындайды. Нөмірі 0Dh ұяшықтың құрамын оқитын бағдарламаның бүкіл мәтінін келтіреміз. Мұнда КМОП-микросхеманы қоректендіретін батареяның қалып-күйі сақталады. Егер бұл ұяшықтың 7 биті орнатылған болса, онда батарея дұрыс; егер бұл бит нөлденген болса, онда батарея кедергісі мүмкін болған шекарадан төмен  түскен және оны алмастыру керек.

Мысал1. КМОП-микросхеманың ұяшығын оқу

Code segment

Assume cs:code

Main proc

Mov AL, 0Dh; 0DH ұяшығын оқимыз

Out 70h, AL; ұяшық нөмірін беру

In AL,71h; ұяшықтан оқу

Test AL, 80h; 7 битін тексеру

Jnz ok; 7 биті=1, OK ге көшу

Mov ah, 02h; 7 биті=0, қорек жоқ

Mov DL,’-’; ’-’ белгіні шығарамыз

Int 21h; минус символы

Jmp exit; аяқтауға көшу

Ok: mov AH, 02h; батарея қалыпты жағдайда

Mov DL,’+’; ’+’ белгіні шығарамыз

Int 21h; плюс символы

Exit: mov AX, 4C00h;

; бағдарламаны аяқтаймыз

Int 21h;

Main endp

Code ends

End main

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

Компьютерлерде берілгендерді жіберудің жоғары жылдамдығымен (150КБайт/с дейін) және бағдарлануының қарапайымдылығмен ерекшелеленетін Centronics деп аталатын параллелдік интерфейстің бір түрі пайдаланылады. Дегенмен, Centronics берілгендерді тек бір бағытта жіберуге мүмкіндік береді – компьютерден құрылғыға, бірақ бұл проблеманың бір бөлігін шешуге болады, егер интерфейс қалып-күйі желілерін берілгендерді қабылдау үшін қолданса.

Параллелдік интерфейс арқылы компьютерге жалғанатын орнатуда (установка) интерфейспен алмасу сигналдарын қабылдаушы және өңдеуші кездесетін құрылғысы қарастырылуы қажет.

Centronics интерфейсі перифериялық құрылғыға (принтерге) 17 сигналдық желілері және бір неше 0 дік желілері бар кабел көмегімен жалғанады.  Интерфейсті басқару оған орналастырылған 3 порт арқылы жүзеге асады: адресі 378һ берілгендер портымен, адресі 379һ принтер қалып-күйі портымен және адресі 37Аһ принтерді басқару портымен. Порттар фактілі биттері интерфейс сигналдарына сәйкес келетін 8 разрядтық регистрлерді ұсынады. Бұл сигналдардың кейбіреулері, нақты айтқанда, берілгендер және басқару порттарының сигналдары интерфейс үшін шығыс сигналдары болып табылады; оларды ақпаратты жіберуді басқаратын бағдарлама орнатуы қажет. Басқа сигналдар болса, керісінше, перифериялық қондырғыдан түседі және оларға орналастырылған қалып-күй порты биттері қалып-күйінде көрсетіледі; бағдарлама бұл биттерді оқуы және талдауы қажет. 3,12 суретте Centronics интерфейсінің порттары нақты биттерге сәйкес келетін сигналдарымен бірге көрсетілген.

 

378h берілгендер порты

379h жағдай порты

37Ah портбасқару

 

Сурет 3  Centronics интерфейс порты

 

Параллелдік интерфейсті бағдарламалау оның протоколы туралы кейбір мәліметтерді, яғни интерфейс оған жалғанатын құрылғылармен алмасатын сигналдардың тізбектелуін және өзара әрекеттесуін талап етеді. Бұл сигналдардың кейбіреулерінің арнайы тағайындамасы бар және тек ерекше жағдайларда ғана пайда болады (мысалы, РЕ сигналы қағаздың соңы), басқалары болса берілгендерді жіберу процедурасында міндетті түрде қатысады. Соңғыларына берілгендердің 8 биті және үш STROBE’, BUSY және ACK’ басқару сигналдары жатады.

 

Сурет 4 Centronics интерфейсіне арналған берілгендерді алмасу протоколы

 

BUSY сигналы үлкен мәнге ие болғанда белсенді болып саналады. Бұған қарама-қайшылық STROBE’ және ACK’ сигналдарының төмен белсенді қалып күйі болады, сол үшін олар қандай да бір қосымша белгімен көрсетіледі (төбесіндегі сызық, минус белгісі немесе біз сияқты апострофпен).

Интерфейс порттары биттерінің қалып-күйі сигналдарының сәйкестігін бақылай отырып, кейбір сигналдар үшін (SLCT, PE, STROBE) портқа олардың тура, ал басқалары үшін (ERROR, ACK’ BUSY) инверсті мәні жазылатыны назарға алу керек. Принтерге берілгендердің әрбір байтын шығару 3 этаптан тұрады. Ең алдымен бағдарлама BUSY және АСК’ сигналдарының белсенді емес қалып-күйін (бұл құрылғының дайындығын күту) күтуі қажет.

379һ қалып-күй портының 6 және 7 биттері 1 ге орнатылғанына бағдарлама көз жеткізіп D7…D0 интерфейс желілеріне берілгендер кодын орнатуға алап  келетін 378һ берілгендер портына берілгендер байтын жібереді. Соңында бағдарлама 37Аll басқару портының 0 битін орнату және соң нөлдеу жолымен STROBE сигналын қысқа уақытқа орнатуы қажет. Келесі байттар да тура сондай жіберіледі.

Бұл операциялардың барлығын орындай отырып, интерфейстің уақыттық мінездемесін ескеру керек. STROBE сигналын берілгенді орнатып болған соң 0,5 мкс тен кейін ғана басқару портына жіберуге болады және бұл жағдай бағдарламаға азғантай кідіртуді енгізуді талап етуі мүмкін (1 немесе 1 неше jmp командасын;төменде келтірілген бағдарлама мәтінін қараңыз.). Бұл шамасы сол 0,5 мкс тен асып  кетпеуі керек болған STROBE сигналының ұзындығына да қатысты. Тәжірибе жүзінде бағдарламалық кідіртулер жиі қажет болмайды.

4 суретке тағы бір рет назар аударамыз. Принтер берілгендер желісінен берілгендер байтын алып және оны өңдеуді бастап (баспадан шығару нмесе ішкі жадыда сақтау) принтер берілгендер байтын өңдеулерден бос емес болғанда барлық уақытта істейтін BUSY жауап сигналын орнатады. Байттар өңдеуін аяқтап, принтер біршама уақытқа АСК сигналын орнатады және BUSY сигналын алып тастайды. АСК сигналының аяқталуы (BUSY сигналының нөлденген қалып-күйінде) интерфейске берілген алмасу операциясының аяқталуы туралы және келесі берілгендер байтын жіберу мүмкіншілігі туралы хабарлайды.

Қысқасы, жиі АСК сигналының алынуын (снятие) күтудің қажеті жоқ; BUSY сигналының белсенді емес қалып-күйін күту жеткілікті (яғни, қалып-күй портының 7 битінде 1 орнатылған). Жалпы, әртүрлі принтерлер өзінің алмасу протоколының бөлімін шамалы әртүрлі орындауы мүмкін екенін назарға алу керек.

Төменде қарастырылған мысал Epson LQ100 принтеріне тиісті.

Принтер физикалық деңгейде, яғни оның порттарына қатынау жолымен бағдарланатын бағдарлама мәтінін келтіреміз.

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

Келтірілген мысалда принтер таңдалған және бастапқы жұмыс режиміне орнатылған деп болжалданылған, бұл әдетте оны іске қосқанда автоматты түрде орындалады. Мұның куәсі болып басқару портындағы 2 және 3 орнатылған биттері (SLCT IN  және INIT) және қалып-күй портындағы 4 биті (SLCT) табылады.

Принтер жұмыс істеген кезде, жалпы айтқанда, қарастырылуы қажет болған қалып-күй байтының қателікке немесе қағаздың соғына талдауы бағдарламада орындалмайды.Перифериялық қондырғыны бағдарламалаудың үшінші әдісі – үзіліс режимі – мысалда тышқан үзілісін өңдеуді қарастырамыз. Тышқан әдетте бірінші тізбектес СОМ1 портына жалғанады және үзіліс режимінде жұмыс істейтіні белгілі. Кез-келген пернені басу, тіпті, столда азғантай жылжыту интерфейстің  берілгендер портына түсетін, белгілі кодтармен басқарылатын үзіліс сигналдарын өңдейді.

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

Тәжірибе жүзінен, бұл іс-әркеттер біз пернені басқан сәттен-ақ орындалатынын айту керек.  Төменде келтірілген бағдарламада сол пернені басқанда экран ортасында түспен боялған «Левая!», ал оң пернесін басқанда басқа түспен «Правая!» жазуы шығарылады. Келтірілген бағдарлама жұмыс істеуі үшін тізбектес интерфейсті және тышқанның өзін инициализациялайтын тышқан драйверін жүктеу керек. Бұл драйвердің құрамына өзінің үзіліс өңдеушісі енеді. Біз оның адресін біздің өңдеуші адресімен 0Ch верторында араластырамыз және бағдарламада өңдеушілер шынжыры қарастырылмағандықтан бағдарлама іс-әрекеті кезінде тышқан үзілістерін стандартты өңделуі өшіріледі. Бағдарлама аяқталуы алдынан 0Сһ векторының құрамы қалпына келтіріледі және тышқан тағы әдеттегідей жұмыс істей бастайды. Тышқан пернесінің әрбір басылуы (немесе көтерілуі) және оның жылжуы, шын мәнінде, интерфейстің берілгендер портына бір емес, әртүрлі кодпен 3 тізбектес үзіліс бойынша жұмыс істейді.

Сонымен, тышқанның сол пернесін басу 60һ,0,0 кодтар тізбегін, оң пернесін басу – 50һ,0,0 тізбегін, кез-келген пернені басу – 40һ,0,0, жоғары жылжыту – 4Сһ,0,3Ғһ, төмен жылжыту – 40һ,0,1 және т.б. береді. Мұндай жағдайда үзіліс өңдеушісінде барлық үш кодты сақтау және кейін барлық тізбекті талдау шынымен керек болар еді. Біз қарапайымдылық үшін тек бірінші кодтың талдауымен шектелдік. Жоғарыда келтірілген тізімнен көрініп тұрғандай, бір ғана кодтың талдануы айрықшалау мүмкіндігін бермейді, мысалы, перненің көтерілуінің төмен жылжуынан.

Тышқан генерациялайтын кодтар оның типінен тәуелді болуы мүмкіндігін бұл мысалды дайындағанда ескеру керек. Генерацияланатын кодтар мәнін алу үшін үзіліс өңдеушісінде оларды BIOS тың 10һ үзіліс функциясының көмегімен экранға шығаруды қарастыруға болады, мысалы, 3-5 мысалдағы сияқты немесе тікелей видоебуферге шығарумен. Тек назар аудартатын бір жайт, тізбектес интерфейспен кез-келген үзілісті ұстау міндетті түрде оның берілгендер портына оқылуымен тіркесуі тиіс, өйткені интерфейс келесі берілгендер байтын тек алдынғысы оқылып және өз берілгендер регистрін босатқаннан кейін ғана қабылдай алады.

Мысал 2. үзіліс режимінде тышқанды бағдарламалау.

.586;жаңа процессорлардың командалары болады

Code segment use 16; 16 разрядты қосымша

Assume CS:code,DS:code;  берілгендер командалар сегментінде

Main proc

Push CS; DS ті баптаймыз

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

; тізбектес порттық командалар өңдеушісін сақтаймыз

Mov AX,350Ch; 35h функциясы, 0Ch  векторы

Int 21h

Mov word ptr old_Oc, BX; жылжуды сақтаймыз

Mov word ptr old_Oc+2,Es; сегментті сақтаймыз

; тізбектес порттың өңдеушісін орнатамыз

Mov AX,250Ch; 25h функциясы, 0Ch векторы

Mov DX, offset new_Oc; біздің өңдеушінің адресі

Int 21h

;пернетақтадан енгізу функциясының көмегімен бағдарламаны тоқтатамыз

Mov AH,01h;

Int 21h

; тышқан драйверінің бастапқы өңдеушісін қалпына келтіреміз

Mov Ax,250Ch; 25h функциясы, 0Ch векторы

Ids DX,old_Oc; сақталған адрес

Int 21h

Mov AX,4C00h; бағдарламаны аяқтаймыз

Int 21h

Main endp

New_Oc proc

Pusha; барлық регистрлерді сақтаймыз

Push DS; сегменттік регистрлер

Push ES; Pusha командасымен сақталмайды

Mov DX,3F8h; берілгендер порты

In AL,DX; оқимыз

Cmp AL,60h; 60h коды-сол перне

Je Ibtn; өңдеуге көшу

Cmp AL,50h; 50h коды-оң перне

Je ebtn; өңдеуге көшу

; үзіліс өңдеушісінің аяқталуы

Outret:popes; сегменттік регистрлерді

Pop DS; қалпына келтіреміз

Mov AL,20h; EOI командасы

Out 20h,AL; үзілістер контроллерінде

Popa; барлық регистрлерді қалпына келтіреміз

Iret; үзілістен шығу

; егер тышқанның сол пернесі басылса

Ibtn:mov AH,1EH; символдардың көк бойынша

; сары атрибуты

Mov SI, offset msgdn; шығарылатын қатар адресі

Jmp commn; шығарудың далпы бөліміне

; егер тышқанның оң пернесі басылса

Rbtn:mov AH,2Eh; символдардың жасыл бойынша

;сары атрибуты

Mov SI,offset msgdn; шығарылатын қатар адресі

; шығарудың далпы бөліміне

Commn: mov BX,0B800h; ES баптау

Mov ES,BX; видеобуферге

Push CS; DS баптау

Pop DS; біздің сегментке

Mov CX,6 шығарылатын символдар саны

Mov DI,2000; экранға жылжу

Cld; алға жылжу

Scr:lodsb; AL=келесі символ

Stows; AX тен экранға

Loop scr; цикл

Jmp outret; шығарудан кейін аяқтау

; үзілісті өңдеуге

New_Oc endp ;

Old_Oc dd 0; бастапқы вектор

; үшін ұяшық

Msgdn db “Левая!”; шығарылатын хабарлама

Msgup db “Правая!”

Code ends

Stk segment stack

Dw 128 dup(0)

Stk ends

End main

Келтірілген мысал оның құрылымы тұрғысынан қарапайым құрастырылған.  0Сһ векторының бастапқы құрамы Old_Oc ұяшығында сақталады және бағдарлама аяқталуы алдынан векторды қалпына келтіру үшін пайдаланылады. Үзілістер өңдеушісін орнатуды оңайлату үшін бағдарлама берілгендер сегментісіз жазылған; оның кейбір берілгендері командалар сегментінде орналастырылған. Бағдарлама  басында DS регистрі командалар сегментіне бапталғандықтан берілгендерге адрестеу (негізгі бағдарлама) DS арқылы мүмкін. Тышқан үзілістерін өңдеуді бақылау мүмкін болуы үшін негізгі бағдарламада инициализациялау әрекеттері орындалған соң DОS тың 01һ пернетақтадан символдарды енгізуді күту функциясының көмегімен тоқтатылады. Кез-келген пернені басқаннан кейін бағдарлама тізбектес порт векторының бастапқы қалып-күйін алдын ала қалпына келтіріп аяқталады. Тышқанның сол немесе оң пернесін басқанда инициализациялануы қажет болған іс-әрекет (мысалы, қандай да бір қондығын қосу немесе өшіру) бағдарламада қысқа диагностикалық хабарламаларды экранға шығарумен алмастырылған. Ақпараттық үзілістер өңдеушісінде DОS функцияларын және тәуекелге барып ВІ ОS функцияларын пайдаланбау керек екені жоғарыда айтылғандықтан шығару видеобуферге тікелей жазумен жүзеге асырылған. Lodsb және stows қатарларды өңдеу көмегімен экранға шығару регистрлердің көп санын баптауды талап етеді – DS:SI де кз-қатарының адресі ES:DI видеобуфердегі позиция адресі, СХ те шығарылатын символдар саны бар болуы қажет. Одан басқа үзіліс өңдеушілерінде АХ,ВХ және DХ регистрлері пайдаланылған.  Жалпы мақсаттағы барлық регистрлерді сақтау үшін Pushа командасы, ал оларды қалпына келтіру үшін рора командасы пайдаланылады. Бірақ бұл командалар сегменттік регистрлерді есепке алмайды және оларды бөлек командалармен сақтауға және қалпына келтіруге тура келеді.

Регистрлерді қалпына келтіруде кейбір күрделіліктер пайда болуы мүмкін. Үзіліс өңдеушісі ЕОІ командасын үзіліс конторллеріне жіберумен аяқтауы қажет, ал бұл үшін АL регистрі қажет. Сондықтан регистрлерді қалпына келтіру, барлық жағдайларда, АХ регистрін, ЕОІ командасынан соң орындау керек. Бір жағынан, ЕОІ командасы үзілістер контронллеріне үзілістердің төмен жатқан (орналасқан) деңгейлерін блоктан шығарады, бұл регистрлер қалпына келмеген жерде (нүктеде) біздің өңдеушіні үзетін контроллер арқылы кезектегі үзілістің өтуіне алып келеді. Бұл жүйенің істен шығуына әкеп соғады. Бірақ процессорда бұл жағымсыз жағдайлардың алдын алу шаралары қарастырылған. Оларға толығырақ тоқталамыз. Процессор кез-келген үзіліс сигналын қабылдап, өзінің жалауша регистрлерінде ІҒ жалаушасын аппараттық үзілістерге тиіс салу үшін нөлдейді. Сондықтан үзілістер өңдеушісіне ену әр қашан тиім салынған үзілістермен жүзеге асырылады. Үзілістер контроллерінде төмен жататын деңгейлерді блоктау жай осы үлкен тиімге қосылады және жаңа шектеулерді енгізбейді. Егер үзілістердің өңдеушісі мәтінінде sti үзілістрге рұқсат беру командасы жоқ болса, онда үзіліс оның соңына дейін, iret аяқтаушы командасына дейін тиім салынған болады. Бұл команда стектен шығарылады және CS:IP регистрлерінің және де жалауша регистрлерінің бастапқы құрамын қалпына келтіреді.

Жалауша регистрлерінде үзіліс моментінде ІҒ жалаушасы шартсыз орнатылған еді, әйтпесе үзіліс пайда болмас еді. Жалауша регистрлерін қалпына келтіру бұл жалаушаны орнатуға және аппараттық үзілістерге рұқсат беруге алып келеді, бірақ үзіліс өңдеушісі аяқталған соң. Мұнымен аппараттық үзілістерді ЕОІ командасымен блоктан шығару шын мәнінде үзілістерге рұқсат беруге алып келмейді, және бұл командадан кейін тұратын кез-келген қатарлар тиім салынған үзілістерде орындалады. Нәтижеде ЕОІ командасынан кейін регистрлерді қалпына келтіруде ешқандай проблема болмайды. Бірақтан, әдетте үзіліс өңдеушісін құрудың басқа нұсқасы пайдаланылады. Бұл нұсқада өңдеу бағдарламасының басында ІҒ жалаушасын орнатушы және үзіліс контроллерінде блокталғандардан тыс барлық аппараттық үзілістерге рұқсат беруші sti командасы орындалады. Нәтижеде өңдеуші бағдарламасы IRQ жоғарырақ деңгейінің кез-келген үзілістерімен үзілуі мүмкін. (яғни, кіші нөмірлі  деңгейді), бірақ бұл деңгейдің немесе төмеңгі деңгей сигналдарынмен үзілмейді. Үзіліс өңдеушілерін мұндай құру «көбірек маңызды» үзілістерді,мысалы, таймер немесе клавиатурадан кідірусіз өңдеу мүмкіндігімен қолайлы. Бұл үшін ЕОІ командасынан кейін АХ регистрін қалпына келтіруде мүмкін болатын жағымсыздықтардың алдын алу мақсатында одан алдын үзіліске cli командасымен тиім салынады және үзіліс өңдеушісінің құрылымы шамамен мынадай түрге ие болады:

Popa және iret командалары бұл жағдайда тиім салынған үзілістерде орындалады,  бірақ iret  командасын орындап болған соң жалауша регистрлерінде оның бастапқы құрамы (IF=1 болған)  қалпына келтіріледі және үзіліске сүйтіп тағы рұқсат беріледі.

 

14. Адрестермен және көрсеткіштермен жұмыс жасау. Адресациялау тәсілдері. Адрестер және көрсеткіштер

 

ДК оперативті жадысы ақпаратты сақтауға арналған элементарлы ұяшықтар жиынынан – байттардан тұрады.  Әрбір байттың жеке номері болады. Бұл номерлер адрестеледі және олар жадыдағы кез-келген байтқа хабарласуға мүмкіндік береді.  

 Турбо Паскалда динамикалық жадыны басқаруға арналған иілгіш құрал – көрсеткіштер бар.

Көрсеткіш – мәні ретінде жады байтының адресінен тұратын айнымалы.  

ДК-де адрестер сегмент пен жылжу деп аталатын екі он алты разрядты сөздердің жиынымен беріледі. Сегмент – бұл еселі 16 (0.16,32.48 және т.б.) физикалық адрестен басталатын және ұзындығы 65536 байттық жады аймағы.жылжу керекті адреске хабарласу үшін сегменттің басынан қанша байт жіберу керектігін көрсетеді. 

Турбо Паскаль 7.0 тек ДК-дің стандартты жадысымен ғана жұмыс жасай алады (1мб шамасында). 1мб көп оперативті есте сақтау құрылғысын қолдану үшін  Borland Pascal With Object 7.0 қолдануға болады.

 1 мб көлемінде адресациялау үшін 20 жуық екілік разрядтар қажет: 220=1048576 – оперативтік жадыдағы көлемі 1мб  элементарлы ұяшықтар (байттар) саны. 20 екілік разрядтарды қолдануда кез келген сегменттің адресі он алтылық санау «О» (кез келген сегменттің адресі 16 еселі ) аяқталады. Бірақ бұл адрес 16 екілік разряды бар ұяшықта сақталады.  Мысалы: 1DE20 – 20 екілік разрядтарды қолданудағы сегмент адресі: 1DE2 -  сол сегменттің 16 екілік разрядын қолданғандағы адресі.

Ұяшықтың шынайы адресін есептеу үшін адрес сегментін 16-ға көбейтеміз (екілік есептеу жүйесінде 24-ке немесе солға 4 орынға жылжиды,ал босаған оң разрядтар нольдермен толтырылады).  Көбейту нәтижесі жылжудың құрамымен қойылады. Жылжу 16-разрядты сөз ретінде сақталады. Мысалы:  1DE2*10=1DH20 (бұл жерде 10 – (16) есептеу жүйесінің негізі); 1 DF.20+00006=1DE26 – ұяшық адресі ( бұл жерде  00006 - жылжу)

16 байт жады үзіндісі параграф деп аталады. Жадыда сегменттер бірінен кейін бірі аралықсыз немесе интервалмен жүруі немесе бірін-бірі жабуы мүмкін. Сол үшін ұяшықтың абсолютті адресі бірнеше жолмен құрылуы мүмкін. Мысалы: 00210 - 20 – разрядты абсолютті адрес 00200ЮООЮ (0020 -  16 разрядты сегмент, 0001 - 16 – разрядты жылжу) және  00 1FO* 00020 ( 00200-0001 0=00 1FO, 000101-00010^00020: 001 F -  16 - разрядты сегмент: 0002 - оның 16 – разрядты жылжуы) түрде түрленуі мүмкін.

 Кез келген көрсеткіш өзінің ішкі құрылымы бойынша сегмент және жылжу деп аталатын екі сөздің жиынынан (WORD типті деректер). Көрсеткіштердің көмегімен динамикалық жадыда кез келген деректер типін орналастыруға болады. Деректердің бір элементі  бір немесе бірнеше көршілес байттардан тұруы мүмкін. Көрсеткіш деректердің тек бірінші байтын ғана адрестейді. Көрсеткіштің өзі жадыда 4 байттан тұрады.

 

Адресациялау тәсілдері

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

Адресация тәсілдері өзінде опернданы іздеу мүмкіндіктерін көрсететін процессор фрхитектурасының элементі болып табылады. Басқа жағынан, адресация тәсілдері ассемблер тілінде анықталған түрде белгіленеді және осы мағынада тілдің бөлімі болып табылады. «операнд» терминінің ассемблер тілінде жазылған бағдарламаларға қолданылатындығын айтып өту керек. Машиналық команда үшін операнд олар жұмыс істейтін деректер (негізінде екілік сандар) болып табылады. Бұл деректер регистрлерде немесе жадыда болуы мүмкін. Егер де  ассемблер тілінің командасын қарастыратын болсақ,онда олар үшін операндтар (немесе параметрлер) машиналық команданың операндтарының орналасқан жерін алдымен трансляторға содан кейін процессорға анықтауға мүмкіндік беретін белгілеулер болып табылады. Ассемблер командасы үшін  

mov mem, AX

операндар ретінде mem жадысының ұяшығының белгілеуі, сондай – ақ АХ регистрінің белгілеулері қолданылады. Сонымен қатар сәйкес машиналық команда үшін операндтар  жады ұяшығының құрамы және регистрдің құрамы  болып табылады. 

Ассемблер командалары үшін машиналық команданы орындау кезінде процессор жұмыс істейтін физикалық объектілерді белгілеуде «операнд» терминін қалдырып, «параметр» терминін қолданған дұрыс болар еді, алайда бұларды есепке алмайды,тілдің командаларының операндтары туралы айтқанда машиналық командалардың операндаларын түсінеді. Қазіргі  Intel 32- разрядты процессорларының архитектурасында адресациялаудың түрлі тәсілдері қарастырылған; МП 86-да адресациялау тәсілі аз. Бұл бөлімде Мп 86-да қолданылатын адресациялау режимдері сипатталатын болады. Ассемблер тіліне арналған кітаптарда адресациялау тәсілдерін сипаттаудың түрлі жолдарын кездестіруге болады: тек бұл режимдердің аттары ғана емес, оның сан да түрлі болуы мүмкін. Адресация тәсілдерінің саны процессорда ұйымдасқан санмен тең болады; алайда адресация режимдерін түрлі себептері бойынша топтарға біріктіруге болады, содан біраз шатасу пайда болады. Біз кең таралған, бірақ жалғыз мүмкін емес терминологияны ұстанамыз.   
Регистрлік адресациялау. Операнд (байт немесе сөз) регистрде болады. Бұл адресациялау тәсілін барлық бағдарламалық-адресацияланған процессор регистрлеріне қолдануға болады.

inc СН ; СН құрамына 1к плюс
push DS ;DS стекте сақталады
xchg ВХ,ВР ;ВХ және ВР құрамымен алмасады
mov ES, АХ ; АХ құрамы  ES-ке жіберіледі

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

mov АН, 40h ; 40h саны  АН-қа жүктеледі
mov AL,'*' ; ASCII код символы "*'  AL-ға жүктеледі
int 21h ; 21h аргументі бар үзілу командасы
limit = 528 ; 528 саны  limit белгілеуіне ие болады
mov CX,limit ; limit-пен белгіленген сан  СХ-ке жүктеледі

Соңғы сөйлемде қолданылған mov командасы екі операндтан тұрады; бірінші операнд регистрлік адресацияның көмегімен анықталады,ал екіншісі – тікелейдің көмегімен.

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

; Деректер сегменті
mes db "Сабақ 1' ;Символдар қатары
;Командалар сегменті
mov DX,offset mes ;Қатар адресі DX-ке жіберіледі

Келтірілген мысалда  mes қатарының салыстырмалы адресі, яғни байттардағы қашықтық ол орналасқан бірінші байттың сегемнт басынан DX регистріне жазылады.

Жадының тікелей адресациялануы. Жады адрестеледі; жады ұяшығының адресі (сөз немесе байт) командада көрсетіледі (әдетте символдық формада) және команда кодына түседі:

;Деректер сегменті
meml dw 0 ;Жады сөзі  0-ден тұрады
mem2 db 230 ;Жады байты 230
;Командалар сегменті
inc meml ; meml сөзінің құрамы 1-ге артады
mov DX, meml ; Содержимое слова с именем menu атымен сөздің құрамы  DX регистріне жүктеледі
mov AL,mem2 ; Содержимое байта с именем mem2 атымен байттың құрамы  АL регистріне жүктеледі

Осы мысалды алдыңғымен салыстыра отырып,командада жады ұяшығының атын көрсету операнда бұл ұяшықтың құрамы ; offset сипаттаушысымен ұяшықтың атын көрсету – операнда ұяшық адресі  болып табылатынын көреміз. Жадыны тікелей адрестеу бірінші қарағанда оңай және қарапайым болып көрінеді. Егер біз meml ұяшығына хабарлассқымыз келсе, біз бағдарламада оның атын көрсетеміз. Негізінде жұмыс қиын болып табылады. Кез-келген ұяшықтың адресі екі компоненттен: сегменттік адрестен және жылжудан тұратынын еске түсірейік. Алдыңғы мысалда meml және mem2 белгілеулері жылжу болып табылады. Ал сегменттік адрестер сегменттік регистрлерде сақталады.Алайда сегменттік регистрлер төртеу:  DS, ES, CS және SS.  Прпоцессор қай регистрден сегменттік адресті алу керектігін және оған бағдарламада бұл жайлы қалай хабарлауға болатынын қалай біледі? Процессор префикс деп аталатын кодтар тобын айыра алады.  Бірнеше префикстер тобы бар: қайталау,адрес көлемі,опреранда көлемі,сегмент ауыстырулары. Бізді бұл жерде сегментті ауыстырушылар қызықтырады.

Жадыға хабарласатын процессор командалары  өзінің кодының бірінші байты ретінде сегменттік адрестің қай сегменттік регистрден алынғандығын процессорге анықтауға көмектесетін сегментті ауыстыру префиксінен тұрады ES сегменттік регистрі үшін префикс коды 26h, SS үшін - 361i, CS үшін - 2Eh. Егер префикс болмаса сегменттік адрес  DS регистрінен алынады (ол үшін де префикс қаралған).

Егер бағдарламаның басында assume директивасының көмегімен  указано DS сегменттік регистірінің деректер сегментіне сәйкестігі көрсетілсе,

assume DS:data

онда жадыға хабарласу командасы қандай да бір префикссіз трансляцияланады, ал процессор бұл командаларды орындауда сегменттік адресті DS регистрінен алады.

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

assume ES:data

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

Алайда кейбір жағдайларда сегментті ауыстыру префиксі бағдарламада анық формада көрстеілуі керек. Бұндай жағдай,мысалы егер деректер сегменттер командасында орналасса туындайды.. Мұндай деректерге жүгіну үшін   DS регистрін қолдануға болады, егер оны алдын-ала командалар сегментіне баптап қойса, бірақ онсыз да солай бапталған CS регистрі арқылы адресациялаған оңай. Егер командалар сегментінде  mem атымен деректер өрісі болса, онда бұл өрістен оқу командасы келесі түрде болады:

mov AX,CS:mem

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

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

mov AX,0B800h ;Видеобуфердің сегменттік адресі
mov ES,AX ;Оны ES-ке жібереміз
mov byte ptr ES:0, ' ! ' ;Символды 1-ші  экранның белгі орнына жібереміз
mov byte ptr ES:2, ' ! ' ; Символды 2-ші  экранның белгі орнына жібереміз

ES  регистрін BS00h видеобуфер сегменттік адресіне баптап алып,  "!" белгі кодын  алдымен о салыстырмалы адресіне (видеобуфердің ең басына,0 жылжуы бар байтқа)  ал одан кейін 2 жылжуына ие  келесі орынға (видеобуфердің тақ байттарында символдар атрибуттары сақталады, яғни символ түсі және оның фоны).

Екі командада да ES белгілеуімен: жадыны адресациялау үшін қолданылатын сегменттік регистрді көрсету керек. Бұл белгімен кездескенде транслятор команда кодына сегментті ауыстыру префиксін қосады, бұл жерде  26h коды. Келтірілген мысалда нақты түрде операнданың өлшемін беруге мүмкіндік беретін byte ptr атрибуттық операторын қолдануға кез болдық, Алайда егер бұрын бұл оператор сөз ретінде жарияланған дерекетн байтты алу үшін қызмет етсе, енді бұл жерде оның қызметі басқа. Транслятор команданы өңдей отырып

mov byte ptr ES:0, ' ! '

операнд – қабылдағыштың өлшемін анықтай алмайды. Видеобуфер кез-келген жады секілді байттардан тұрады, алайда бұл жадыны байттар немесе сөздер кезектілігі ретінде қарастыруға бола ма? Операнданың нақты өлшемін бермеген команда

mov ES:0, ' ! '

трансляция қателігіне әкеледі, себебі ассемблер бұл сөйлемді 21һ байтын видеобуферге жіберу командасы ретінде немесе 0021һ сөзінің жіберу командасы ретінде трансляциялау керектігін анықтай алмайды.   Бірінші қарағанда айтылып жатқан командада бірінші операнданың өлшемі нақты көрсетілген болып көрінуі мүмкін, себебі символ (бұл жерде  "!") әрқашан бір байттан тұрады. Алайда, транслятор  "!" белгісіне кездесіп, оны бірден осы символдың  ASCII  кодына түрлендіреді, яғни 21h санын және бұл  санның қалай пайда болғанын және ол қандай көлемге ие екенін білмейді.  Айта кету керк, командада word ptr сипаттаушысын көрсету

mov word ptr ES:0,'!'

 трансляцияның қателігіне алып келмейді, бірақ қолайсыз нәтижелерге алып келеді. Бұл жағдайда видеобуферге оның 0 байтын 21һ кодымен, ал 1 байтын 00һ кодымен толтыратын 0021 һ сөзі жазылады.  Алайда, 00һ атрибуты қара фондағы қара түсті білдіреді және символ экранда көрінбейді (видеобуферге жазылған болса да). Керек болса операнд өлшемін сипаттаушысын енгізбеуге де болады. Ол үшін деректі емес, регистр құрамын жіберу керек:

mov AL,'!' mov ES:0,AL

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

mov ES:0,AX

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

ES регистрі қалғандарының бәріне адресациялау үшін керек. Алайда керек болған жағдайда видеобуферег жазу үшін  DS регистрін қолдануға да болатын еді :

mov AX,0B800h ;Сегменттік адрес
mov DS,AX ;  DS видеобуферіне
mov byte ptr DS:0, ' ! ' ;Символы видеобуферге

DS белгілеуі: бұл жерде қажет, транслятор команда кодына префикс ауыстыру сегментін қоспайды, ал префикссіз команда үнсіздік жағдайда адресациялауды DS арқылы орындайды. Егер мұндай болса, соңғы командада сегменттік регистрді белгілеуді түсіруге болмай ма? Болмайды, себебі  DS белгілеуі:сан  ол сан операнд емес, операнд адресі екенін көрсетеді.  Команда (дұрыс емес)

mov 6,10

10 санын 6 санына жіберуі керек еді, оынң мағынасы жоқ және орындалуы мүмкін емес. Ал команда

mov DS:6,10

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

Регистрлік жанама (базалық және индексті). Жады адресацияланады(байт немесе сөз). Жады ұяшығының салыстырмалы адресі регистрде орналасады, ол тік жақшада белгіленеді.   МП 86 – да жанама адресация тек  ВХ, ВР, SI и DI регистрлері арқылы мүмкін.  ВХ немесе ВР регистрлерін қолданғанда адресацияны базалық деп атайды,   SI немесе DI регистрлерін қолданғанда - индексті. Жоғарыда келтірілген мысалды регистр арқылы жанама адресациялауды көрсету үшін түрлендіреміз.

mov AX,0B800h ;Сегменттік адрес
mov ES,AX ;  ES  видеобуфер
mov BX,2000 ; экранның ортасына жылжу
mov byte ptr ES:[ВХ], ' ! ' ;Символды экранға

ES – ті баптап, ВХ регистріне керек жылжуды жібереміз  ( түрлі болу үшін 4000 байт көлемге  ие видеобуфердің ортасына) және соңғы командада кодты ES:BX жұп регистрлері арқылы сегменттік ауыстыруды көрсетіп (ES:) жанама базалық адресациялау көмегімен  жібереміз. Егер жанама адресациялау
ВХ, SI немесе DI регистрлерінің бірімен жүзеге асырылса, онда  DS арқылы адресацияланатын сегментті білдіреді, сол себепті бұл регистр арқылы адресациялау кезінде DS: белгілеуін түсіруге болады:

mov AX,0B800h ;Сегменттік адрес
mov DS,AX ; DS видеобуферге
mov BX,2000 ; экранның ортасына жылжу
mov byte ptr [ВХ], ' ! ' ; Символды экранға

Бұл үзінді жадыны шығындау жағынан алдыңғыдан эффективті. Соңғы команда кодында префикс ауыстыру сегментінің болмауынан  ол 1 байтқа аз орын алады. ВХ, SI және DI регистрлері осы қолданылуда бірдей және олардың кез келгенімен қолдануға болад:

mov D1,2000 ; экранның ортасына жылжу
mov byte ptr [DI] , ' ! ' ; Символды экранға

 ВР регистрімен басқаша. Бұл регистр арнайы стекпен жұмыс жасауға арналған және бұл регистр арқылы адресациялау кезінде жанама адресациялау режимдерінде стек сегменті білдіріледі; басқаша айтқанда, сегменттік регистр ретінде үнсізідк жағдайында  SS регистрі қоланылады.
 Әдетте стекке жанама адресациялау стекте орналасқан деректерге оларды алмай-ақ хабарласу керек болған кезде қолданылады (мысалы егер бұл деректерде бірнеше рет есептеу керек болғанда). Мұндай операцияға мысал келесі адресациялау режимін қарастырғанда көрстеіледі. Жоғарыда келтірілген бғдарлама үзіндісін салыстыра отырып, базалық адресацияны қолдану бірінші қарағанда бағдарламаның эффективтілігін төмендетеді деп ойлауға болады, себебі қосымша операцияны – керекті адресті базалық регистрге жүктеуді  талап етеді. Шынында, біздің мысалда базалық адресация ақталмаған – екі команданың орнына тікелей хабарласу жағдайы болса.

mov BX,2000 ; экранның ортасына жылжу
mov byte ptr ES: [BX] , ' ! ' ; Символды экранға

біреуін қолдануға болады

mov byte ptr ES:2000,'!' ;Символды экранның ортасына шығарамыз

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

Жылжумен регистрлік жанама адресациялау (базалық және индексті). Жады адресацияланады(байт немесе сөз).   Операнданың салыстырмалы адресі  BX, BP, SI немесе DI регистрінің құрамының қосындысы ретінде және кейде жылжу деп аталатын константаның командасында көрстеілген түрде анықталады. Жылжу сан немесе адрес болуы мүмкін. Базалық адресация жағдайындағы секілді  BX, SI және DI регистрлерін қолдануда  DS арқылы адресацияланатын сегмент, ал ВР қолдануда стек сегменті білдіріледі және сәйкес SS регистрі. Жылжуы бар жанама адресациялауды видеобуферге шығару мысалы түрінде қарастырайық. 

mov AX,0B800h ;Сегменттік адрес
mov ES,AX ; ES видеобуфер
mov DI, 80*2*24 ; Экранның төменгі қатарына жылжу
mov byte ptr ES: [DI] ,'О' ;Символды экранға
mov byte ptr ES:2[DI],'К' ; символды келесі орынға жазайық
mov byte ptr ES:4[DI],' ! ' ; символды келесі орынға жазайық

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

Кейде ассемблер мүмкіндік беретін адресация тәсілінің альтернативті белгілеуін кездестіруге болады. мысалы 4[ВХ] орнына сондай сәттілікпен  [ВХ+4], 4+[ВХ] немесе [ВХ]+4 жазуға болады. Тілдің бұндай біркелкі болмауы шатасудан басқа ештеңе алып келмейді, алайда оларды есте сақтау керек себебі мысалы деассемблерленген бағдарламалаудың мәтінін қарастырып отырып осы белгілеулерге кез болуымыз керек. Енді стекке хабарласу кезіндегі жылжуы бар базалық адресацияны қолданудың мысалын қарастырайық: 

;Негізгі бағдарлама
push DS ;Стекке мән жүктеледі
push ES ;үш регистрдің,
push SI ; ішкі бағдарламаға берілетін
call mysub ; mysub ішкі бағдарламасын шақыру,
;мына параметрлерді қолданатын
; mysub ішкі бағдарламасы
mov BP,SP ;ВР – ға стектің ұшының ағымдық адресін оранластырамыз
mov АХ,2[ВР], ; АХ – те соңғы параметрді (SI ) оқимыз
mov ВХ,4[ВР] ; ВХ – те алдыңғы параметрді (ES) оқимыз
mov CX,6[BP] ; СХ – та бірінші параметрді (DS) оқимыз

Мұнда  стектің мазмұнын ондағы деректерді шығармай оқудың классикалық оқу түрі қарастырылған. Негізгі параметр стекте ішкі бағдарламаға керек үш параметрді сақтағаннан кейін call командасымен  mysub ішкі бағдарламаы шақырылады. Бұл команда стекте қайту адресін сақтайды ( негізгі бағдарламаның  call-дан кейін келетін сөйлемі) және ішкі бағдарламаға өтуді жүзеге асырады.  Ішкі бағдарламадағы кірудегі стек жағдайы 1 суретте көрстеілген.

Сурет 1. Стектің оған үш параметрдің жүктеліп, ішкі бағдарламға өткеннен кейінгі жағдайы.

 

Егер ішкі бағдарлама стектен онда оранласқан параметрлерді алып қана қойғанда, ол бірінші қайту адресін алатын еді және өзін негізгі бағдарламаға қайту мүмкіндігінен айыратын еді. Сол үшін бұл жағдайда  pop командасының орнына  mov командасын қолданған ыңғайлы. Ішкі бағдарлама  ВР-ға үш параметрдің құрамын және SP орнына өтуді көшіреді және осы адресті базалық ретінде оны жылжуы бар базалық адресацияның көмегімен модификациялап  қолданады. Бұл жерде стекте қайту адресін сақтай отырып, стек көрсеткішін тағы бір орынға жылжытатын  call командасы бар. Біздің мысалда біз негізгі бағдарламаға қайтуды қарастырмаймыз. Параметрлерді стектен жалпы қызметтегі регистрге көшіре отырып ішкі бағдарлама олардың бастапқы құрамын жоғалтады. Егер де олар керекті ештеңеден тұрмаған болса оларды ішкі бағдарламаға параметрлерді жіберу үшін қолдануға болатын еді. Шынында, қысқарту үшін біз  кез –келген ішкі бағдарламад керекті операцияларды – ішкі бағдарламда қолданылатын регистрлерді стекте сақтау (тағы да ! стекте) түсірдік. Бұл ВР регистріне де қатысты. Нақты ішкі бағдарламада бұл әрекеттерді орындау керек еді, ол ВХ регистрінде жылжудың өзгеруіне алып келетін еді, олардың мәні (4 регистрдің сақталуымен) 10,12,14 болатын еді.  Жоғарыда келтірілген балық мысалдарда регистр базалық адресті сақтау үшінқолданылған , ал жылжу керек болса константа түрінде көрсетілген.  Кері жағдай болуы да мүмкін, жылжу ретінде адрес массиві, ал регистрде осы массивтегі адресауцияланатын элементтің индексі орналасады. Бұған нақты мысал қарастырайық. Бізге 10000 сөзді массивті сандармен толтыру керек болсын.   Осы массивке деректер сегментінен орын алып қояйық , ал командалар сегментінде өспелі сандарды кезекті сөздерге енгізу циклын ұйымдасытрайық. Бізге бірнеше жаңа командаларды қолдануға тура келеді
(inc, add и loop), олар алда кеңірек қарастырылады.

;Деректер сегменті
array dw 10000
;Командалар сегменті
mov SI, 0 ; Массивтегі элемент индексінің бастапқы мәні
mov АХ, 0 ;Бірінші сан - толтырушы
mov СХ,10000;циклдегі қадамдар саны (әрқашан  СХ-те)
fill: mov array[SI],AX ; Массив элементіне санды енгізу
inc AX ;Сан-толтырушының инкременті
add SI,2 ;Массивте келесі сөзге жылжу
loop fill ; fill белгісіне оралу (СХ рет)

Цикл fill белгісімен белгіленген командадан басталады ( белгі аттарын құру ережелері деректер өрісі секілді). Бұл командада АХ құрамы, бастапқыда 0 тең, жады ұяшығына жіберіледі, оның адресі  array массивінің адрестер соммасы және циклдың бірінші қадамында мәні 0-ге тең  SI индекстік регистрінің құрамы түрінде анықталады. Нәтижесінде массивтің бірінші сөзіне 0 енгізіледі. Ары қарай АХ регистрінің құрамы 1-ге, SI 2-ге көбейеді (массив сөздерден тұрғандықтан) және  loop командасымен  осуществляется переход на метку fill белгісіне өту жүзеге асырылады,одан кейін цикл денесі  АХ және SI регистрлерінің жаңа мәндерінде қайталанады.  loop командасымен есептелетін циклдегі қадамдар саны СХ регистрінің бастапқы құрамымен анықталады.

Базалық-индексті адресациялау. Жады адресацияланады(байт немесе сөз). Операнданың салыстырмалы адресі келесі регистрлер жұбының құрамының соммасы ретінде анықталады:

[ВХ] [SI] (подразумевается DS:[BX][SI])
[ВХ][DI] (подразумевается DS:[BX][DI])
[ВР] [SI] (подразумевается SS:[BP][SI])
[ВР] [DI] (подразумевается SS:[BP][DI])

Бұл адресациялау тәсілінің кең тараған түрі, әсіресе массивпен жұмыс істеу кезіндегі. Онда екі регистр қолданылады, олардың біреу базалық(ВХ немес ВР), ал екіншісі индексті (SI немесе DI)болуы керек. Регистрлердің бірінде массив адресі, ал екіншісінде индекс орналасады. Алдыңғы мысалды оған эффективті базалық – индексті адресацияны енгізе отырып трансформациялаймыз.

;Деректер сегменті
array dw 10000
;Командалар сегменті
mov BX,offset array ;Массивті базалық адресі
;базалық регистрдегі
mov SI, 0 ; Индекстің бастапқы мәні
;массивтегі элементтің
mov АХ, 0 ; Бірінші сан-толтырушы
mov CX,10000 ; Циклдегі қадамдар саны
fill: mov [BX][SI],AX ; Санды массивке жібереміз
inc AX ;Сан-толтырушының инкременті
add SI, 2 ; массивте келесі сөзге жылжу
loop fill ;fill белгісіне (CX рет)

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

Жылжуы бар базалық-индексті адресациялау. Жады адресацияланады(байт немесе сөз). Операнданың салсытырмалы адресі ек регистрлердің құрамының соммасы және жылжу түрінде анықталады. Бұл адресациялау тәсілі алдыңғының дамыған түрі болып табылады. Онда сл регистрлер жұбы қолданылады,олардың көмегімен алынған нәтижелі адрес константа командасында көрсетілген мәнге жылжытуға болады. Базалық-индекстеу адресациялаудағы секілді константа индекстен тұру мүмкін (онда регистрлердің бірінде жадының базалық адресі болуы керек), бірақ базалық адрес болуы да мүмкін. Соңғы жағдайда регистрлер индексті құраушыларын сақтау үшін қолданылуы мүмкін. Қарастырылып жатқан адресация режимінің мысалын қарастырайық. Деректер сегментінде пернетақтаның жоғарғы жағындағы орыс және латын әріптері жазылған 24 юайттан тұратын массив берілген:

sims db "QWERTYUIOP{}'
db "ЙЦУКЕНПШЦЗХЪ'

Командалар кезектілігі

mov BX,12 ;қатардағы байттар саны
mov SI, 6
mov DL,syms[BX][SI]

 агрузит в регистр DL регистріне екінші қатардағы 6 индексі бар элементті жүктейді, яғни  ASCII кодының  Г әрпі. Сол нәтижені регистрлердің біріне индекс емес массив алресін жүктеп алуға болады:

mov BX, off set sym
mov SI,6
mov DL, 12 [BX] [SI]

 

15. Мәліметтерді түрлендіру. Бағыттаудың қосымша тәртіптері.

 

Мәліметтерді түрлендіру – шарттардың орындалуына сол немесе басқа әдісін өңдеуге бағытталған, берілгендердің бейне өзгертілуі.

Windows NT желісіндегі TCP/IP стекпен жұмыс 9.1. ОС Windows NT-дегі TCP/IP-тің орындау ерекшеліктері

Көпшілік операциялық жүйелерді TCP/IP хаттамалары сүйегендіктен, олар бұл сект хаттамаларын әрекеттестік құралы ретінде қолдана алады. TCP/IP-ті қолдана отырып, Windows NT көптеген операциялық жүйелермен араласа алады,

Internet желісі;

Apple Macintosh жүйелері;

Unix базасындағы жүйелер;

IBM мэйнфреймы;

DEC Pathworks компьютерлер желілері;

Принтерлер желілі даптерлермен, желіге қосылған.

TCP/IP стекіне шолу

Transmission Control Protocol/Internet Protocol (TCP/IP) – бұл глобальды желіге арнап өңделген, стек хаттамаларының өнеркәсіпті стандарты. Request for Comment (RFC) деп аталған, TCP/IP стандарттары құжаттардың сериясында жарияланған. RFC құжаттары Internet жүйесінің ішкі жұмысын суреттейді. Кейбір RFC желі сервистерді немесе хаттамаларды және оларды орындалуын бейнелейді, сол уақытта қолдану шарттарын талдап, қорытады. TCP/IP стандарттары әрқашан RFC құжаттар түрінде жарияланады, бірақ  RFC-тардың барлығы стандартты анықтай бермейді.

ОС Windows NT-та TCP/IP стекін орындау келесі артықшылықтарды береді:

Бұл стандартты бірлескен желілі хаттама, аяқталған және әйгілі желілі хаттаманы ұсынады. Барлық қазіргі замандық операциялық  жүйелер TCP/IP қолдайды, ал барлық үлкен желілер өзінің тарифінің негізгі бөлігін TCP/IP хаттамасы арқылы береді. Бұл Internet желісіне рұқсат алу әдісі. Бұл әр текті жүйелердің қосуына арналған технология. Стек көптеген стандартты рұқсатқа арналған әрекеттестік құралдары және әр текті жүйелер аралық тап осы тапсырудың, файлдарының тапсыру хаттамасын және Telnet терминал эмуляция хаттамасын қоса көрсетеді. Бұлардың ішіндегі кейбірі стандартты құралдары Windows NT құрамына қосылған. Бұл платформааралық масштабталатын клиентсервер қосымшаларына арналған тұрақты орта.  Microsoft TCP/IP Windows Sockets интерфейсін, клиент-сервер қосымшаларын өңдеуге арналған өте ыңғайлы құрал ұсынады. Бұл қосымшалар Windows Sockets интерфейсімен басқа өндірушіллердің стектарында жұмыс істей алады. Windows Sockets арналған қосымша басқа желілі Microsoft NWLink немесе NetBIOS сияқты  хаттамаларымен қолданыла алады. TCP/IP стек Windows NT ортасында мынаны қамтиды:

Негіздік хаттамалар - TCP, IP, UDP, ARP, ICMP.

Қолданбалы бағдарламалық интерфейстер - Windows NT Sockets  желілі бағдарламалауға арналған, RPC – компьтерлер аралық әрекеттестіктер үшін, NetBIOS қисынды аттарды және желідегі сессияны қолдануға,  желілі болжама DDE жүйе арқылы құжаттарға қоса салынған информацияны бөлуге арналған. Қолданбалы деңгей сервисы, Finger, FTP, RCP, REXEC, RSH, Telnet, TFTP қоса. Бұл сервистер Windows NT Server қолданушыларға компьютердің ресурстарын мысалы Unix, Microsoft  компанисында өте жақсы өңделген ОС бірге қолдануға рұқсат етеді.

TCP/IP диагноздық құрал, ARP, HOSTNAME, IPCONFIG, NBTSTAT, NETSTAT, PING, ROUTE қосатын. Бұл утилиттер TCP/IP стегімен жұмыс жасағанда желілі проблемалаларды табуға және жоюға қолданылады.

SNMP - TCP/IP хаттамасының агенті. Бұл компанентті Windows NT жүйесімен, мынадай Sun Net Manager немесе HP Open View құралдарын қолдану арқылы компьютерді басқаруға болады.

Утилиттер және Windows NT-дегі TCP/IP сервистері

Windows NT Server қосымша утилиттер және TCP/IP сервистерін қоса:

DHCP – TCP/IP  стегінің параметрлерініңң автоматты түрдегі конфигурасын Windows NT Server, Windows NT Workstation, Windows for Workgroups ортасында және Microsoft компаниясының  желілі клиенттерінің өндірісі.

WINS – компьютерлердің аттарын динамикалық түрде тіркейді және олардың  IP-мекен-жайына сәйкестігін қолдайды.

 LPDSVC – Unix ортасында жұмыс жасайтын принтерлерге рұқсатты қамтамасыз етеді.

FTP серверіне арналған бақылау функциясы барлық FTP-операциясын тіркеуге рұқсат етеді.

Сонымен қатар, Windows NT Server-не қосымша қарапайым TCP/IP- хаттамалар қатары қосылған, оларға мыналар қатысты:

ECHO – кез-келген алынатын мәліметтерді қайта қайтарады.

DISCARD – кез-келген алынатын мәліметтерді лақтырып тастайды.

CHARGER – бұл алынатын мәліметтерге назар аудармай ақ,  мәліметтерді жіберетін символдардың генераторы. Бірақ бұл мәліметтер кез-келген болуы мүмкін, сол үшін кейбір үлгілерін қолдану ұсынылады.

QUOTE – күннің қысқаша цитатасын жібереді. Бұл цитата сервис мәліметтерімен жеткізіліп тұратын, цитаталардың пайдаланушы файлынан немесе цитаталардың файлынан шығарыла алады.

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

Желі деңгейінің негізгі хаттамасы ретінде (термидерде OSI моделдері), стекте пакеттерді тапсыру хаттамасы сияқты басында жобаланған құрама жүйелерде үлкен санды, локальды түрде, сондай-ақ глобальды байланыстармен біріккен жергілікті жүйелерден тұратын IP хаттамасы қолданылады.Сондықтан TCP/IP стегі, ішкі жүйелерді орынды қолдана отырып және байланыстың төменжылдамдықтағы глобальды сызықтарын үнемдеп жұмсау қабілеттілігін қолдана отырып күрделі топологиямен жүйелерде жақсы жұмыс істейді.

IP хаттамасының негізгі функциялары -  пакеттерді сапаржеліктеуі, сонымен қатар құрастыру және пакеттерді тәртіптеп сұрыптау. Соңғы функция пакеттің максимальды ұзындығы азырақ, пакеттер бір жүйеде қалыптасқанда және басқа жүйе арқылы берілгенде қажет. IP хаттамасы датаграммды хаттама болып табылады. Осы деңгейге жүйе аралық басқарушы хабарлаулардың хаттамасы ICMP (Internet Control Message Protocol) жатады. Бұл хаттама сапар желіктегіш аралық қателер туралы немесе шлюзбен хабарларды алмасу үшін, жүйемен және жүйе-қабылдағышпен, яғни кері байланыс ұйымына арналған. Арнайы ICMP пакеттері көмегімен пакеттерді жеткізу мүмкіншілігінің жоқ екенін, өмір уаытытының артуын немесе немесе фрагменттерден пакеттерді құруды жалғастыруды, параметрлердің аномальды мөлшерлерін, маршрут өзгерісін қайта жіберуді және қызмет ету үлгісінің, жүйенің күй-жағдайлары туралы сауалдар-жауаптар және т.б. хабарлайды.

Аса жоғары дәрежеде  тапсыруымен TCP (Transmission Control Protocol) басқару хаттамасын және пайдаланушы дейтграмм хаттамасы UDP (User Datagram Protocol) жұмыс жасайды. TCP хаттамасы өшірілген қолданбалы процесс аралық тұрақты виртуалды байланыс қосуды қамтамасыз етеді. UDP хаттамасы қолданбалы пакеттердің датаграммды әдісін, яғни виртуальды  байланыс орнатылмаған, және сол үшін TCP қарағанда, аз қапталған шығындарды талап етеді.

TCP/IP стегінің  ең жоғарғы деңгейі қолданбалы деп аталады. Әр түрлі елдер жүйесінде ұзақ жылдар бойы қолданылуы және  TCP/IP стек ұйымы хаттамалардың үлкен көлемдегі және қолданбалы деңгейдегі сервистерін жинаған. Оларға кең қолданылатын хаттамалар, FTP файлын қайта сілтеуші хаттамасы, telnet  эмуляция терминалының хаттамасы, Internet  электрондық пошта жүйесінде қолданылатын SMTP пошталық хаттамасы, WWW сияқты және көптеген басқа өшірілген хабарларға рұқсаттың гипермәтіндік сервисы жатады.

Сур. 2. Microsoft TCP/IP хаттамалар стегі

 

SNMP (Simple Network Management Protocol) хаттамасы жүйелік басқару ұйымына қолданылады. Модельді басқару TCP/IP нұсқасында басқару мәселесінекі бөлікке бөледі. Бірінші бөлік хабарламаларды жіберумен байланысты. Басқару хабарламаларын жіберуші хаттамасы, сервермен қарым қатынаста болатын, администраторда жұмыс істейтін бағдарлама – клиенті секілді анықтайды. Олар клиенттер және серверлер, сонымен қатар формат аттары және мекен-жайлар алмасатын хабарламаның форматын және мағынасын анықтайды. Екінші бөлік мәлімет қадағалаушымен байланысты. Стандарттар қандай мәліметтерді сақтау керек екенін және серверде жиналатынын, осы мәліметтердің атауларын және  атауларының синтаксистерін регламенттейді. SNMP стандартында жүйе арқылы мәліметтерді басқаруды анықтайды. Бұл спецификация, MIB (Management Information Base) мәлімет базасымен танылған. Ол хост және шлюз сақталатын, және оларға операциялары мүмкін мәліметтің элементтерін ғана анықтайды.

SNMP жүйесімен басқару хаттамасы жүйені басқару системасының бағдарлама-клиент арасындағы қарым-қатынас ережесін анықтайды. Онымен, хабарларды жинақтаушы бағдарлама-сервермен, администратор жұмыс жасайды.

FTP (File Transfer Protocol) файлдарды қайта жіберуші хаттамасы басқа жердегі файлға қол жеткізу мүмкіндігі. Ол желі арқылы файлдарды ұсыныстармен және пайдаланушылармен қолданылуы мүмкін. Сенімді жіберуді қамтамасыз ету үшін, FTP тасымал ретінде TCP – байланыс орнатушы хаттамасын қолданады. Бірақ, файлдарды қайта жіберуден бөлек, FTP хаттамасы басқа да қызметтерін ұсынады. Сонымен, пайдаланушыға басқа жақтағы машинамен интерактивті жұмыс ұсынылады. Мысалы, ол каталог құрамын шығара алады. Одан бөлек, FTP қолданушыға есте сақталтын мәліметтің типін және форматын көрсетуге рұқсат етеді. Әйтеуір, FTP  қолданушының аутентификациясын орындайды. Талапты файлды жібермей тұрып, хаттамаға сәйкес қолданушылар өзінің атауын және құпия нөмірін хабарлаулары тиіс. FTP   TCP/IP стегінде файлдарды жіберу хаттамаларының ортағы болғанымен, ол бағдарламалау үшін ең қиыны болып табылады. FTP-тің барлық мүмкіншіліктерін қажет етпейтін қосымшалар, басқасын, үнемдірек хаттама – қарапайым  TFTP (Trivial File Transfer Protocol) файлдарды қайта жіберу хаттамасын қолдануы мүмкін. Бұл хаттама тек қана файлдарды жіберуді қамтамасыз етіп, жүзеге асырады. Тасымал ретінде TCP-ға қарағанда қарапайымдырақ, UDP – байланыс орнатусыз хаттама қолданылады.

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

Канальды, желілі және трнаспортты деңгейлерді Windows NT-да жүзеге асырады. Басқа көптеген желілі операциялық жүйелерде, драйвер түрінде жүзеге асырылады.

TCP/IP утилиттері

PING – конфигурацияны тексереді және байланысты тестілейді.

FTP - Windows NT және TCP/IP хостасы  UDP хаттамасын қолданушы компьютерлер аралық файлдардың екі бағытты тапсыруын қамсыздандырады.

Telnet – терминал эмуляциясын қамсыздандырады.

Remote Copy Protocol (RCP) - Windows NT және Unix-хост компьютрлер аралық файлдарды көшіреді.

Remote Shell (RSH) – жойылған Unix-хостта командалар жібереді.

Finger – Finger сервисін қолдайтын, алыстатылған компьютерден жүйелік хабарын алады.

ARP – локальды кэш құрамын көрсетеді. Онда IP-мекен-жайының МАС-мекен-жайымен сәйкестігі туралы хабар сақталады.

IPCONFIG - TCP/IP стегінің ағымдағы конфигурациясын суреттейді.

NBTSTAT – IP-мекен-жайында бейнеленген NetBIOS хаттамасы компьютерлерлер аттарының тізімін көрсетеді.

NETSTAT - TCP/IP сессиясы туралы хабарды көрсетеді.

ROUTE – сапаржеліктеу кестесін суреттейді немесе модификациялайды.

HOSTNAME –Егер онда осы команда орындалса, компьютер атын қайтарады.

Адресаттың қосымша режимдері

32-разрядты процессор, 32-биттік жылжу пайда болуының талаптарынан  шыға  отырып, құрылады. Басқа  сөзбен  айтқанда,  32-разрядты қосымша  үшін  арналған. Оларда берілгендер сегменті мен стектердің  өлшемі    232 = 4 Гбайт  болады. Бірақта  нақты режимде  кез келген  сегменті  216 = 64 Кбайт  шамасымен  шектеледі. Және 32-битті жылжудың  мәні  болмайды. Басқа жағынан қарағанда, егер  нақты  құрамындағылар FFFFh шамасынан аспаса, 16-биттік жылжыду құру үшін 32-разрядты регистрлерді пайдалануға  болады. Операнд ретінде 32-разрядты регистр командаларын көрсетуге болады. Ол бізге жадыны адресациялау жағынан 32-разрядты процессорлардың қосымша мүмкіншілітерін қолдануға  мүмкіндік береді. Кейбір жағдайларда бұл тиімді. Бұл жерде айтып өту керек жадының жанама адресациясын сипаттайтын операнд туралы сөз болып отыр. МП 86-да  ВХ және  ВР регистрлері ғана базалық бола алатын, ал SI және  DI индекстік бола алады. 32-разрядты процессорда  базалық және индекстік регистр ретінде жалпы пайдаланудағы регистрлерді қолдануға мүмкіндік береді. Осылайша, мына команда түрі заңды:

mov ЕАХ,[ЕСХ][EDX]

Екінші ерекшелігі индекстік регистрдің құрамындағыларды масштабтау мүмкіндігінде. Яғни оның командада берілген коэффициентке көбейту.Ол 1,2,4 мәндерін қабылдай алады. Осындай адресацияның мысалы

inc word ptr [ЕАХ] [ЕСХ*2]

Жанама адресаттың қосымша режимі 32-разрядты регистрді қолдануды талап ететінін тағы да көрсетеміз. Командалар:

inc word ptr [AX] [ECX*2]

немесе

inc word ptr [ЕАХ] [СХ*2]

дұрыс еместер сияқты, ассемблермен қаралады.

32-разрядты регистрлерді қолданудағы 32-разряты процессорлармен пайдалануға берілетін жанама адресат жадының режимдері, 3 сур. бейнеленген. Суреттен базалық ретінде жалпы белгіленген барлық регистрларды, ESP көрсеткіш стегін қоса қолдануға болатындығы көрініп тұр.Осы жағдайда, базалық ретінде  ESP немесе ЕВР регистрларының бірі алға шқса, онда адресация SS сегментті адресациясы арқылы үнсіз орындалады. Бірақ сегменттің ауысуы мүмкін. Барлық басқа жағдайларда адресация DS сегментті регистрі арқылы үнсіз орындалады. ЕВР регистрін индексті ретінде қолдану бізді стекке адресаттамайды: адресация бұрынғыдай DS регистрі көмегімен жүзеге асырылады.

Сур. 3. 32-разрядты регистрлерді қолданудағы жанама адресаттың режимдері.

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

 mov ЕАХ,[ЕСХ][ESP]

ESP құрамы масштабтайтын көбейтіндіге көбейтілетін конструкция жіберілмейді:

mov ЕАХ,[ЕСХ][ESP*8]

Полезно также отметить, что смещение в команде вида

mov ЕАХ,[ЕВХ][ЕСХ]+20

тек қана 8-биттік немесе 32-битті болуы мүмкін.16-биттік жылжу болмайды. Егер командада көрсетілген, жоғарыдағы мысалда көрсетілгендей жылжу шамасы байтқа сыймаса,  онда жылжу команда кодында 1 бай орын алады. Егер де жылжу шамасы 225 –тен көп болса, онда оған команда кодында бірден 32-бит орын беріледі.

 Осылай, базалық және ендекстік адресаттау түсінігі 32-разрядты процессорларда біраз жойылады. Егер регистр масштабты көбейткішпен көрсетілетін болса, онда ол әрине индексті адресация. Егер де көбейткіш жоқ болса, онда адресаттауды ЕВХ арқылы да, ESI арқылы да тең жетістікпен базалыққа да, индекстікке де жатқызуға болады.

16-разрядтық регистрді адресаттау  жадына қолдану 32-разрядты процессорлар адресациясының мүмкіншілігін тез түсіреді (сурет 4). Бұл жағдайда біз МП 86 жұмыс істейміз.

Сур. 4. 16-разрядты регистрларды қолданумен жанама адресаттың режимдері.

 

16-разрядты режимде базалық және индекстік регистрлардың барлық сәйкестіктері қолданыста болмайтындығы туралы еске саламыз. Базалық регистр ретінде тек қана ВХ немесе  ВР –ті қолдануға болады. Ал индекстік үшін тек қана SI немесе DI қолдануға болады.

 

16. Стекпен жұмыс.

 

 Бағдарлама жадысы

 

1. ЭЕМ бағдарлама жадлысы жазба мен оқу бойынша қол жетерлік, осымен оқу ЭЕМ-нің кез келген қалып күйінде мүмкін болады, ал жазба ЭЕМ пернетақтасына құлып орнатылған жағдайда ғана жүзеге асады. Кері жағдайда деректерді жазу командасына ЭЕМ 04 «Деректер дайын емес» қатесін шығарады.

  2. Оқу мен жазу не бір байт бойынша, не бет бойынша (100 байт) жүзеге асады. Жадының ағымдық адресі немесе айырбас үшін беттің ағымдық номері алдын ала сәйкесінше 2.1 және 2.2 командаларымен орнатылып қояды. Мәндері кіші байтпен екілік түрде алға қарай беріледі.

3. Айырбас 2.3 және 2.4 командалары көмегімен жүреді. Айырбас кезінде ЭЕМ бағдарламасының ОЗУ жадысындағылар есептелінеді, жазба кезінде тек қана ОЗУ-дағылар өзгереді. Деректерді жүктегеннен кейін, бағдарламаның ОЗУ жадысындағыларды энергобағынышсыз жадыға сақтауға болады, 2.5 командасының берілуімен немесе алдыңғы қалып күйді қайтару, ол 2.6 командасының берілуі арқылы жүзеге асады.

Ондық деректер, екілік деректер және текст

1. Ондық деректер регистріне, екілік деректер регистріне және текстке қол жеткізу ЭЕМ бағдарламасы жадысына қол жеткізуге ұқсас. Осымен ондық деректер бірдей сандармен (8 байт МК форматында, белгілік байтпен алға қарайзнаковым байтом вперед) немесе 8 сандық блоктармен (64 байт) беріледі, екілік деректер – байты бойынша немесе 64 байттық блок бойынша, текст – бір символ бойынша немесе жолдық (бір жолда 24 символ).

Графикалық экран

1. Оқу бойынша графикалық экрандық буферге қол жеткізу ЭЕМ-нің кез келген қалып күйінде мүмкін. Деректерді алмасу үшін 6.3 және 6.4 командалары қолданылады. Оқу не бір байт бойынша, не жол бойынша (128 байт) жүзеге асырылады. Графикалық жадының ағымдық адресі немесе алмасу үшін жолдың ағымдық номері 6.1 және 6.2 командаларымен орнатылады.

Электрондық блокнот

1. ЭЕМ электронды блокнотының деректері ЭЕМ пернетақтасының құлпы орнатылған кезде ғана оқу және жазба бойынша қол жеткізімді болады.

 2. Оқу және жазба 7.1 командасының қолданылуымен бір жазба (4 сан) бойынша жүргізіледі. Айырбас үшін жазбаның ағымдық номері алдын ала 7.2 командасымен орнатылып қояды. Жіберілетін деректер ЭЕМ-нің энергобағынышсыз жадысына тікелей жазылады.

Файлдық құрылым

Сипатталуы

Файлдармен жұмыс, ЭЕМ-нің электронды дискілерінде сақталынатын, командаларды шақыру жолымен жүргізіледі, дискілік операциялық жүйе (кейінірек ДОС) командасы әрекетіне ұқсас. Қол жеткізу тек қана ЭЕМ пернетақтасының құлыптану орнатылған жағдайында ғана мүмкін.

ЭЕМ дискісіндегі барлық файлдар каталогтарда топтастырылған, онда файлдардан басқа ішкі каталогтар (келесі деңгейдегі каталогтар) бар, оларда да өздерінің ішкі каталогтары бар және т.с.с. Файлдық құрылым өзімен бірге ағашты көрсетеді, бір кірісі бар (басты каталог) ішіне салулардың  шектелмеген саныменен және кез келген мөлшердегі бұтақтарыменен (дискінің көлемі мен каталогтың өлшемінің шектелуі шамасында). Файлдық құрылым бойынша жылжу тек қана екі бағытта мүмкін – ішкі каталогқа қарай алға және артқа аналық каталогқа қарай.

Файлдар мен ішкі каталогтарға қол жеткізу басым каталог арқылы жүзеге асырылады, ОЗУ-дың арнайы облысына жүктелінетін, ұзындығы 2048 байт және өзімен бірге тізімді көрсетеді, 32 байттық 0-ден 63-ке дейінгі номері бар 64 қатарға ие. әрбір файлға/ішкі каталогқа каталогтың бір қатары сәфкес келеді, оның аты бар, ол файлдың типін, мерзімін және оның құрылу уақытын, ұзындығын (бағдарлама файлы үшін) және дискідегі орнын анықтайды. 0 номерлі жолда барлық уақытта аналық каталогқа сілтеме мен аналық каталогтың аты бар.

Тізім аралықсыз жоғарыдан төмен қарай толтырылады, жол номерінің ұлғаю жағына қарай, бос емес жолдардағы барлық байттар сәйкес жол тізімнің төменгі жағына жапсырылады, ішкі каталогтың құрылуы кезінде жаңа жол тізімнің басына қойылады (1 номерлі жолға), қалған жолдар төменге қарай жылжиды. Файлдар мен ішкі каталогтарды өшіру кезінде FFh кодымен толтырылады. Жаңа файлдарды құру кезінде тізім сығылады.

Дискті таңдау

Басым дискіні таңдау үшін 8.1 командасы қолданылады. 0 санын жазу кезінде А дискісі таңдалады, 1 санын жазу кезінде егер В дискісі таңдалатын болса, ОЗУ-да жүктелінетін дисктің басты каталогы автоматты түрде жүктеледі. Егер көрсетілген дискі қол жеткілікісіз болса (эоқ болса немесе форматталмаған болса), сәйкес қателік орнатылады, алдыңғы бар ОЗУ каталогы өзгермейді.

Деректер жолына сұраныс кезінде басым дискінің номері жүктеледі. 

Диск жайлы ақпаратты оқу

Басым дискі жайлы ақпаратты 8.3 командасы көмегімен алуға болады. Сұранысқа жауап ретінде ЭЕМ ұзындығы 38 байт деректер жолын шығарады. Жол фиксирленген өрістерге бөлінген. өріс жолдын басынан басталады және мыналарға ие.

Өріс 1. Дисктің құрылу мерзімі мен уақыты (форматталуы). BCD форматтағы 8 байт тізбектелігімен - секундтар, минуттар, сағаттар, күн, ай, апта күндері, жыл. Соңғы байт болып 0-ден 255-ке дейінгі кез келген сан жазылған.

Өріс 2. Дисктің аты, 24 байт, рұқсат етілген символдардан тұрады.

Өріс 3. Бос кластерлер саны, 2 байт.

Өріс 4. Бос емес кластерлер саны, 2 байт.

Өріс 5. Қайтарылатын кластерлер саны, 2 байт.

Диск жайлы ақпаратты жаңарту дискі таңдау кезінде жүргізіледі.

Каталогты оқу

Каталог жол бойынша қаралады, ол үшін 8.2 командасы көмегімен каталогтың жол номері орнатылады (0-ден 63-ке дейін) және 8.4 командасы бойынша сұраныс орындалады. Осымен ЭЕМ жауап қайтарады, оның деректер өрісінде орнатылған номері бар каталогтың жолы орналасады.

Каталогтың жолдар өрісі келесідей мазмұнға ие.

Өріс 1. Идентификатор, ұзындығы 1 байт. Мынадай типті жазбаларды анықтайды:

0 – каталогтың тақырыбы;

1 - қолданылмайды;

2 – ішкі каталог;

3 – бағдарлама файлы;

4 – ондық деректер файлы;

5 – текстік файл;

6 – екілік деректер файлы.

0 идентификаторлы жол барлық уақытта  нольдік жолда тұрады. Егер нольдік жолдың басында байттың басқа мәні болса – каталог жүктелмеген болады.

Өріс 2. Дискідегі файл/каталогтың басындағы кластер (адрес) номері, ұзындығы 2 байт.

Дискідегі файл/каталогтың орнын анықтайды. Каталогтың тақырыбы үшін аналық каталогтың басын анықтайды. Егер аналық каталогтың адресі 0000h-қа тең босла, онда дисктің басты каталогы жүктелген болады.

Өріс 3. Файл/каталогтың аты, ұзындығы 20 байт.

Рұқсат етілген символдардан тұрады, бос орыннан басталмауы тиіс. Каталогтың тақырыбында басым каталогтың аты кездеседі.

Өріс 4. Файл/каталогтың құрылу мерзімі мен уақыты, ұзындығы 8 байт.

Өріс 5. Файл ұзындығы, 1 байт. Параметрі 1-ден 100-ге дейінгі беттердегі бағдарламалар файлдары үшін анықталған.

Файл/каталогты жүктеу

Файлды немесе каталогты жүктеу үшін 8.5 командасы қолданылады. Амалдың орындалуы кезінде ОЗУ каталогтан жолдың идентификаторы саналады, оның номері алдын ала 8.2 командасымен берілген. Идентификатордың типіне байланысты, ішкі каталогқа өту, дисктен ЭЕМ жадысының сәйкес облысына файлды жүктеу немесе аналық каталогқа өту жүргізіледі. Егер берілген жолда идентификатор болмаса, амал орындалмайды, 7 қатесінің коды қалыптасады.

Файлдарды жүктеу тек қана ЭЕМ ОЗУ облысында жүргізіледі, бағдарлама файлдары 0 адресінен жүктеледі, онда бар энергобағынышсыз жады өзгертілусіз қалады.

Файлды/каталогты өшіру

Бұл функция каталог жолдарының берілген номері бойынша ішкі каталогтар мен файлдарды өшіруне арналған. Каталогтың жолдар номері 8.2 командасымен беріледі, амал 8.6 командасы көмегімен беріледі. Функция ішкі каталогтарды, сонда бар файлдарды өшірмейді. Бұл жағдайда 6 қатесінің коды қалыптасады.

Каталогты құру

Жаңа ішкі каталог басым каталогта 8.7 командасы бойынша жазба орындалатын кезде құрылады, осымен команданың деректер өрісінде жолдар жіберіледі, каталогтың жолдарына ұқсас, онда тек қана жаңа ішкі каталогтың аты толтырылған. Құрылатын ішкі каталогтың аты сонда бар ішкі каталогтың атына сәйкес келеді, немесе аты бос орыннан басталады, амал жүргізілмейді және 5 қатесінің коды өңделінеді.

Файлды құру

Басым каталогта жаңа файл 8.8 командасы бойынша жазбаның орындалуы кезінде құрылады. Команданың деректиер өрісінде жолдар жіберіледі, каталогтың жолына ұқсас, онда 1 өріс, файл идентифкаторы, 3 өріс, құрылатын файлдың аты және 5 өріс, файлдың ұзындығы (тек қана бағдарламаның файлдары үшін) толтырылған, осымен бағдарлама файлы үшін бастапқы адрес ретінде ЭЕМ бағдарламасы жадысы ОЗУ-ң 0 адресі қабылданады. Егер құрылатын файлдың аты сол типтегі сонда бар файлдың атымен сәйкес келсе, немесе аты бос орыннан басталса, амал жүргізілмейді және 5 қатесінің коды өңделінеді.

Стек

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

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

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

Стек элементтері жады облысында орналасады, стек бойынша реттелген, стектің түбінен (яғни, оның максималды адресінен) бастап тізбектеліп кішірейетін адреске дейін. Жоғарғы, қол жеткізімді элементтің адресі SP стегінің регистр-көрсеткішінде сақталады. Басқа кез келген бағдарлама жадысы облысы сияқты стек те қандай да бір сегментке кіруі немесе бөлек сегментті құруы тиіс. Кез келген жағдайда осы сегменттің сегменттік адресі SS стегінің сегменттік регистріне орналастырылады. Сонымен, SS:SP регистрлер жұбы стектің қол жеткізімді ұяшығының адресін сипаттайды: SS-те стектің сегменттік адресі сақталынады, ал SP – стектегі соңғы сақталынған деректің жылжуы. Мынаған көңіл бөліңіз, көздік қалып күйде SP стегінің көрсеткіші ұяшықты көрсетеді, стегтің түбінде жататын және оның құрамына кірмейтін.

Стекке жүктеу стекпен жұмыс істейтін арнайы push (жылжыту) командасымен жүзеге асырылады. Бұл команда бастапқыда стектің сонда бар көрсеткішін 2-ге кішірейтеді, сосын операндты адрес бойынша SP-ға орналастырады. Егер, мысалы, біз стекте АХ регистрін уақытша сақтағымыз келсе, келсі команданы орындауымызға тура келеді

push АХ

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

push DS

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

pop DS

pop AX

Регистрдегілерді дұрыс қайтару үшін стектен шығару реттілікпен орындалуы тиіс, жүктелуге қарама қарсы түрде қатаң – алғаш элемент шығарылады, соңғы тиелген, сосын алдыңғы элемент және с.с.
Деректерді қайтару кезінде оларды сонда орналастыру міндетті емес, олар сақталудан алдын болған жерге. Мысалы, стекке DS-тегілерді орналастыруға болады, ал ол жақтан шығарып басқа ES сегменттік регистріне жайғастыру қажет;

push DS

pop ES ; Енді ES=DS, ал стек бос

Бұл регистрдегіні біріншісінен басқасына ауыстыру үшін көп таралған қабылдауыш, көбінесе екінші регистр – сегментті болса. Мынаған көңіл бөліңіз, стекте сақталынған деректерді шығарғаннан кейін олар өшіп кетпеді, стек облысында өз орындарында қалды. Шынында да, стекпен «стандартты» жұмыс кезінде олар қол жеткізімсіз болды. Ия, SP стегінің көрсеткіші қаншалық стектің түбірін көрсеткенімен, стек бос деп табылады; push кезекті командасы жаңа деректі алдын АХ-тегі алдын сақталғандардың орнына жайғастырады, оны өшіріп тастап. Мұнда стек физикалық түрде өшпегенге дейін, онда сақталған және таңдалған деректерді пайдалануға болады, әрине есіңізде болса, олар стекте қандай реттілікте орналасқаны. Бұл қабылдау ішкі бағдарламалармен жұмыс кезінде жиі қолданылады. Стектің өлшемі қандай болуы тиіс? Бұл мынаған байланысты, ол бағдарламада қаншалықты қарқынды қолданылады. Егер, мысалы, стекте 10000 байттық көлемдегі массив сақталады деп жоспарланып отырса, онда стек осы өлшемнен кем болмауы тиіс. Осымен мынадай түрге ие болу керек, әртүрлі жағдайларда стекті жүйе автоматты түрде қолданады, int 21h үзілуінің командасы орындалуы кезінде. Осы команда бойынша процессор алғаш стекке қайтару адресін орналастырады, сосын DOS сонда регистрлердегіні және басқа ақпаратты жібереді, үзілген бағдарламаға қатысты болған. Сондықтан, егер бағдарлама стекті мүлдем қолданбай қойса, ол бәрібір де бағдарламада болуы қажет және бірнеше ондаған сөзден кем емес өлшемге ие болу тиіс. Біздің мысалда біз стекке 128 сөз жауап бердік, ол жеткілікті.

 

17. Логикалық командалар. Логикалық мәліметтер:логикалық командалар.

 

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

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

Формальды  логика  ақиқат және жалған сенім деңгейінде жұмыс жасайды. Микропроцессор үшін бұл, әдетте, сәйкесінше 1 немесе 0  білдіреді.

Компьютер  үшін  нөлдер мен бірлік саны түсінікті болып келеді. Бірақ машиналық командалар  үшін  ең төмен мәліметтер бірлігі байт болып табылады.  Бірақта,  жүйе  деңгейінде  ең  төмен  деңгей  - бит деңгейінде  жұмыс  жасай алатын  мүмкіндік  болу  керек.

 

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

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

Логикалық  мәліметтер.

Мәліметтерді  логикалық  өңдеудің  теоретикалық  базасы болып  формальды  логика саналады.

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

Тұжырымдарды есептеп  шығару бұл кейбір тұжырымдар комбинацияларының  ақиқаттығын немесе  жалғандығын  анықтау үшін қолданылатын  ережелер жиынтығы. Тұжырымдамаларды  есептеп  шығару – компьютер  жұмысының  принциптерімен  және оны бағдарламалаудың  негізгі  әдістерімен  жақсы  сәйкес  келеді. Компьютердің  барлық  аппараттық компоненттері  логикалық  микросхемаларда  жасалған. Компьютердің ең төменгі деңгейінде ақпаратты көрсету  бит  түсінігі негізінде құрылған.  Бит 0 (жалған) және (1) ақиқат – тұжырымдарды  есептеп  шығарумен қалыптасқан түрде сәйкестеледі.

Теорияға  сәйкес,  тұжырымнан  тыс  мынадай  логикалық  іс-әрекеттер  орындалуы  мүмкін:

Теріс көрсеткіш  (логикалық НЕ);

Логикалық қосындылар (ИЛИ );

Логикалық көбейтулер  (логикалық И)

Есепке  алынбайтын  логикалық  қосындылар ( ИЛИ)

Теріс көрсеткіш (логикалық НЕ) – бір операндтың  логикалық іс-әрекеті нәтижесінде алынған көрсеткіштің бастапқы операнд көрсеткішіне қарама-қарсы нәтиже беруі.

 Бұл  іс-әрекет  мына  төмендегі  ақиқаттың  кестесі  арқылы  көрсетіледі: (кесте 1).

Кесте 1. Логикалық теріс көрсеткіш үшін ақиқаттық кестесі:

Операнд  мәні              0        1

Іс-әрекет нәтижесі        1       0

Логикалық  қосынды – бұл екі операндтың немесе біреуінің мәні «ақиқат» (1) болса нәтижесі «ақиқат» (1) және екі операнд мәні жалған (0) болса - «жалған» (0) болатын, екі операндтарға орындалатын логикалық операция.

Бұл  операция  келесі  ақиқат кестесі   арқылы  сипатталады (2 кесте).

Кесте 2. Логикалық есепке алынатын ИЛИ үшін ақиқат кестесі

Операнд  мәні   1         0       0       1       1

Операнд  мәні   2         0       1       0       1

Нәтижесі               0     1       1       1

Логикалық  көбейту (логикалық И) -  бұл екі операндтың мәні «ақиқат» (1) болса ғана нәтижесі «ақиқат» (1)  болатын, екі операндтарға орындалатын логикалық операция. Қалған  жағдайларда  операция нәтижесі «жалған» (0).

Бұл  операция  келесі  ақиқат кестесі   арқылы  сипатталады (3 кесте).

Кесте  3. Логикалық И үшін  ақиқат кестесі  

Операнд  мәні        1    0       0       1       1

Операнд  мәні        2    0       1       0       1

Операция нәтижесі      0       0       0       1

Есепке алынбайтын  қосындылар (ИЛИ) - бұл екі операндтың  біреуінің мәні ғана «ақиқат» (1) болса, нәтижесі «ақиқат» (1) және екі операнд мәні жалған (0) немесе ақиқат (1) болса - «жалған» (0) болатын, екі операндтарға орындалатын логикалық операция.

Бұл  операция  келесі  ақиқат кестесі   арқылы  сипатталады (4 кесте).

Кесте 4. Есепке алынбайтын  қосындылар (ИЛИ) үшін ақиқат кестесі

Операнд мәні  1  0       0       1       1

Операнд  мәні  2 0       1       0       1

Операция мәні   0       1       1       0

Микропроцессор  командаларының  жүйесінде операциялар туралы мәліметті қамтитын  бес  командалар болады. Бұл  командалар  операндтардың  биттеріне логикалық операциялар орындайды. Әрине,  операнд  өлшемі   бірдей  болу  керек. Мысалы, егер  операнд  өлшемі  (16 бит) бір сөзге тең болса, онда  бірінші логикалық  операциялар операндтардың нөлдік биттерінде орындалады. Оның  нәтижесі О нәтижедегі бит орнына  жазылады. Ары  қарай  команда  тізбекті  түрде  барлық биттерге  бірден батсап он бесіншісіне  дейін осы  іс әрекеттерді орындап  шығады. «Командалар  анықтамасында» әр  командалар  үшін  операнд  өлшемдерінің  мүмкін варианттары  келтірілген.

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

Микропроцессор  командаларының  жүйесінде  логикалық  мәліметтермен жұмысты қолдайтын командалар  тобы бар:

and операнд_1,операнд_2 – логикалық көбейту операциясы.

Бұл команда операнд_1 и операнд_2 операндтардың биттеріне И (конъюнкцию) логикалық операциясын  разряд бойынша  орындайды.

or операнд_1,операнд_2 —  логикалық қосу операциясы.

Бұл команда операнд_1 и операнд_2 операндтардың биттеріне ИЛИ (дизъюнкцию) логикалық операциясын  разряд бойынша  орындайды. Нәтижесі  операнд_1 орнына  жазылады.

xor операнд_1,операнд_2 — есепке алынбайтын логикалық қосындылар.

Бұл команда операнд_1 и операнд_2 операндтарының биттеріне ИЛИ есепке алмайтын логикалық операциян  разряд бойынша  орындайды. Нәтижесі  операнд_1 орнына  жазылады.

test операнд_1,операнд_2 — «тексеру» операциясы(логикалық көбейту әдісімен).

Команда логикалық операцияларды разряд бойынша орындайды. Операнд_1 и операнд_2  операндтарының  биттері  үшін де. Zоперанд  жағдайы сол күйінде қала береді, тек zf, sf, и pf  жалауы өзгереді. Бұл бізге операндтың жағдайын өзгертпей жеке биттердің жағдайын қадағалауға мүмкіндік береді.

not операнд — логикалық терістеу операциясы.

Команда разряд бойыншаопернадтың әр битін  инверттейді (қайта мәнге ауыстыру). Нәтижесі операнд орнына жазылады.

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

Белгілі бір 1 разряд (бит)  орнату  үшін мына команда қолданылады

or операнд_1,операнд_2.

Маска рөлін орындайтын, операнд_2  командасында 1 операнд_1 –ге орнатылатын разряд орнында бірлік биттері  болу  керек.

        or      eax,10b ;  регистрінде 1-ші битті орнату

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

and операнд_1,операнд_2.

Маска рөлін орындайтын, операнд_2  командасында  операнд_1-ге 0 орнатылатын разряд орнына нөлдік биттер болу керек.

        and     eax,fffffffdh   ; eax  регистрінде 1-ші битті 0-ге тастау керек

 xor операнд_1,операнд_2  командасы:

- операнд_1 және операнд_2 –да қандай биттер бір-бірінен ерекшеленетінін анықтау

   үшін;

- операнд_1-ге берілген бит жағдайын инверттеу үшін;

        xor     eax,10b ; eax регистрнде 1-ші битті инверттеу;

        jz      mes     ;  al –де 1-ші бит жалғыз болса, өту

 қолданылады.

 Бізді  қызықтыратын маска биттері (операнд_2) xor командасын орындау кезінде жалғыз болу керек, ал қалған жағдайда – нөлдік.

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

test операнд_1,операнд_2 ( операнд_1  тексеру).

Маскадағы тексерілетін  операнд_1 биті  бірлік мәніне ие болу керек. Test команда жұмысының алгоритмі and  командасының алгоритміне ұқсас, бірақ ол операнд_1 мәнін өзгертпейді.

Zf  нөлдік жалауының мәнін орнату  команда нәтижесі  болады.

Егер zf = 0, онда логикалық көбейту нәтижесі нөлдік нәтиже береді. Онда келмеген масканың бірлік биті бар;

Егер zf = 1, онда логикалық көбейту нәтижесінде нөлдік емес нәтиже болады. Яғни  масканың бірлік битінің біреуі ғана   операнд_1 бірлік битімен сәйкес келгені.

           test    eax,00000010h

        jz      m1      ;переход, если 4-й бит равен 1

 Мысалда көріп отырғанымыздай, test командасының нәтижесі  әсер етуі үшін өту командасын  егер  zf нөлдік жалау  нөлдік емес болса, nz  өту белгісін (Jump if Not Zero) –, немесе кері әсер ететін команда  егер нөлдік жалау zf = 0 болса, jz өту белгісі  (Jump if Zero  қолданған жөн.

Келесі  екі команда бірінші орнатылған 1 битті операндты іздеуді жүзеге асырады. Іздеуді операндтың соңынан немесе басынан бастауға болады:

bsf операнд_1,операнд_2 (Bit Scaning Forward) – биттерді алға қарай сканирлеу;.

Команда 1 орнатылған бірінші битті іздеуде, кішкентайынан бастап үлкеніне дейін(0 биттен бастап үлкеніне дейін) операнд_2 биттерін қарап шығады. Егер ондай табылса, операнд_1 сол биттің нөмері бүтін санды мән ретінде жазылады.  Операнд_2 биттерінің барлығы  0 тең болса, онда zf нөлдік жалауы 1 орнатылады, ал керісінше болған жағдайда нөлдік жалау 0 лақтырылады.

        mov     al,02h

        bsf     bx,al   ;bx=1

        jz      m1      ; егер al=00h, өту

        ...

  bsr операнд_1,операнд_2 (Bit Scaning Reset) — биттерді кері бағытта қарап шығу.

Команда операнд_2 биттерін 1 орнатылған бірінші битті  үлкеннен кішіге (үлкен биттен 0 битіне қарай)  қарай қарап шығады. Егер ондай табылып жатса, операнд_1 бүтін санды мән ретінде операнд_1 жазылады. Бұл жағдайда, сол жақтағы бірінші бірлік битінің орны  0 битіне қатысты саналатынын білу маңызды. Егер операнд_2  барлық  биттері 0 тең  болса, онда zf нөлдік  жалауы 1 орнатылады, кері болған жағдайда zf жалауы 0 лақтырады. Листинг 1 bsr және  bsf командаларының қолданылуын мысалда көрсетеді. Кодты енгізіп бағдарлама жұмысын қатені тексеруде зерттеңіз. (bsf және bsr командаларынан кейін bx регистрінің құрамы қалай өзгеретініне көңіл аударыңыз).

 Листинг 1 Биттерді қарап шығу.

;prg_9_1.asm

masm

model   small

stack   256

.data   ;сегмент данных

.code   ;сегмент кода

main:   ;точка входа в программу

        mov     ax,@data

        mov     ds,ax

;...

.486    ;это обязательно

        xor     ax,ax

        mov     al,02h

        bsf     bx,ax   ;bx=1

        jz      m1      ;переход, если al=00h

        bsr     bx,ax

m1:

;...

        mov     ax,4c00h        ;стандартный выход

        int     21h

end     main

Intel микропроцессорының  соңғы  модельдерінің логикалық командалар тобында операндтың нақты бір битіне қол жеткізуге мүмкіндік беретін тағы бірнеше командалар пайда болған. Операнд  жалпы қолданылатын регистрлерде және жадыда бола алады. Бит орны операндтың кіші битіне қатысты  биттің жылжуына қарай беріледі. Жылжу мәні жалпы  қолданылатын регистрлерде болады және тікелей мән ретінде беріле алады.жылжыту мәні  ретінде bsr және  bsf командалар жұмысының нәтижесі  ретінде қолдануға болады. Барлық  командалар таңдап алынған бит мәнін cf жалауына береді.

bt операнд, бит жылжыту (Bit Test) —  битті  тексеру.

Команда бит  мәнінг cf жалауына береді. 

        bt      ax,5    ; 5 битінің мәнін тексеру

        jnc     m1      ;егер бит = 0, өту

  bts операнд, битті жылжыту (Bit Test and Set) —  битті  тексеру және орнату.

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

        mov ax,10

        bts     pole,ax ;проверить и установить 10-й бит в pole

        jсm1    ;переход, если проверяемый бит был равен 1

btr операнд, битті жылжыту (Bit Test and Reset) — битті тексеру және лақтыру.

Команда cf жалауына бит мәнін өткізеді, кейін осы битті 0 орнатады.

btc операнд,смещение_бита (Bit Test and Convert) — битті  тексеру және инверттеу.

Команда cf жалауына бит мәнін өткізеді, кейін осы биттің мәнін инверттейді.

 

18. Жылжыту командасы. Сызықтың жылжыту, циклдік жылжыту. Жылжытудың қосымша командалары. Биттік жолдармен жұмыс жасау мысалы. Биттік жолдардың сәйкес келуі. Биттік жолдарды қою. Биттік жолдарды шығару. Биттерді қайта сілтеу. Шартсыз өтулер. Jmp шартсыз өту командасы. Процедуралар. Шартты өтулер. Стр. Салыстыру командасы. Шартты өту және жалауша командалары. Шартты өту және ecx/cx  регистрлерінің командалары. Тізбектелген командалар. Тізбектердің қайта сілтелуі. Movs командасы. Байттардың, сөздердің және екілік сөздердің салыстыру командалары. Тізбектерді сканерлеу. Scan командасы. Байттардың, сөздердің, екілік создердің жолдарын сканерлеу. Тізбек элементінің аккумуляторда жүктелуі. Lods командасы. Байттардың сөздердің, екілік сөздердің al/axleax регистрлерінде жүктелуі. Элементтің аккумулятордан тізбекке өтуі (көшірілуі). Stos командасы. Al/axleax регистрінен байттың, сөздердің, екілік сөздердің тізбегін сақтау. Енгізу/шығару портында тізбек элементін енгізу, шығару.

 

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

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

Барлық жылжыту командалары операнда өрісінде биттерді операцияның кодына тәуелді оңға немесе солға көшіреді (жылжытады).

Жылжыту командаларының барлығы бірдей құрылымды иемденеді:

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

фиксирленген мағынаның тапсырмасы аралық емес операнда көмегімен болжайтын статикалық әдіс:

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

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

Микропроцессор оптимизациялау мақсатында есептеуіштің бес кіші биттерінің мағынасын ғана қабылдайды., яғни мағынасы 0-ден 31-ге дейінгі диапазонында жатады.

Микропроцессордың соңғы модельдерінде, оның құрамында Pentium  микропроцессоры да, 64-разрядты жылжытуды жасауды рұқсат ететін қосымша командалар бар. Біз оларды кейінірек қарастырамыз.

Жылжытудың барлық командалары cf көшіру жалаушасын орнатады.

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

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

Сызықтық жылжыту командасы;

Циклдік жылжыту командасы;

Сызықтық жылжыту командасы.

Осы түрдегі командаларға келесі олгоритм бойынша жылжу орындалатын командалар жатады:

Келесі “жылжытатын” бит cf жалаушасын орнатады.       Операндаға басқа соңынан енгізілетін бит 0 мағынасына ие. Келесі битті жылжыту барысында ол cf жалаушасына өтеді, осы кезде алдын жылжытылған биттің мағынасына жоғалады!

Сызықтық жылжыту командалары екінші типке бөлінеді:

логикалық сызықтық жылыжту командалары;

арифметикалық сызықтық жылжыту командалары;

Логикалық сызықтық жылжыту командаларына келесілер кіреді: She операнд, жылжыту есептегіші (Shift Logical Left)- логикалық солға жылжыту.

Операнда құрамындағылар биттер санына қарай солға жылжиды, ол жылжытулар-есептегіші мағынасымен анықталады. Сол жаққа (үлкеннің позициясына, белгілік биттің) нолдер жазылады. 1-суретте осы командалардың жұмыс жасау принциптері көрсетілген:

Логикалық Shi солға жылжу

Сурет1. сызықтық логикалық жылжытудың жұмыс жасау сұлбасы.

 

Төменде бағдарламаның үзіндісі көрсетілген ол al регистрінде BCD- санында оралған всd-dig жадының сөзінде екі оралмаған BCD- санының қайта түрленуін орындайды.

         ···

  всd-dvg dw 0905h;                              Оралмаған BCD-сан 95 суреттемесі

  ···

  mov ax, bcd-dig;                                  қайта сілтеу

  shi ah, 4;                                               солға жылжыту

  add al, ah; al=95h;                                нәтижесін алу үшін қосу

 

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

Sal операнда, жылжытулар-есептегіші (Shift Arithmetic Left)- арифметикалық солға жылжыту.

Операнда құрамы биттің саны солға жылжиды, ол жылжытулар- есептегіші мағынасын анықтайды. Оң жаққа (кіші бит позициясына) нулдер жазылады. Sal командасы таңбаныанықтайды, бірақ келесі жылжытатын битпен таңбаның ауысуы кезінде cf жалаушасын орнатады. Қалған жағдайда shi командасына толығымен аналогты.

Sar операнда, жылжытулар- есептегіші (Shift Arithmetic Right)-ифметикалық оңға жылжыту. Операнда құрама биттер санына қарай оңға жылжиды, оң жылжытулар- есептегіш мағынасын анықтайды. Операндаға сол жағынан нулдер жазылады.

Sar командасы таңбаны, оны әрбір келесі биттің жылжуынан кейін қайта қалпына келе отырып сақтайды.

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

Сурет 2. сызықтық арифметикалық жылжыту командасының жұмыс жасау сұлбасы.

 

 

         Циклдік жылжыту командалары.

Циклдік жылжыту командаларына жылжитын биттер мағынасын сақтайтын командалар жатады. Циклдік жылжыту командасының екі түрі бар:

  • қарапайым циклдік жылжыту командасы;
  • cf өткізу жалаушасы арқылы циклдік жылжыту командалары;

Қарапайым циклдік жылжыту командаларына келесілер жатады:

Rol операнда, жылжытулар- есептегіші (Rotate Left)- солға циклдік жылжыту.

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

Ror операнда, жылжыту- есептегіші (Rotate Right)- оңға циклдік жылжыту.

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

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

Сурет 3. Қарапайым циклдік жылжыту командаларының жұмыс жасау сұлбасы.

 

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

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

     ···

     mov eax, ffff 0000h

     mov cl,16

     rol eax,cl

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

Циклдік жыжыту командаларына cf өткізу флагы арқылы келесілер жатады:

Rcl операнда, жылжыту- есептегіші (Rotate through Carry Left)- өткізу арқылы солға циклдік жылжыту.  Операнда құрамын жылжыту- есептегіші операндасымен анықталатын биттер санына солға жылжыту. Жылжытылған биттер қатар-қатармен cf өткізу жалаушасының мағынасы болады.

Rcr операнда, жылжыту- жылжыту есептегіші (Rotate through Carry Right)- өткізу арқылы циклдік оңға жылжыту.

Операнда құрамын, жылжыту- есептегіші операндасымен анықталатын биттер санына қарай оңға жылжытылады. Жылжытылған биттер қатар-қатармен cf жалаушасының мағынасы болады.

Rcr операнда, жылжыту-есептегіші (Rotate through Carry Right)- өткізу арқылы циклдік оңға жылжыту.

 Опранда құрамы, жылжыту- есептегіші операндасымен анықталатын биттер санына қарай оңға жылжытылады. Жылжытылған биттер қатар- қатармен cf жалаушасының мағынасы болады.

 

 

4- суретте, өткізу жалаушасы арқылы жылжыту кезінде аралық элемент пайда болатындығы көрініп тұр, ол элемент арқылы, негізінде (биттердің ) циклдік жылжытылатын биттерді ауыстырып қоюды орындауға болады, сонымен бірге, биттік тізбектілікті сәйкестендіру.

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

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

Бұл- екілік дәлелдіктегі жылжыту командалары:

Shed операнда-1, операнда-2, жылжыту-есептегіші- екілік дәлдіктің солға жылжытылуы.

Shed командасы, операнда биттерін жылжыту жолымен ауыстыруды операнда-1-ді биттерін оң жақтан биттер мағынасымен толтыра отырып, операнда-2-ден 5суреттегі сұлбаға сәйкес шығарылған биттер мағынасымен солға ауыстыруды орындайды.

Жылжытылатын биттер саны, 0...31 диапазонында жата алатын жылжыту- есептегіш мағынасымен анықталады. Бұл мағына аралық емес операндамен беріледі немесе cl  регистрінде тұрады. Операнда-2 мағынасы өзгермейді.

    Сурет 5. Shed командасының жұмыс жасау сұлбасы.

 

Shrd

Операнда-1, операнда-2, жылжыту-есептегіші- екілік дәлдіктегі оңға жылжыту.

Команда ауыстыруды, операнда-1 оңға операнда биттерін жылжыту жолымен, оның биттерін сол жақтан биттер мағынасымен, 6-суреттегі сұлбаға сәйкес операнда-2-ден шығарылған, толтыра отырып орындайды. Жылжытылатын бит саны 0...31 диапазонында жататын жылжыту- есептегіш мағынасымен анықталады. Бұл мағына аралық емес операндамен берілуі мүмкін немесе  cl регистрінде тұру мүмкін. Операнда-2 мағынасы өзгермейді.

    Сурет 6. Shrd командасының жұмыс жасау сұлбасы.

 

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

Мысалыға 64 биттен 16 бит өріске солға жылжуды орындауға болатындығын қарастырайық.

···

data

pole-1 dd             0b2118785h1

pole-h dd             45ff6711h

code

···

386

    mov cl,16;           cl-ге жылжыту есептегішінің жүктелуі

    mov eax,pole-h

    shed pole-1, eax,cl

    She pole-h, cl;    pole-1=87f50000h, pole-h=67116211h

Өтулер

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

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

Қысқаша тура (-128...+127байттар шегінде); жақын тура (ағындық команда сегментінің шегінде); жақын  жанама (өту адресі бар ұяшық арқылы ағымдық команда сегментінің шегінде); алыс жанама (өту адресі бар ұяшық арқылы басқа команда сегментінде);

Бағдарлама құрылымында әр түрлері бар өтулерді қарастырамыз.

Қысқаша тура (Short) өту. Тура деп, айналып өту қажетті белгі анық формада көрсетілетін командадағы өтуді атайды. Әрине, бұл белгі сол бағдарламалық сегментте болуы (қатысуы) тиіс, сонымен бірге, онымен белгіленген команда jmp командасынан кейінде орналасуы (тұруы) мүмкін. Қысқа өту командасының лайықтылығы, олардың жадының 2 байтын ғана алатындығында: бірінші байтта операция коды (EBh) жазылады, екіншісінде - өту нүктесіне жылжу. Өту нүктесіне дейінгі арақашықтық келесі командадан есептелінеді, яғни jmp командасының артынан еруші командамен. Сонда да алға және артқа өтуді қамтамасыз ету талап етіледі, жылжыту таңбалы сан ретінде қарастырылады және сәйкесінше, өту ең көп дегенде 127 байт алға немесе 128 байт артқа жүзеге асырылуы мүмкін. Қысқаша тура өту келесі түрде безендіріледі:

        code segment 

 …

Jmp short go;  Код EB dd

go:

Code ends

Егер бағдарлама TASM ассемблермен аударылатын болса, және транслятордың шақыру (жолында) қатарында, аударуда екі жолмен орындалуы тиіс деп көрсетілсе,

  tasm/m2 p,p,p

Онда Short суреттеуішін түсіруге болады, ассемблер өту нүктесіне дейінгі арақашықтықты, тіпті егер белгі go jmp командасы бар қатардан кейін орналасса да, қысқа өтуге жайғастырады (жатады). MASM трансляторын қолдану барысында Short суреттеуішінің көрсеткіші (егер go белгісі jmp командасынан кейін орналасса) міндетті.

Жақын тура (near) немесе сегмент ішіндегі өту. Бұл өту алдыңғыдан, тек өту нүктесіне көшу ішінде толық сөз өткізілетіндігімен ерекшеленеді. Бұл өтуді 64- байттың сегменттің кез келген нүктесінде жүзеге асыру мүмкіндігін береді.

Code segment

Jmp go;         Eg dddd коды

go;

code ends

Go белгісі команда сегментінің кез келген жерінде, тіпті, jmp командасынан кейінде орналасуы мүмкін. Dddd командасының кодында, jmp командасының соңынан жүруші командадан өту нүктесіне көшу мөлшеріне қатысты сөзді білдіреді. Жақын тура өту командасын орындау барысында процессор ағымдық мағынасына (көрсеткішінің) қосуы қажет және осымен өту нүктесін адресін қалыптастыруы қажет. dddd1 көшуі өздігінен нені білдіреді? Бұл қандай мөлшер, таңбамен бе немесе таңбасыз ба? Егер көшуді таңбасыз мөлшер ретінде қарасстырсақ, онда өту тек алға ғана мүмкін болады, әрине бұл дұрыс емес болады. Егер де көшу (смешение) таңбалы мөлшер болса, онда өту жарты сегмент алға немесе жарты сегмент артқадан басқа мүмкін емес, бұл да дұрыс емес. Jc жүзінде, өту нүктесінің адресін есептеуді қарастыра отырып, айналдыру көрінісін ескеру керек, мағынасын келесі (қысқаша) қатынастармен түсіндіруге болады.

FFFFh+0001h=0000h

0000h-0001h=FFFFh

Егер қандай да бір регистрдің немесе жады ұяшығының құрамын тізбектей көбейтетін болсақ, онда, FFFFh жоғарғы мүмкін шегіне қол жеткізіп, осы шекара арқылы “асып түсу” саны нулге тең болып қалады және аз бүтін сандар (1,2,3, және т.б.) аймағында өсуді жалғастырады. Осылайша егер бірнеше бүтін сандарды тізбектей азайтсақ, онда, ол нулге қол жеткізіп, кері сандар аймағына өтіп кетеді (немесе үлкен  таңбасыздардікіндей), 2,1,0, FFFFh, FFFFh және т.б. мағыналардан өте отырып.

Осылай, көшудің өту нүктесінің адресін есептеу барысында таңбасыз санмен оқуға тура келді, бірақ бұл кезде, кері бұралу көрінісін ескеру керек. Егер jmp командасы команда сегментінің бас жағында орналасса, ол көшу (смешение) 64К  реттегі мөлшерге ие болса, онда өту, сегмент соңына, алға орындалады. Егер де команда, команда сегментінің соңында орналасса, ол көшу (смещение) сол 64К реттік мөлшерге ие болса, өту нүктесін анықтау үшін сегмент бойынша алға жылжу керек, оның соңына дейін барып және сегмент басынан бастап болғандай алға жылжыту қажет, көшуде берілген байттар саны жүрілгенше көрсетілген шарттар үшін біз  аз адресс жағынан jmp командасынан алыс емес орналасқан нүктеге түсеміз (тап боламыз). Сонымен жақын өту командасының көмегімен (jmp командасы ешқандай да бір спецификаторларсыз) берілген командалық сегментінің шегінде кез келген нүктеге өтуге болады. Басқа команда сегментіне өту үшін, алыс өту командасы пайдалануға тура келеді.

Алыс тура (for), немесе сегмент аралық өту. Бұл өту басқаруды кез келген сегменттің кез келген нүктесіне жіберуді рұқсат етеді. Сонымен бірге, бағдарламалық кешен команда сегментінің бірнешеуін қосатындығы болжалады. Алыс өту командасы 5 байт ұзындыққа немесе және EAh операциясының кодынан басқа өту нүктесінің толық адресінде яғни, сегменттік адрес және көшу (смешение), қосады. Трансляторға, бұл өтудің алыс екенін хабарлау қажет (jmp командасы үнсіздік бойынша жақын өту командасы сияқты трансляцияланады). Бұл, өту нүктесі атауының алдында көрсетілетін for ptr суреттеуішінің көмегіменжасалынады.

Code 1 segment

assume CS: code 1;                Трансляторға бұл сегмент команд екенін хабарлаймыз

Jmp for ptr go;                        EA dddd ssss коды

code 1 ends

code 2 segment

assume CS: code 2;                Трансляторға бұл команда сегмент екенін хабарлаймыз

go:

code 2 ends

Go белгісі осы екі сегментті бағдарламаның басқа команда сегментінде орналасады. SSSS командасының кодында- code 2 сегментінің сегменттік адресі, ал dddd-code 2 команда сегментіндегі go өту нүктесіің көшуі (смешение).

Бағдарламада команда сегменттерінің бірнешеуінің артық болуы кезінде олардың әр қайсысын  assume CS: сегмент-аты ассемблер директивасымен жариялау қажет, ол тарнсляторға команда сегментінің келесі басталғаны жайлы хабарлайды. Бұл тарнсляторға осы сегментте кездесетін таңба адресін дұрыс (жасауға) өңдеуге көмектеседі. Алыс өтулер командаларын меңгере отырып, біз кез келген ұзындықтағы бағдарлама жасау мүмкіндігін алдық. Шынында да, әр бір бағдарламалық сегменттің соңында алыс өту командаларын қарастыру келесіге бастама берді, біз бағдарлама көмегіне 64 Кбайт  бойыншакез келген сегменттік санды қоса аламыз. Жалғыз бір шектеу олардың барлығыда жадыға сиюы керек. Негізінде бұлай жасалынбайды. Команданың қосымша сегменттерін ішкі бағдарламаны толтыру және оларды қажет жағдайда негізгі сегмент арқылы (немесе бірін бірі арқылы) шақырған тиімдірек.бірақ та бұл жағдайда да ішкі бағдарламаны шақыру командалары алыстан болуы тиіс. Ішкі бағдарламаның және командалардың әртүрлілігі, олардың шақырылуы төменде қарастырылатын болады.

Тура өтудің барлық түрлері бағдарламалық белгінің өтунүктесі ретінде көрсетуді талап етеді. Бір жағынан, бұл өту анық; бағдарлама текстін қарай отырып, өтуқайда жүзеге асырылып жатқанын бірден анықтауға болады. Басқа жағынан, мұндай өту статикалық (мінездемеге) сипаттаманыиемденеді- оны бағдарлама жүрісі бойынша (орнатуға) қалыптастыруға болмайды. Тура өтулердің тағы да өте күрделірек кемшілігі, олардың танымал абсолютті адресс арқылы өту мүмкідіктерін беруінде, яғни жүйелік құралдарға да, жадыға жүктелген басқа бағдарламаларға да (мысалыға, резидентті) жүгіуге рұқсат етпейді. Шынында да, операциялық жүйе бағдарламалары ешқандай белгіге ие емес, белгі- бұл бағдарламаның ағымдық текстінің атрибуты болғандықтан, ал операциялық жүйе бағдарламалары бізбен аударылмаған болса, және компьютерде орындалатын модуль түрінде болса. Ал жүйелік бағдарламаның сипаттамалық нүктесінің қандай да бір адресін анықтауға болады, тіпті үзілу векторынан да. Абсолютті адресс арқылы жүгіну үшін, тура сияқты, жақын да және алыста бола алатын жанама өтулер командаларынан қолдану керек.

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

Code  segment

Jmp DS: go-addr;                    FF 26 dddd коды

go:                       ;                   Өту нүктесі

code ends

data segment

go-addr dw go;                       Өту адресі (сөз)

data ends

Go  өту нүктесі команда сегментінің кез келген жерінде орналасуы мүмкін. Dddd команда кодында, осы ұяшықтан тұратын деректер сегментінде go-addr сөзіне қатысты адресін білдіреді.

Өту нүктесінің адресінің келтірілген фрагментінде go белгісінің атын көрсетуі go-addr сөзінде бір мағынада берілген.

Жанама өтудің мұндай нұсқасы турадағыдай функцияларды орындайды (алдын берілген жалғыз адресс бойынша өту), бірақ бірнеше шатасқан түрмен. Жанама өтудің лайықтылығы анығырақ болады, егер go-addr ұяшығын басынан бос екенін түсіндірсек, ал қандай да бір шартқа тәуелді бағдарламаның орындалу жүрісі бойынша сол немесе басқа да өту нүктесінің адресі араласады:

mov go-addr6 offset go1

mov go-addr offset go2

mov go-addr offset go3

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

jmp DS: go-addr

jmp word ptr go-addr

jmp  go-addr

бірінші нұсқада, жоғарыдағы фрагментке қолданылған, өту адресінен тұратын go-addr ұяшығынан қандай сегменттік регистрден жүгіну қажеттігі корсетілген. Мұнда сегментті алмастыру рұқсат етіледі, егер go-addr ұяшығы бар сегмент басқа сегменттік регистр арқылы адрестелсе мысалы, ES немесе CS. Екінші нұсқада өту бір сөзді өлшемі бар ұяшық арқылы жүзеге асырылатындығы және сонымен бірге, жақын болып келетіндігі ерекшеленеді. Go-addr ұяшығы dd директивасының көмегімен жарияланған болуы мүмкін және алдағы өтулерді іске асыру үшін қажетті өтудің екі сөздік адресін толығымен иеленеді. Бірақта оны жақыннан өту үшін де пайдалануға болады. Ұяшық атының алдындағы word ptr сипаттамасы өту адресімен трансляторға оның 1 сөз өлшемін иемденетін (оның жариялануына тәуелсіз), және де, сонымен бірге, өту жақыннан болып келетіндігін оқуға итермелейді. Соңында, ең қарапайым үшінші нұсқа мүмкін болады, ал тура өту мен форма бойынша сәйкес келеді, бірақ оған қарамастан, go-addr символдық мағыналары бағдарламалық белгі емес берілген өріс аты болып табылатындықтан жанама болып келеді. Бұл нұсқада go-addr ұяшығы орналасқан сегмент DS регистрі арқылы үнсіздік бойынша адрестелетіндігі болжамдалады, бірақ осындай жағдайлардың барлығындағыдай, сегментті алмастыру рұқсат етілген. Өту типі (жақыннан немесе алыстан) go-addr ұяшығының өлшемінен шыға отырып анықталады. Бірақта бұл нұсқа мәңгі мүмкін болады. Оның дұрыс аударылуы үшін трансляторға

jmp  go-addr

сөйлемінің өңделуі мезетінде go-addr атын өздігінен түсіндіру анық (таныс) болғаны қажет. Мұны екі әдіспен жасауға болады. Бірінші-жоғарыда келтірілген мысалдағы сияқты, команда сегментіне дейін сегмент деректерін орналастыру. Екінші-трансляторды бағдарламаның ағымдық текстің үнсіздік бойынша бір-ақ рет емес, бірнеше ретөңдеуге мәжбүрлеу. TASM трансляторы үшін өту жолының санын, # өту жолының қажетті саны болатын m # кілтінің көмегімен оның шақырылуы кезінде беруге болады. Біздің жағдайда екі өту жолы өткілікті. Келтірілген мысалдарда өту нүктесінің адресі бар жады өрісінің адресі жанама өту команда кодында аралық  құралдарсыз беріген болатын. Бірақта, бұл адресті ортақ қызметтегі регистрлердің біреуінен де беруге болады (BX6 SI немесе DI). Жоғарыда келтірілген go- нүктесіне жанама өту мысалы үшін деректер сегментіндегі

go-addr ұяшығында орналасқан адрес жанама тіркелген адресацияны қолданумен өту келесі түрде көрінетін болады:

mov BX, offset go-addr ;  B BX     jmp[BX] і бар өрістің жылжуы; go нүктесіне өту

Әсіресе үлкен мүмкіндікті, регистрлер жұбы арқылы базалы- индексті адрестеуді қолданумен жанама өту әдістемесі түсіндіреді, мысалы, [BX] [SI] немесе [BX] [DI]. Бұл әдіс таңдалуыбірнеше шартқа тәуелді өтудің альтернативті нүктесінің қатары бар болған жағдайда ыңғайлы. Бұл жағдайда, деректер сегментінде адресі бар бір ғана өріс емес, өтулер адресінің кестесі құрылады. BX базалық регистріне осы кестенің адресі жүктеледі, ал регистрдің индекстерінің біріне- сол немесе басқа да осы кестедегі индекс әдісімен анықталған тақырып жүктеледі. Өту берілген индекске сәйкес болатын нүктеге жүзеге асырылады. Осындай әдістемені қолданатын құрылымы келесідей түрде болады:

сode  segment

mov BX,offset go-tbl ; кестенің базалық адресінBX-ке жүктейміз

mov SI, 4 ; қандайда бір түрмен есептелген, таблицадағы, орын ауыстыру

jmp [BX] [SI] ; егер индекс=4, go3 нүктесіне өту

go1:  ; өтудің 1-нүктесі

 …

go2:  ; өтудің 2-нүктесі

 …

go3:  ; өтудің 3-нүктесі

code ends

data segment

go-tbl  label word ; өту адресінің кестесі

go1-addr dw go1 ; бірінші альтернативтінің адресі

; өту нүктесінің

go1-addr dw go1 ; бірінші альтернативтінің адресі

; өту нүктесінің

Go2-addr dw go2 ; екінші альтернативтінің адресі

; өту нүктесінің

go3-addr dw go3 ; үшінші альтернативтінің адресі

; өту нүктесінің

data ends

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

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

mov  BX, offset go1 jmp BX

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

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

 codel segment
assume CS:codel,DS:data

jmp DS:go_addr ; Код FF 2E dddd

codel ends
code2 segment
assume CS:code2

go: ;Точка перехода в другом сегменте команд

code2 ends
data segment

go_addrdd go ;Двухсловный адрес точки перехода

data ends

Осы екісегментті бағдарламаның басқа сегментінде go өту нүктесі орналасқан. команда кодында dddd берілгендер сегментіндегі go_addr сөзінің кері адресін анықтайды. go_addr ұяшығы dd (define double, екілік сөзді анықтау)  директивасымен жарияланады және өту нүктесінің екісөзді адресінен тұрады; бірінші сөзі codel командалар сегментінде go араластырудан тұрады, екінші сөзі  codel сегменттік адрестен тұүрады. Өту адресінің екі компонентіде бағдарлама орындалу жолымен go_addr  ұяшығында есептелуі және орын ауыстыруы мүмкін.

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

jmp DS:go_addr ;Сегмент ауысу мүмкіндігі
jmp dword ptr go_addr ; Егер өріс go_addr жарияланса
; dw операторларымен
jmp go_addr ;Ұяшық мінездемелері міндетті:
;ақпараттанған болу керек

Жақынмен қарастырғанда алыс жанама өтугеде адрестеу жалпы сипатталу регистрі арқылы рұқсат етілген, егер оған өту адресімен өріс адресін орналастырса:

mov BX,offset go_addr
jmp [BX]

 

19. Деректердің күрделі құрылымдары. Массивтер.Инициялизацияны сипаттау, массив элементтеріне қол жеткізу,массивтермен типті операциялар. Құрылымдар. Құрылым шаблонын сипаттау. Құрылым типімен әрекеттерді анықтау. Құрылыммен жұмыс жасау әдістері. Біріктіру.

 

Деректердің күрделі құрылымдары

1.Массивтер

Asm-де массивтерді іске асыру адресациялаудың индекстік түрлерін қолдану арқылы орындалады. Кез-келген жағдйда массив  - бұл бір типті жады ұяшықтарының кезектілігі. Элементтер типі макроанықтаулардың және аранйы директивалардың есебінен қарапайым немесе құрылымдалған болуы мүмкін.

а db 10 dup (0) – өлшемі байт болатын 10 ұяшық  нолдермен толтырылады.

Элементтерге қол жеткізу үшін 3 операторды қолдануға болады: [], +, .

 3 оператордың барлығы бір мағынаға ие – бұл адрестік өрнекте қосу. 16-разрядты архитектурада si,di,bp,bx көмегімен адресациялар таңдалады.

lea si,a

mov al,byte ptr [si]  -  al-да а кезектілігінің 1-ұяшығының құрамы жазылады.

Екі өлшемді массивтер – ЭЕМ архитектурасында Asm тіліндегі секілді екі өлшемді массивтер болмайды. Бағдарламалаушы бір типті ұяшық кезектілігін деректер жиынын кесте түрінде қандай да бір форма түрінде ұйымдастыру үшін интерпритациялай алады. Матрицаны тұрғызып, оның бөлк элементтеріне қатар және баған номері бойынша        (4х5 – матрица) қол жеткізу керек болсын.

mas dl 20 dup (0)

 Бөлек элементтерге қол жеткізуді келесі формула бойынша ұйымдастыру керек: база + қатар өлшемі *i+j, мұнда i –  қатар номері, j – баған номері.  i және j номірленуі 0-ден басталады.  Бұл формулада i және j индекс болып табылады. Тікелей қол жеткізуге ие болу үшін көрсетілген формула бойынша адрестік өрнекті тұрғызып, мәнін оны базалық немесе индекстік регистрге орналастырып, есепетуге болады. Басқа жағынан, қол жеткізуді базалық-индекстік адресацияны қолданып алуға болады, онда база ретінде ұяшықтардың кезектілік идентификаторы қолданылады mas[bx][si]. Екі регистр бірден базалық немесе индекстік бола алмайды.  (яғни бола алмайды жұп bx және bp, si және di).

2 Құрылымдар.

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

struc

құрылым аты struc

<өрі шаблондарының,олардың мәндерінің және типтерінің тізімі>

 құрылым аты ends

Өріс тізімі – жадыны белгілеу және инициялизациялау директивалары және идентификаторлар жиыны. Құрылым шаблонын жазу кезінде берілген құрылымның өрістеріне жадыны белгілеу болмайды.  Сонымен, құрылымды сипаттау – бұл жадыны белгілеу және инициялизациялаудың жаңа директивасын құру.

point struc

x db 0

y db 0

R db 0

G db 0

B db 0

point ends

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

data

A point <>

A1 point <1,2,,255,255>

A2 point <,,255,100,100>

A3 point <1,3>

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

A point <>,<1,2>,<1>

A1 point 100 dup (<>)

Құрылым элементтерінің өрістеріне қол  жеткізу

өрістерге қол жеткізу  үшін. (нүкте) операторын қолдануға  болады.

Құрылым элементінің идентификаторы. бір жағынан бұл жазбаны жады ұяшығының  идентификаторы  ретінде интерпретациялауға болады. Екінші  жағынан бұл адрестік өрнек, ол келесі формуламен анықталады: сегмент басын салыстыра құрлым элементтер жиыны + құрлым шаблонының басын салыс тыра өрістің жиыны.

A.x = 0+0=0

A=0, x=0

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

A struc

x db ?

struc

         y db ?

ends

A ends

Құрылым өрістері басқа құрылым элементтері болуы мүмкін:

A.struc

x db ?

A ends

B struc

y A <>

B ends

C B<>

C.y.x

 Біріктіру

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

a1 label byte

a2 label word

     dw 100

union біріктіруінің шаблон аты

<өрістер, олардың типі және мәндерінің тізімі >

Ends біріктіруінің шаблон аты

Өрістер аты құрлым секілді глобальді.

Біріктірулерді  құрлым сипаттамасына біріктіру аттарын көрсетпей- ақ қоюға болады.

offs union

off_16 dw ?

off_32 dd ?

offs ends

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

Ttest union

x db ?         ; or x мәні

y dw ?        ; or у мәні

z dd ?         ; or z мәні

Ttest ends

.data

test1 Ttest <>

test2 Ttest <1>    ; x өрісіне 1 мәнін

test3 Ttest <,1,>  ; y мәніне 1 мәнін

test4 Ttest <,257>         ; y өрісіне 257 мәнін, яғни x өрісіне хабарласа алмаймыз.

test6 Ttest<,,0fffffh>

mov ax,test5.y

 

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

 

Жазбалар

 

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

Биттік өріс тек қана 1 биттан тұра қоймай, бірнешеден тұрады. Жалғыз шартөлшемнің биттік өрісін бүкіл баспаның сумарлық өлшемен анықталады, максималдық өлшем м.б. 8,16,32 бит. Баспаны анықтау үшін record механизмі қолданылады.

Жазба аты record < өрістер тізімі, олардың өлшемі және мағынасы үнсіздікпен >

Өрістің аты – қарапайым идентификатор, өлшемі – осы өрістегі биттер саны.

Әрбір тізім элементтерінің келесі формалары бар:

Өріс аты: өлшем = мағынасы үнсіздікпен

Соңғы – мәні үнсіздікпен қолданбауы мүмкін. Тізімдегі өрістерді анықтау үтірмен анықталады.

rtest record x: 2=10, y:3, z:1=0

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

test1 rtest <>

test2 rtest <11>

test3 rtest <,11>

Биттік өрісін оның атымен алдын-ала анықтауға мүмкін болады. Бұрыштық жақшаның орнына фигуралық жақша көрсетіледі {}, жақшаның ішінде өрістің атының басылымы құрылады = мағынасы ({x=1}).Бөлек өрістің баспасымен тілдесу үшін . (нүкте)

операторын қолдануға болмайды. Бұл операцияға жалғыз қолданыс болып табылатын логикалақ командалар комбинациясы, жылжыту командасы, width және mask екі командасына тұрады. Өрісті ерекшелеу алгоритмі: 1) биттік өрістің маскасын құруын қажет етеді. Маска – бұл байт өлшеміндегі ячейка, сөз немесе екі еселенген сөз, көрсетілген өріске сәйкес келетіндерден басқа, бүкіл разрядтар нөлдік болып табылады.

2) and логикалық командасын қолданғанда дана баспасының үстіне маска қойылады. Нәтижесінде көрсетілгендерден басқа биттік өріс мағыналары нөлденеді. 3) берілген өрісті ячейканың оң жақ шетіне тығыздау үшін, дана баспасын оң жағына жылжыту қажет. 4) алынған мағынаны қарастыру және қажет болса, бастапқы орнына алгаритм бойынша қарастырылған құжаттарды қайта құру.

Масканы алу үшін mask операторын қолдануға болады.

mask имя поля

mov al, mask x    ; al = 11

mov al, mask y    ; al=11100

Width операторы өрістің өлшемін немесе бүкіл баспаның өлшемін анықтауға мүмкіндік береді.

mov al, width y   ; al=3

mov al, width test1       ; al=6

bl  регистірінде тұратын, өріске y мәнін енгіземіз:

mov al, mask y    ; al=00011100

mov ah, byte ptr [test1]          ; test1=00000010

and ah,al    ; маскасын қолданамыз ah=0

shr ah, width x    ; bl=00000101

shl bl, width x

mov al, mask y

or byte ptr [test1], al

and byte ptr [test1],bl

Макростар.

Турбоассемблер макротілінің мүмкіндіктерін қолдайды. Ассемблер тілі, кейбір синтаксистерді қолдана отырып, қиын структуралы програмаларды оңайлатады, соның өзінде макротілінің шығыс конструкциясы трансляция кезінде және обьектік код құруда сезілмейді. Әдетте макрогенератор транслятор программасының қолданушы бөлігі болып табылады.  Макрогенератор тек тексттің ауыстыруын орындайды. Текст ауысуының еркжксін макроанықталуының ішінде формулянады. Программаның ішінде ережелерді қолдану макрокоманданы қолдану деп аталады. Процесстің өзі программада ткстік ауыстыру көрсетілген ереже бойынша макроподстановка деп аталады және алынған ауысым макрокеғейткіш атына ие болады. Макроанықтау м.б. файл текстінің программасының ішінде құру (басында) болмаса бөлек файлда немесе макрокітапханасында. Макроанықтамасын құру үшін macro дерективасы қолданылады.

макрос аты macro аргументтер тізімі

тексттік ауыстыру ережесі

endm

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

Макроанықтама параметрі тек строкалық типін қолдануы мүмкін.

printstr  macro str

lea dx,str

mov ah,9

int 21h

endm

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

command macro par1

par1

endm

Егер макрокоманданы келесі түрмен шақырылса: command x=1, онда макрогенератор бұл баспаның орнына x=1 қояды.

command mov ax,1      - mov ax,1

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

command <mov ax,1>  - mov ax,1

Егер параметр мағынасына арнайы символдар қосу керек болса, соның ішінде бөлгіштер,онда керекті символдың алдына оператор көрсетіледі!

Одан басқа, параметр мағынасын қолданар алдында константы есеп арқылы шыңарсада болады.

x1 macro y1

mov ax, y1

endm

x1 2  - mov ax,2

2 констант құрастырамыз:

a1=5

a2=6

x1 %a1+a2 mov ax,11

x1 a1+a2    mov ax,a1+a2

Бұл оператор, макроподстанока этапында есептеу шығарылады оның артынша константық есеп жүреді. Макроанықтама мағынасын үнсіз анықтауға болады. Ол үшіни конструкция:=<мағынасы>  Pascal’ы қолданады.Бұл конструкция макроанықтау параметр жолдардың санауында қолданады.

x2 macro x:=<5>

mov ax,x

endm

x2     - mov ax,5

Кейбір параметрлерді міндетті етіп қойса болады. Парметірінің міндетті макроанықтаудың параметірін есептеу кезінде конструкция көрінісі көрсетіледі:REQ.

x2 macro x: REQ

Парметрлер идентификатордың бөлігі болуы мүмкін. Идинтификатор арасына керекті параметрді ерекшелеу үшін & операторы қолданылады. Берілген операторда қолданылады, егер параметр аты ассемблердің кілттік сөзімен сәйкес келсе.

Мысалы:

maketab macro type:=<b>, len: REQ

tab&type d%type len dup(0)

endm

Берілген макрос таблица құрады (әдетте массив) сәйкесінше type ұзындығы len.    

Мысалы

maketab w,12               - tabw dw 12 dup(0)

maketab,15          - tabb db 15 dup(0) – byte үнсіз

Макрос және процедуралар

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

Макросты анықтау орнына: макросты і жолмен анықтауға болады: 1)сегменттерді суреттегенше 2)басқа файлда және деректива арқылы программаға қосу

include файл аты

3)Макросты в т.н. макрокітапханада анықтауға болады және include: include test.inc деректива арқылы программаға қосылса болады

Бәрін қолданбас үшін -  purge – дерективасы қолданады

purge үтір арқылы макростар аты

Макрос денесі белгі қасиетін сақтауы мүмкін,мысалы:

cycl macro len

mov cx,len

c1: inc si

loop c1

cycl 2                   - mov cx,2

cycl 3                      c1: inc si

cycl 1                      loop c1

                      mov cx,3

                     c1: inc si

                      loop c1

Берілген жағдайда макрорасширениясы екі еселенген белгі кеңейтілуін ұсынған с1,   

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

local үтір арқылы тізім аты

cycl macro len

local c1

mov cx,len

c1: inc si

loop c1

endm

Әрбір ат макрогенерация этапында глобальды идентификаторға түрленеді, стандартты түрге ие ??xxxx, где xxxx – 16ричное сан, ?? – символдар.

cycl 2

mov cx,2

??0001: inc si

           loop ??0001

mov cx,3

??0002: inc si

loop ??0002

Базалық макросредства. Қайталану блогы. Шартты компиляцияның дерективасы.

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

1)while 2)rept 3)irp 4)irpc

Алдыңғы 2 талқылайық.

1) while параметр

    конструкция

    endm

Конструкция белгілеген қайталану санын параметр анықтайды. Конструкция – бұл не инструкция тілі, не макрокоманда, не макродиректива, не блоктық қайталану. Қайталану блогы while конструкцияның қайталануы, параметр нөлге теңеспейінше орындала береді.   

Сол кезде параметрдің мағынасы автаматты түрде азаймайды.

2) rept параметр

    конструкция

    endm

Дәл бірінші жағдайда жұмыс істейді. Жалғыс ерекшелігі әр қадамда параметр мағынасы автаматты түрде бір қадамға азаяды.

def_sta1 macro id_table, ln:=<5>

ib_table label byte

len=ln

while len

db 0

len=len-1

endm

endm

Кейбір белгілер анықталады,  id_table орнына м.б кез-келген идентификатор тілі.

def_sta1 macro id_table, len

id_table label byte

rept ln

db 0

endm

endm

3) irp – өзгертілген қайталану блогы, т.е. әрбір қайталану қадамында кейбір конструкциялар, конструкияның өзі кейбір өзгеріске ұшырайды, қайталану блогы арқылы ендірледі.

Жалпы көрніс:

irp параметр, <S1,S2,…,Sn>

конструкция (параметр)

endm

Қайталану саны n-ге тең. Әрбір қадамда i-й параметрі Si конструкциясымен ауыстырлады. Әрбір Si – бұл символдардың қарапайым жүрісі.

irp x,<1,2,3,4>              db 1

db x                               db 2

endm                             db 3

                                      db 4

4)irpc – берілген блогтың мағынасы дәл irp блогын қолданғандай қолданады

irpc параметрі, <C1 C2 C3 … Cn>  ( C1, …, Cn – символы)               

конструкция (параметр)                                                               

endm

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

irpc reg,<abc>                        mov ax,1

mov reg&x,1                          mov bx,1

endm                             mov cx,1

 

Шарттық компиляциясының дерективасы

 

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

1)IF  и IFE

IFx лог. есеп                          ;  Е орнына х, немесе ешнарсе

фрагмент 1

ELSE

фрагмент 2

ENDIF

Лог. есеп – кез-келген константы есеп, бүтін мағынаны қабылтайтын, жалған түрде,   егер бұлмағынасы нөлге тең болса және шындық басқа түрде. Фр1 және фр2 – бұл кез-келген конструкцялық тілде, макрокомандалар немесе қайталану блогы. Блок else фр2  түсіруге болады, кәдімгі қарапайым тілдегідей.  Егер IF дерективасы қолданса, онда  шындық логикалық есеп макрорасширения түрде фрагмент1 қойылады. Егер лог. Есеп жалған болса, онда else жоқтығынан қойлым орындалмайды, ал тек else болсая фрагмент2 қойылады. IFE дерективасы дәл осындай қадамдарды жасайды, бірақ тек осы жағдайда, егер лог. есеп алдыңғысы жалған болса.

Әрбір жоғары дәрежедегі ЯП операторлар болса немесе өту командасы және конструкциядан жедел шығу. Бұлар ассембледе бар.

GOTO белгісі

EXITM

GOTO макрос аймағына өтуін ұйымдастырады, белгіленген белгіден басталады.  С    с  Макростың ішіндегі белгі былай анықтайды: белгі аты.

EXITM макростан жедел шығуын ұйымдастырады. Макростан шығу ол шығу нүктесінде макрорасширение.

2)IFDEF     IFNDEF

IFx аты

фр1

ELSE

фр2

ENDIF

Берілген шартты деректив тексеріп, программада жалпы аты көрсетілгенін.  х=DEF егер аты белгілі болса, фр1 қойылады; егер жоқ болса – онда фр2. Егер х=NDEF, егер аты анықталмаған болса, фр1 қойылады, болмаса фр2. ELSE конструкциясы болмауы мүмкін.  IF, IFE  дерективасы орындалған кезде???

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

debug eau1

if debug

         баспаға шығару командасы

endif

Программада sw кілті қолданылады. Егер бұл кілт нөлге тең болса, онда сгенерировать фрагментті есепті шығару үшін y=x*2n. Егер кілт=1, онда сгенерировать фрагмент есептеу үшін y=x/2n. Мүмкін жағдайда, кілт анықталмаған кезде – онда керегі жоқ.

ifndef

exitm

else

mov cl,n

ife sw

sal x,cl

else

sar x,cl

endif

endif

3.IFB, IFNB

IFx имя

Фр1

ELSE

Фр2

ENDIF

Аты – кез-келген жолдық жөнімен. Берілген шарттық директива берілген жолдық жөнін теңдігін пробел арқылы анқтайды.

IFB  фр1орындайды,  егер пробелом болып келсе, ал IFNB фр1 орындайды, егер ол болмаса. Әдетте, пробелменмен салыстырғанда программаның ішкі анықтауын.

IFIDN, IFIDNI, IFDIF, IFDIFI

Берілген директива 2 жолдың тең немесе тең емесін тексереді.

IFx параметр 1, параметр2

Фр1

else

Фр2

EDNIF

Параметр 1 және параметр 2 – 2 жолдық жөні,  әдетте, бұрыштық жақшаға <> жинақталады.

        x=IDN фр1 орындалады, егер пар1 и пар2 – бірдей жолдар.

x=IDNI жолдар ригистірге сезімсіз болып қалады.

x=DIF фр1 орындалады, егер жолдар әртүрлі.

x=DIFI  жолдар ригистірді сезбейді.

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

Микропроцессорға қарағанда сыртқы оқиғалармен иницирленетін үзілістерді сыртқы үзілістер деп атаймыз. Аппараттық істен шығу немесе кейбір команданың дұрыс емес сұрыптауының (өңдеудің) салдарынан микропроцессордың дұрыс жұмыс істемейді де  ішкі үзілістер пайда болады.  Ішкі үзілістер екі себептен иницирленеді. Бірінші себеп – команданың дұрыс емес өңделуі. Сәйкес үзілістер ерекше жағдай немесе ерекшеліктер деп аталады. Екінші себеп - int xx (xx – үзілістің номері) командасының шақырылуы. Мұндай үзілістер бағдарламалық деп аталады, олар операциялық жүйелерге немесе BIOS немесе үзілісті өңдеуші қолданушылық процедураларға сілтеме жасайды. Барлық үзілістерді өңдеу процедуралары (қолданушылық емес) кейбір функционалдық мүмкіндіктеріне байланысты класстарға бөлінеді. int  командасында XX  - бұл класстың фантастикалық номері. Үзілісті өңдейтін әрбір процедура  берілген класстын ішінде әрқайсысының өз номері бар. Мұндай процедуралар үзілісті өңдеу процедуралары деп аталады.

mov ah,4ch –  ah – қа  21h  классынан функция номері жазылады

int 21h

Үзілулер жүйесі – бұл үзілу механизмімен жабдықтайтын аппарттық және бағдарламалық құралдардын жиынтығы.

I, Аппараттық құралдар: 1)ақпараттық шығыстық және кірістік ағындарының орнын ауыстыруын қамтамасыз ететін микропроцессорлық енгізулер. 2) үзілістердің өңделуінің бағдарламалаушы контроллері. Бұл Intel (8259A/3) (сыртқы қондырғылар) технологиясына негізделген спецификалық сұлбасы.

II, Бағдарламалық құралдар: 1) үзілістер векторының кестесі. Берілген кестенің үзілістерді өңдеуші процедураларға сілтемеленетін көрсеткіштері бар. Микропроцессордын жұмыс істеу режиміне байланысты мұндай кестелердің өлшемі және форматы әр – түрлі болуы мүмкін. Үзілістер векторының кестесінің өлшемі үзілу негіздерінің өлшемін шектейді. Әдетте нақты режимде негіздердің саны 0 – ден 255 – ке дейінгі диапазонымен анықталады. 2) регистрдің екі жалаушасы flags if және tf (interrupt және trace). 3) үзілістердің жұмыс істеу кезіндегі арнайы командалары: int, into, iret, cli, sti.

into – толып кету себебінен шақырылатын үзіліс (егер of жалаушасы орналасқан болса).

iret  – үзілістерді өңдеу процедурасынан қайтарып алуды ұйымдастыру үшін қолданылады.

Cli, sti – ішкі орналастырылған үзілістерге рұқсат береді немесе бермейді.

Микропроцессордың нақты жұмыс істеу режимінде үзілістерді өңдеу.

Бұл механизм 3 деңгей арқылы іске асырылады: 1) ағымдағы бағдарламаның орындалуын тоқтату 2) сұрыптаушыға өту жұмысын ұйымдастыру 3) үзіліс процессі іске асқан бастапқы бағдарламаға басқаруды беру.  1 және 2 деңгейлері  стекте cs:ip мәнін сақтап және  flags  регистрінің әрі қарай cs:ip  жұбынын өзгертілуімен және ауысу командасын шақыру  ды сақтау  арқылы байланысады. Берілген механизм автоматты түрде іске асады, оған қоса if  жалаушасының  үзілулерінің мәні іске асады. Бастапқы бағдарламанаң жалаушалары мен регистрлерінің тоқтата алмайтын өзгерістерге алып келуі мүмкін бұл орналастырылған үзілістерге рұқсат берілмеуіне байланысты. Осыған орай орналастырылған үзілістерге рұқсат беру (қолданушылық процедураларында) sti және iret  командаларының көмегімен іске асырамыз. 2 – ші деңгейде үзілістер векторының кестесінің жұмыс істеу механизмі қолданылады. Осы кестенің әрбір элементінің (көрсеткішінің) мөлшері 4 байт. 1-е слово указателя опреде-ляет смещение процедуры обработки прерывания с номером n относительно начала сег-мента кода и 2-е слово определяет базовую составляющую элементов таблицы векторов прерывания, т.е. базовый адрес кодового сегмента. Яғни үзіліс векторы кестесі элементінің орын ауыстыруы  n  көбейту 4 деген формуламен анықталады. n*4.

Екінші деңгейдің жұмыс істеу механизмі:

1)кесте элементінің 1-ші сөзі  ip регистріне енгізіледі. 2) 2 – ші сөз cs регистріне 3)  cs:ip  адресі бойынша өтуге болады.

Үзілістің қорғалған режимде өңделуі

Үзілісті өңдеу схемасындағы басты компонент IDT  аббревиатурасы мен idtr регистріне ие болатын үзілістің арнайы дескрипторлық кестесі болып табылады. Схеманың өзі келесіден тұрады:

1) дескрипторлық кестенің мекен-жайы анықталады, оның мекен-жайы мен өлшемдері  idtr регистрінде орналасқан; 2) алынған IDT мекен-жайы мен n*8 мәнінің қосылуы жасалады, мұндағы n – үзілістің нөмері болып табылады, нәтижесінде үзілістің өңдеушісі орналасқан мекен-жайдың шамасы анықталады; 3) үзілістің өңделу процедурасына өту жасалады. 

Қорғалған режимдегі үзілістің топтары

1)  Істен шығу (қате) – бұл үзіліс немесе ерекшелік болып табылады, онын кезінде cs:ip регистріне үзіліс пайда болған бағдарламаның мекен-жайы енгізіледі (нақты режимде мұнда келесі команданың мекен-жайы жазылады). Мұндай механизм қажетті кодты сегментке рұқсат ала отырып, үзілісті болдырған команданың рестартын (қайта іске қосылуын) ұйымдастыруға мүмкіндік береді.

2)  Қақпан – мұндай үзілістер нақты режимдегідей cs:ip регистріне үзілісті тудырған командадан кейінгі команданың мекен-жайын орналастыруға мүмкіндік береді. jmp өту командасында үзілістің пайда болған жағдайында арнайы команданың мекен-жайы cs:ip регистріне енгізіледі.

3)  Апатты жағдай: бұл жағдайда үзілісті өңдеу туралы толық ақпарат белгісіз немесе тыйым салынған болып келеді, яғни егер осы механизм жоспарланбаса, онда үзілісті жасаған бағдарламаның қайта қосылуын жасау мүмкін болмайды.

Микропроцессор әрбір үзілістің белгілі бір топқа жататындығын қатаң түрде анықтайды. IDT-де шлюз деп аталатын арнайы дескрипторлар бар. Олар үзілісті өңдеу процедурасына кіру нүктесін көрсетуге арналған. IDT-да шлюздің 3 түрі болады.

1)      Шлюз-қақпан

Үзіліс пайда болғанда және оның векторы IDT кестесінде таңдалғанда (яғни дескриптор таңдалғанда) микропроцессор стекте ағымды бағдарламаның үзілісі пайда болған орны жайлы ақпаратты сақтайды. Одан кейін indicator және offset өрістерін ескере отырып, басқаруды берудің ұйымдастырылуы жасалады. 

Indicator GDT және LDT кестелері бірінің селектор ролін атқарады. Қорғалған режимде дескрипторлы кестеде әр түрлі процестер туралы айтарлықтай толық ақпаратты сақтауға мүмкіндік бар болады.

GDT – глобальді дескрипторлы кесте – сегменттердің дескрипторлары, TSS дескрипторлары (мәселенің кү» сегменттері), шлюз-қақпандары, шлюз-есептері және шлюз-шақырулары түріндегі ақпараттан тұратын жалпы жүйелік кесте.

LDT – әрбір процесс үшін спецификалық болып табылатын және GDT-ге ұқсас құрылымға ие болатын локальді дескрипторлы кесте.

2) Үзілістер шлюзі. Кесте элементінің форматы қақпандар шлюзінің форматымен дәл сәйкес келеді. Айырмашылығы type өрісінде ғана болады (ол 1110 мәніне ие). Үзілісті өңдеген кезде қақпандар шлюзі орындайтын іс-әрекеттердің барлығын орындайды, алайда сонымен қатар аппараттық үзілістерге тыйым сала отырып, үзіліс жалаушасының мәнін түсіріп тастайды.

3) Мәселенің шлюзі

Мұндай дескрипторлардың өңделуі «мәселе» деп аталатын ерекше объектке өту керек екендігін білдіреді. Мәселе – микропроцессор жұмысының қорғалған режиміндегі көп мәселелік механизмнің бөлігі. Қорғалған режимде үзілістің өңделуін ұйымдастыру үшін келесі қадамдарды орындау керек болады:

1) IDT-ны инициализациялау;

2) өңдеушінің процедурасын құру;

3) аппартаттық үзілістерді болдырмау;

4) үзіліс өңдеуінің контроллерін қайта бағдарламалау;

5) idtr регистріне загрузить IDT мекен-жайын енгізу;

6) қорғалған режимге өту;

7) үзілістің өңделуін рұқсат ету.

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

 

21. Жүйелік үзулерді өңдеуіштердің негізгі функцияларымен танысу

 

  1. Үзүлістерді  қабылдау
  2. Үзүліс өңдеуші  бағдарламалар
  3. Сыртқы құрылғылар үзүлістері
  4. Үзілулерді өңдеу механизмі

 

Үзүлістерді  қабылдау

80x86 процессорларында жұмыс істеп  жатқан  бағдарламаны  тоқтатып ( үзүп ) басқаруды арнайы өңдеуші  бағдарламаларға  беру  үшін арнайы  бір  жағдай  қарастырылған ол – үзүлістер деп аталады. Ондай үзүлістерді бағдарламалар мен аппараттық  құрылғылар жасауы мүмкін

INT ( INTO және INT3 ) омандалары  осындай  үзілістерді тудыру  үшін  қолданылады. Ондай үзіліс туғанда ол үзүлісті  өңдеуші  бағдарлама  іске  қосылады, ондай өңдеуші жұмысын  аяқтағанан  кейін  осы  камандадан  кейінгі  каманда  орындала  береді. Үзүлістерді  тудыру DOS пен BIOS – тың  функцияларын  шақырудың  негізгі  жолы болып  есептеледі, әрине ол  функцияларды CALL камандасымен  де шақыруға  болады  бірақ  ол кезде  сол функциялардың  адрестерін  білу керек, ал үзүліс  жағдайында  тек  функция нөмерін  білсең  болды.

Үзүліс өңдеуші  бағдарламалар

INT үзүлісі болған кезде  басқару үзүлістер  векторларының  таблицасынан адрес алынып  сол адреске  беріледі ,ал таблица  0000h:0000h адресі  бойынша басталады. Бұл таблицаның  әр элементі  үзүлісті өңдеушінің адресі  болып табылады, оның  форматы сегмент:смешения  түрінде  келеді . INT омандасы  стекке  қайтар  адресті  енгізіп қойяды, сондықтан  өңдеуші  бағдарлама әрдайым iret командасымен  аяқталу  керек.

Өңдеуші  бағдарлама  жазылып  болған  соң  оны  бір  үзүліске  «байланыстыру» керек. Оны тікелей  таблицаны  өзгерту  арқылы істеуге  болады. Бірақ  таблицаға тікелей  енгізу  қателіктерге  әкелуі  мүмкін сондықтан DOS – тың  қолданбалы  бағдарламаларға арнайы жазылған  функцияларын пайдаланған  жөн; 25h- адресті  орнату функциясы 35h- адресті  оқу функцияласы.

Сыртқы құрылғылар үзүлістері

Сыртқы құрылғылар үзүлістері немесе құрылғылық үзүлістері деп клавиатурадан, дискаводтан, таймерден және т.б құрылғылардан  келетін үзүлістерді  айтамыз. Дербес компьютерлерде 15  құрылғылақ үзүлістер  бар  бірақ  оның  санын 64- ке дейін  көтеру  мүмкіндігі  бар.

— IRQ1 (INT 9) – клавиатура  үзүлісі, ол клавишті әр басу кезінде  туады. Оның  стандартты  өңдеушісі  көптеген  функциялар  атқарады; Ctrl – Alt – Del басқан  кезде компьютерді  басынан  жүктеулен бастап, басылған клавиштің кодын BIOS- тың алмасу  буферіне қоюға дейін.

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

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

 

Үзүлісті жүйеден бұрын өңдейтін резидентті  бағдарлама

 

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

Ондай Бағдарлама жазу  үшін  клавиатурада  басылған  символдар басығанан  кеін  қайда және не  үшін  «баратынын» білу  қажет. 

Клавиатура  жұмысын  арнайы  схема  бақылайды ол – клавиатура контролері  деп аталады. Кантролер басылған клавиштің кодын  оз регистріне ( портына ) жазады. Әр клавишке  екі  скэн – кодтан  берілген  олардың айырымы 80h – ты береді, біріншісі клавиш басылғанда  екіншісі  жіберілген  кезде  60h портына  жіберіледі.

Скэн – код арқылы басылған символдың  регистірін табу  мүмкін  емес, бірақ <Shift>, <Ctrl>, <Alt>, <Caps Lock> сияқты клавиштердің  де скэн – кодтары  бар  сондықтан өңдеуші  бағдарламада  клавиштің  басылу  жіберілуін  қадағалау  арқылы  регистірді  білуге  болады. Осы өңдеу операцияларын  резидентті өңдеуші  бағдарлама  жүрғізеді.

Клавиштің  басылуы да, жіберілуі де  үзүліс жағдайын  тудырып  жұмыс жасап тұрған бағдарламаны  тоқтатып  BIOS құрамына  кіретін  клавиатура  үзүлістерін  өңдеушіге  беруді  тудырады. Оны int09h бағдарламасы деп атайды  өйткені  ол 09h векторынан  шақырылады.

int09h бағдарламасы 60h портынан  басқа, жадының  тағы екі  бөлігімен  жұмыс істейді олар:  айналмалы енгізу  буфері 40h:2Eh –тен  40h:3Dh-ке дейін, ол жерге  соңында ASCII коды жазылады ,және клавиатура бит  флагы 40h:17h ол жерде  басару  клавиштердің  күйі  көрсетіледі.

int09h бағдарламасы клавиатура үзүлісі  нәтижесінде  басаруды  алып  басылған  клавиштің  скэн – кодын  өңдейді. Егер  скен  код  басқару  клавиштердің  біреуініңкі және ол басу  нәтижесінде  болса  онда  ол клавиатура  байт  флагындағы  сәйкес  флакты  өзгертеді.

PC/AT компьютерлерінде та.ы  бір байт  флаг  бар ол жадыда  40h:18h  адресі  бойынша  орналасқан ол 101-клавиатурасына  аналған.

Клавиатурада басқару емес  кәдімгі  клавиш  басылса, int09h бағдарламасы 60h портынан  скэн - кодты  оқып  таблица бойынша  ASCII  кодын  құрады, содан  екі байтты  код  шығады  бірінші  байты скэн - код болса  екінші  байты  ASCII  коды болды.

Әр  скэн - кодқа  кем  дегенде  екі  ASCII кодынан  келеді  (“а”-“А”,“№”-“?” және т.б). int09h бағдарламасы өз  жұмысы кезінде  байт  флактарды қадағалап  отырады Мысалы Q (скэн- коды -10h, ASCII коды Q-51h , ал q-71h)  екі байтты  коды 1071h болады, ал  егер  <Shift> басқару  клавиші  басулы тұрса  онда екі байтты  код  1051h  болады, тура сондай  код  <Caps Lock> режимінде  де туады.

Алынған  екі  байтты  кодты  int09h бағдарламасы  айналмалы  енгізу  буферіне  жібереді, ол буфер клавиатурадан  келген  мәліметтер  мен  қолданбалы  бағдарламанның  синхронизациясы  үшін  қажет. Буфердің  көлемі  16-код  (сөз)  . Буфер  күіне  екі  указатель  көрсетеді, Соңындағы  указательде (40h:1Сh)  бірінші  бос  ячейканың  адресі  бар, басындағы указательде  (40h:1Ah) ең ескі  код адресі  орналасқан. Екі  бағыттаушы да BIOS - тың мәліметтеріне қатысты смешения  болып  табылады (1Eh-тан 3Ch-қа дейін). Жұмыс басында  екі  бағыттауыш та буфердің  бірінші  ячейкасына  көрсетіп  тұрады.

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

Жұмыс  істғеп  жатқан  бағдарлама басылған  символдың  кодын  алу  үшін DOS - тың  немесе  BIOS- тың  функцияларын  пайдалану керек (DOS-21h  BIOS-16h). Жүйелік  бағдарламалар клавиатура  драйвері  арқылы (дәлірек  айтқанда  клавиатура  мен экранның  қосылған  драйвері) айналмалы  буферден бас  указатель  крсетіп  тұрған  адрестен кодты  оқиды, да  указательдегі  адресті  екі  байтқа  көбейтеді. Сол  арқылы қолданбалы  бағдарламалар  кодтарды  клавиатурадан  емес  айналмалы  буферден алады.

Соңындағы бағыттауыш  буферде сырғып  соңында буфер аяғына жетеді (40h:3Ch адресі). Ол кезде  указатель  адресі  азаймай буфер  ұзындығына  көбейеді .Осындай  әрекет  бас  указательмен  де жүреді.

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

Егер  ешқандай  бағдарлама  жұмыс  істеп  жатпаған  болса  онда  COMMAND.COM жүйелік  бағдарламасы  активті  болып  тұрады. COMMAND.COM - ның жұмысы DOS- қа команданы сұрап  тұрады (21h үзүлісінің 0Ah функциясы  арқылы). Енгізілген  символдардың  кодтары  айналмалы буферден DOS- тың ішкі  буферіне  жазылады, <Enter> клавиші  басылысымен COMMAND.COM бағдарламасы  команданы  енгізілді  деп есептеп, ол команданы  талдайды. Ол  кезде  бағдарлама  тек ASCII кодымен  ғана  жұмыс  істейді.

Кейбір  бағдарламалар  клавиштен  символ  енгізуді  керек  етпейді, ол кезде  басылған  символдар  буферде  жинала  береді ( тек 15 символ  ғана ). Бағдарлама  өз  жұмысын  аяқтаған кезде  COMMAND.COM бағдарламасы  символдарды  буферден  алып  оны  анализдейді.

Жоғарыда  айтылғанның  барлығы  тек  экранда  көрінетін  символдар  жайлы  болатын. Бірақ та  одан басқа экранда  көрсетілмейтін  символдарда  бар  емес пе мысалға; <F1>, <F2>… <F10>, <Home>, <End>, <↑>, <←>, <→>  және т.б. Оларды  басқан кезде  буферге арнайы  ASCII коды  жіберіледі  ондағы  кіші  байт  нөлге  тең, ал үлкені басылған  клавиштің  скэн – коды  болып  табылады. Ал егер  сындай басқару  клавиштердің  комбинациасы  басылса  онда скэн  кодтың  орнына  арнайы комбинациялық  код  жазылады, мысалы; <F1> клавишінің  скэн – коды 3Bh болса онда  оның  комбинацяаларының  кодтары мынадай: <F1> - 3B00h, <Ctrl>/<F1> - 5E00h, <Alt>/<F1> - 6800h, <Shift>/<F1> - 5400h.

Сонымен клавишті  басқан  кезде  болатын  үзүлісті  BIOS құрамындағы  арнайы  жүйелік өңдегіш  өңдейді. Енді  осы үзүлісті  жүйеден  бұрын  қабылдап  өңдейтін  бағдарламаны қарастырайық.

Үзулерді өңдеу механизмі

 

Үзіліс механизмі — кез-келген есептеуіш жүйенің айтарлықтай маңызды бөлігі болып табылады. Үзілістің құрылымы енгізу-шығару құралдары мен процессорлардың байланысы үшін тиімді құралды ұсынады. Үзілістермен басқару Ассемблер тілінде бағдарламалаумен прерогативті болып келеді. Жоғарғы деңгейлі тілдерде машиналық деңгейде үзілістермен жұмыс жасалынбайды.

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

Үзілістер процессордың ағымдың іс-әрекетін «үзу» қажеттілігі туралы сигнал береді. Үзілістер процессорды сыртқы құрылғыларды әрдайым бақылау қызметінен босатады. Егер де мысалы, қолданушының клавиатурасы үзілісті шақырмаса, онда процессор клавиштің басылғанын анықтау үшін үзіліссіз клавиатураны тексеріп отыратын еді. Компьютерге арналып жазылған әрбір бағдарлама бір әрекетті қайталап орындай берер еді және клавиатураны жиі тестілеп отырар еді. Бірақ үзіліс бұл талаптарды шешіп берді және бағдарлама клавиатураны жиі тестілеусіз орындала алады. Клавиатура қандай-да бір ақпаратты алған сайын ол процессорге осы туралы хабарлайды. Микропроцессор клавиатураның сұранысын қанағаттандырғаннан соң ол бағдарламаның орындалуының қалыпты қадамын қайта жаңарта алады

8088 үзілістерімен жұмыс көбінесе процедуралармен олардың байланысын еске түсіреді. Үзіліс процессор жұмысын команданы орындау кезінде тоқтата алмайды. Алдымен 8088 алдыңғы команданың орындалуын аяқтайды, ал келесісін жояды. Оның орындалуының орнына процессоркелесі процессор команда шақыруымен болғандай етіп әрекет етеді.  Ол стекте келесі команданың адресін есте сақтап, арнайы процедураға ауысады.  Бұл процедура Бұл процедура құрылғы үзілісін шақырушы командалармен жұмыстан тұрады. Клавиатурамен жұмыс кезінде үзілісті өңдеу бағдарламасы символды есептеп, оны  ары қарай қолдану үшін сақтайды. Құрылғымен жұмысты аяқтаған соң үзіліс нүктесіне қайтарылады. Процессор стектен қайтару адресін ашып, ары қарай ештене болмағандай бағдарламаның орындалуын жалғастыра береді.

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

Үзілу кезінде 8088 стек мәнінде кейбір құрылған бағдарламаларды сақтап қалады.  Өз кезегінде үзілісті өңдеу бағдарламасы өзінің орындалуы кезінде өзгеріске ұшырай алатын кез-келген басқа да деректерді сақтай  алады. Бұл дерек тер әдетте стекте сақталады. Содан соң үзіліс бағдарламасына басқару қайта келу кезінде, үзілісті өңдеу бағдарламасы үзіліс кезіндегі мәндерді өзгерген мәндерге қайтару керек.  Үзілістің пайда болу факты орындалатын команда үшін «көрінбейтін»  болуы керек.

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

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

Егер клавиатурадағы үзіліс оператор басқа клавишаны басқанға дейін символды оқымаса, екінші символ жоғалуы мүмкін. 8088-де барлық сыртқы үзілістерді шығармауға мүмкіндік бар.   IBM PC қандай үзілісті шақыруға болатын және болмайтынын білуге үлкен мүмкіндікке ие. Бағдарлама бұл мүмкіндікті үзіліске рұқсат беру үшін маңызды құрылғыларды таңдауға немесе ал күрделілеріне тиым салу үшін пайдалана алады.

Жалпы жағдайда үзу команда болып табылады. Ол компьютерге қоса салынған қорлармен жұмыс жасауға мүмкіндік береді. Үзулердің негізгі екі үлгісі — BIOS және DOS жүйелері бар. BIOS жүйесінің үзілістері бес топқа бөлінеді:

  1. Вектор үзу микропроцессоры 8088 (0-7Н үлгілері);
  2. Вектор үзу микробақылауы 8259 (8Н-ОҒН);
  3. Процедуралардың кіріс нүктелер жүйелері (10Н-1АН және 40Н үлгілері);
  4. Пайдаланушы процедураларының шақырылуы (1 ВН және 1СН үлгілері);
  5. Жүйелік кестелердің көрсеткіші (1ВН, 1ЕН, 1ҒН және 41 Н).

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

 

Кесте 1 – Үзілістің түрлері

 

00h

Ішкі үзіліс, 0-ге бөлу

01h

Ішкі үзіліс, қадамдық орындалу (TF=0 болған кезде)

02h

Немаскеруиемое үзіліс (NMI процессорды шығару)

08h

Жүйелік таймерден аппараттық үзіліс

09h

Пернетақтадан аппараттық үзіліс

0Eh

Иілгіш дисктен аппараттық үзіліс

10h

Бағдарламалық үзіліс, бейнежүйемен басқарылатын BIOS бағдарламасы

13h

Бағдарламалық үзіліс, дискпен басқарылатын BIOS бағдарламасы

16h

Бағдарламалық үзіліс, пернетақтамен басқарылатын BIOS бағдарламасы

1Dh

Вектор емес, BIOS-пен қолданылатын бейнепараметрлер кестесінің адресі

1Eh

Вектор емес, BIOS-пен қолданылатын дискеталар параметрі  кестесінің адресі

21h

Бағдарламалық үзіліс, DOS функциясының диспетчері

22h

Бағдарламалық үзіліс, DOS-пен қолданылатын процестің аяқталуы кезіндегі өткел (өту) адресі

23h

Бағдарламалық үзіліс, DOS-пен қолданылатын <Ctrl>/C бойынша үзілісті өңдеуші

25h

Бағдарламалық үзіліс, дисктің абсолютті оқылуы (DOS функциясы)

26h

Бағдарламалық үзіліс, дискке абсолютті жазу (DOS функциясы)

60h…66h

Қолданушының бағдарламалық үзілістері үшін резервтелген

68h…6Fh

Бағдарламалық үзілістер, еркін векторлар

70h

Нақты уақыттағы сағаттан аппараттық үзіліс

76h

Қатты дисктен аппараттық үзіліс

 

Үзулердің резидентті өңдеушісі

 

Есептеуіш жүйенің жұмысын қамтамасыз ететін бағдарламалардың үлкен классы  (құрылғылардың драейверлері, шифрации бағдарламалары және тап осы қорғаныштар), жадыда тұрақты күйде тұрып қолданушының кез – келген іс әрекетіне лезде жауап беру керек. Сондай бағдарламаларды жадыдағы резидентті бағдарлама (Terminate and Stay Resident, TSR), немесе қарапайым – резидентті деп атайды. Резидентті етіп COM бағдарламасын да , ЕХЕ бағдарламасын да жасау, а болады, бірақ резидентті бағдарлама жадыда аз орын алу үшін көбіне COM типті бағдарламаны қолданады.

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

text    segment 'code'

assume CS:text,DS:text

org   100h main    proc

jmp   init                    ; инициализация секциясына өту

; резидентті секцияның мәліметері

                . . .

entry:      ;  резидентной секции тексті

                . . .                                 

main    endp

init    proc             ;инициализации секциясы

                . . .

mov   DX, (init-main+10Fh)/16; параграфтағы размері

mov   АН,3100h  ; "жадыда алдыру және

int   21h               ; бітіру" функциясы init    endp text    ends

end   main

 

Бағдарлама СOM форматында жазылып жатыр, сондықтан онда бір ақ сегмент бар, ол сегментпен CS және DS регистірлері байланысады; сегменттің бас жағында 100h байт PSP үшін резервтеледі.

Бағдарлама қосқаннан кейін басқару main процедурасының басына келеді .jmp командасымен  инициализациа секциясына өтеді. Инициализациа секциасында бағдарламаның резидентті жағдайда жұмыс істеуіне жағдайлар жасалаы. Инициализациа секциасында соңғы жолдарында DOS 31 h функциасы шақырылады, ол бағдарламаның белгіленген бөлігін жадыда қалдырып қал,анын жадыдан шы,арады. Бұл функция тек 64Kb аз ба,дарламаларды ,ана жадыда қалдыра алады, бірақ ассемблерде  жазылғандар көптеген бағдарламаның  талапқа сай болады ­.

Резиденті бағдарламалар жадыда қалып қоятындықтан жады мөлшерін азайтады, сондықтан резидентті бағдарламаларды ассемблерде жазып оны ықшамдатады.

Бағдарлама мөлшер DX регистерінде DOS – қа беріледі. Резиденті секцияның көлемін келесідей анытауға болады: mil –main смешения айрмасына, PSP(100h) размері мен 15(Fh) қосылады

Жадыны үнемдеу масатында инициализациа секциясы бағдарлама аяғында орналасады , өйткені ол аяқтала салысымен алынып тасталу керек .

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

Кез келген резидентті бағдарлама кемінде екі кіріу нүктеден тұрады. Клавиатурадан қосылған кезде COM типті бағдарламаларда басқару PDP (IP100h) дан кейінгі бірінші байтқа беріледі. Сондықтан резидентті бағдарламалардың көбінде бірінші команда болып jmp ойылады.

 31h функциасынан кейін бағдарлама жадыда пассивті жағдайда

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

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

Жүктелгенен кейін бағдарлама клавиатура үзүлістерінен активизациаланатын болады (дәлірек айтанда BIOS бағдарламасынан).

 

22. ЕХЕ файлдарының құрылымы мен олардың жүктелуі. Бағдарламалардың басқарылуы. Бір бағдарламаның екіншісінің көмегімен қосылуы. Жұмыс аяқталғаннан кейін бағдарламаның жадыда сақталуы. Бағдарламаның жүктелуі мен қосылуы. Бағдарламалардың *.ЕХЕ типінен *.СОМ. типіне түрлендірілуі. Дисктік жинақтағыштар. Диск таратылуының басқарылуы. Кіші бағдарламалардың шақырылулары.

 

ЭЕМ-дағы жады таратылуының ұйымдастырылуы

Есте сақтау құрылғылары кез-келген компьютердің негізгі бөліктерінің бірі болып табылды. Алдын ала айтқандай, олардың жұмыстары иерархиялық принцип бойынша жасалады. Көбінесе ЭЕМ-нің жұмыс тиімділігі иерархияның әрбір деңгейіндегі жадының қолданылуының және әр түрлі деңгейлі ЗУ арасындағы өзара әрекеттесуінің рационалды ұйымдастырылғанына байланысты болады.

Осы иерархиядағы басты роль оперативті жадыға тиесілі болады. Дәл осы жадыда жұмыс жасау барысында бағдараламалар сақталады., өңдеуге арналған бастапқы мәліметтер дәл осы жерден микропроцессордың регистрлеріне жүктеледі. Айтқандай, бағдарламалар жұмыстарының қорытынды нәтижелері аталған жерге беріледі. Сондықтан ЭЕМ – нің жұмыс істеунің барлық уақыт аралығында ОЗУ – дың рационалды қолданылуы өте маңызды болады.

Мультибағдарламалық ЭЕМ – нің оперативті жадында әдетте операциялық жүйенің ядросы (негізі) сақталады.  ЭЕМ – нің жұмыс істеу барысында  ОС ядроларының бағдарламалары  жиі орындалады, олардың орындалу уақыты ұзақ емес.  Операциялық жүйелердің қалған бөліктері сыртқы жадыда орналасады және қажет болған жағдайда керек модульдер оперативті жадының бөлігін ала отырып жүктеледі. Оперативті жадының қалған бөлігінде мультибағдараламалық режимде орындалатын бірнеше бағдарлама және олармен қолданылатын мәліметтер сақталады.

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

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

Осының нәтижесінде жадының таратылуы әрқашанда келісімді сипатқа ие болады.

Жадыны басқару жүйесі келесі негізгі функцияларды орындайды [2]:

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

тапсырмаларды орындау үшін жадының  таратылуы (кандай тапсырма үшін, қашан және қандай мөлшерде оперативті жадынының бөлінуін анықтау);

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

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

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

Бағдарламаның физикалық адрестік кеңістігінде мәліметтердің адрестелуі үшін логикалық адресациясын қолданады. Процессор автоматты түрде логикалық адрестерді  адрестік шинаға берілетін және жадыны басқару (контроллер) схемаларымен қабылданатын физикалық адрестерге трансляциялайды.

Кез келген ресурстар сиякты оперативті жады таратылуының екі стратегиясы бар болады: статикалық және динамикалық таратылу.

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

Мұны қарапайым мысалмен суреттеп көрсетейік.

Оперативті жадының көлемі 10 Мбайт делік, ал A, B, C, D бағдарламаларын орындау үшін жадының келесі көлемдері қажет болады:  A - 2 Мбайт, B - 1 Мбайт, C - 4 Мбайт, D - 4 Мбайт. Жадының бастапқы таратылуы мен кейбір бағдарламаларды орындап болғаннан кейінгі жадының таратылуы сурет 1-де көрсетілген.

 

 

Сурет 1. жадының статикалық таратылуы: a – бастапқы таратылу; б – А бағдарламасын аяқтағаннан кейін; в – В бағдарламасын аяқтағаннан кейін; г – С бағдарламасын аяқтағаннан кейін.

Суретте көрсетілгендей, жадының статикалық таратылуы кезінде D бағдарламасы А бағдарламасының аяқталуынан кейін оған қажетті жады көлемінің пайда болуына қарамастан, барлық алдыңғы бағдарламалардың орындалулары аяқталуынан кейін ғана оперативті жадыға жүктелуі мүмкін. Оған қоса мультибағдарламалық ЭЕМ-нің жұмыс көрсеткіштерін жақсарту үшін оперативті жадыда орындалуға дайын болатын бағдарламалардың мүмкіндігінше көптеген мөлшері үнемі болуы қажет.

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

EMC (NYSE:EMC) корпорациясы EMC® CLARiiON® желілік сақтау жүйесінің тобына арналған бірнеше жаңа функцияларды ұсынды. Оларға қауіпсіздіктің интеграцияланған функциялары, iSCSI-дың қосымша функциялары және мәліметтерге рұқсат етудің жетілдірілген функциялары, сонымен қатар жоғары сыйымдылықты жаңа буынды дисктік жинақтағыштардың қолдауы жатады.

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

Жаңа мүмкіндіктер пайдаланушылар техникалық қолдаудың келісім-шартына отырған шартына қарай CLARiiON CX3 жүйесінің және CLARiiON CX300, CX500 и CX700 алдыңғы буынды жүйелердің пайдаланушыларына арналған тегін жаңартылу ретінде рұқсат етілген EMC CLARiiON FLARE® сақтаудың операциялық отасының соңғы версиясының құрамына кіреді.

Кіші бағдарламалардың шақырылуы

Мазмұнына тәуелсіз болып, кез-келген бағдарламада бағдарламаның жұмыс істеу барысында бірнеше рет қайталап (кейбір өзгерістері болуы мүмкін) орындауды қажет ететін бөліктер кездеседі. Мұндай қайталанатын бөліктерді жалпы бағдарламадан шығарып, кіші бағдарлама ретінде жасап, негізгі бағдарламаға орындалу қажеттілігі пайда болғанда олардың қолданылуы орынды болады. Орындайтын функцияларына байланысты кіші бағдарлама шақырылатын бағдарламадан белгілі бір мәліметтердің (аргументтер немесе параметрлер деп аталатын) берілуін талап ете алады, шақыратын бағдарламаға есептеудің нәтижелерін қайтарып бере алады немесе екеуінсіз де жұмыс істей алады. Кіші бағдарлама процедура ретінде жасалуы мүмкін, сонда осы процедураның аты кіші бағдарламаға кірудің нүктесі қызметін атқаратын болады:

drawline proc ;кіші бағдарлама-процедура
. . . ;кіші бағдарламаның денесі
ret ;шақыратын бағдарламаға қайтіп келу командасы
drawline endp

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

drawline: ;белгіден басталатын кіші бағдарлама
. . . ; кіші бағдарламаның денесі

ret ; шақыратын бағдарламаға қайтіп келу командасы
. . . ;негізгі бағдарламаның немесе

;басқа кіші бағдарламалардың жалғастырылуы

Кез-келген жағдайда кіші бағдарламаның шақыртылуы call командасымен орындалады. Кіші бағдарлама басқарылудың шақырылған нүктесіне қайтіп оралу үшін қызмет ететін ret командасымен аяқталуы керек. Кіші бағдарламалардың қолданылу, оларға параметрлерді беру және нәтижелерді қайтіп беру мәселелерін келесі бөлімде қарастырамыз. Мұнда біз call және ret командаларының орындалу механизмдері мен мүмкіндіктері сияқты принципиальді архитектуралық мәселелерге тоқталамыз. Сонымен қатар call және jmp командаларының синтаксистік ерекшеліктері мен қолданылу заңдылықтары көп жағдайда сәйкес келетіндігін есте сақтау керек және өтудің командаларына түсіндірмелердің айтарлықтай бөлігі шақыру командалары үшін де әділ болып келеді. Сall кіші бағдарламасының шақыру командасы 4 түрде қолданылуы мүмкін.

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

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

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

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

жанама алыс (өту адресінің ұяшығы арқылы командалардың басқа сегментіне).

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

code segment
main proc ;негізгі бағдарлама

call sub ;Код Е8 dddd

main endp
sub proc near ;кіші бағдарлама

ret ;Код СЗ
sub endp
code ends

Процедура-бағдарлама шақыратын бағдарлама орналасқан командалар сегментінде орналасады. Команданың кодындағы dddd командалардың сегментінде кіші бағларламаға кіру нүктесіне қарай ығыстырылуын білдіреді. Сall командасын орындауда процессор қайтіп келу адресін (ІР регистрінің құрамын) орындалатын бағдарламаның стегіне (сурет 2) орналастырады, содан кейін ІР-дің ағынды құрамына dddd қосады. Нәтижесінде ІР-де кіші бағдарламаның адресі пайда болады. Кіші бағдарламаның соңында болатын ret командасы керісінше процедураны жасайды – стектен қайтіп келудің адресін алады және оны ІР-ге енгізеді.

Сурет 2. Жақын  кіші бағдарламаның шақыру механизмінде стектің қатысуы.

 

Стектің кіші бағдарламаның шақыру және оның қайтіп келу механизміне қатысуы шешуші болып табылады. Стекте қайтіп оралу адресі сақталатындықтан, кіші бағдарлама стекті өзі, мысалы, аралық нәтижелерді сақтау үшін қолдана отырып, ret командасының орындалу сәтіне стекті бастапқы қалпына қайтаруы тиіс. Ret командасы әрине стектің күйі мен құрамын талдамайды. Ол стектен жоғарғы сөзді қайтіп келу адресі деп есептеп алады және осы сөзді ІР-дің командалар көрсеткішіне енгізеді. Егер ret командасының орындалу сәтіне стектің көрсеткіші белгілі бір жаққа қарай ығысса, онда ret командасы бұрынғысынша стектің жоғарғы сөзін қайтіп келу адресі деп қарастыратын болады және оған деген басшылықты береді, бұл тікелей жүйенің бұзылуына алып келеді.

Тура алыс шақыру. Осы шақыру кіші бағдарламаға басқа сегменттен кіруге мүмкіндік береді. 9Ah операция кодынан басқа команданың кодына шақырылатын кіші бағдарламаның толық адресі (сегмент плюс ығысу) кіреді. Әдетте far ptr суреттегішінің көмегімен бағдарламаның бастапқы мәтінінде шақыру алыс екендігі көрсетіледі, алайда егер транслятор екі жолмен трансляциялауға бел буса, онда аталған суреттегіштің қажеті жоқ болады. Кіші бағдарламаның алыс шақыруынан тұратын бағдарламалық кешеннің құрылымы келесі түрде көрсетілуі мүмкін:

codel segment
assume CS:codel
main proc ;негізгі бағдарлама
call far ptr subr ; Код 9А dddd ssss

main endp
codel ends
code2 segment
assume CS:code2
subr proc far ;кіші бағдарламаны алыс деп жариялаймыз

ret ;Код СВ – алыс оралу
subr endp
code2 ends

Процедура-кіші бағдарлама осы бағдарламаның басқа командалар сегментінде орналасады. Команданың кодындағы dddd командалардың сегментіндегі кіші бағдарламаға кіру нүктесінің салыстырмалы адресін, ал ssss оның сегменттік адресін білдіреді. Сall командасын орындағанда процессор стекке ең алдымен шақырылатын бағдарламаның сегменттік адресін, содан кейін қайтіп келудің салыстырмалы адресін (сурет 3) орналастырады. Одан кейін CS сегменттік регистрге 5555 (бізде бұл мән code2), ал ІР-ге dddd (бізде бұл мән subr) орналастырылады. Far атрибутындағы процедура-кіші бағдарлама алыс деп жарияланғандықтан, ret командасы жақын процедураның ұқсас командасының кодынан ерекше болып келетін кодқа ие болады және басқаша орындалады: стектен жоғарғы екі сөз алынады және ІР мен CS-ке орын ауыстырылады, осылайша командалардың басқа сегментінде орналасатын шақырылатын бағдарламаға қайтіп келуі орындалады. Ассемблердің тілінде алыс қайтіп оралу командасының анық мнемоникалық белгіленуі retf де бар.

Сурет 3. Стектің алыс кіші бағдарламаның шақырылу механизміне қатысуы

 

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

code segment
main proc ;негізгі бағдарлама

call DS:subadr ;Код FF 16 dddd
main endp
subr proc near ;кіші бағдарлама

ret ;Код СЗ
subr endp
code ends
data segment

subadr dw subr ;кіші бағдарламаның адресі бар ұяшық
data ends

Near атрибуты бар процедура-кіші бағдарлама шақыратын бағдарлама орналасқан сегментте, ал subadr ұяшығындағы оның салыстырмалы адресі мәліметтердің сегментінде орналасады. Команданың кодындағы dddd мәліметтердің сегментінде subadr сөзінің салыстырмалы адресін білдіреді. Команда кодының екінші байты (аталған мысалдағы 16h) адресациялайдың тәсіліне тәуелді болады. Жанама шақыру кіші бағдарлама адресациялануының әр түрлі тәсілдерін пайдалануға мүмкіндік береді:

call BX ; В ВХ кіші бағдарламаның адресі
call[BX] ; В ВХ кіші бағдарламаның адресі бар ұяшықтың адресі
call[BX][SI] ;В ВХ осы кестеде SI индексіндегі кіші бағдарламалар адрестерінің кестесі.
tbl[SI] ;tbl - осы кестеде SI индексіндегі кіші бағдарламалардың адрестері кестесінің адресі 

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

codel segment
main proc ;негізгі бағдарлама
call dword ptr subadr ;Код FF IE dddd

main endp
codel ends
code2 segment
subr proc far ;кіші бағдарлама

ret ;Код СВ
subr endp
code2 ends
data segment

subadr dd subr ;кіші бағдарламаның адресі бар екі қабатты ұяшық
data ends

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

 

23. Файлдарды тарату кестесін оқу. Бөлімдер кестесінің құрылымы

 

Қауіпсіздікті қамтамасыз етудің және нормаларға сәйкестіктің жаңа  функциялары.

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

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

Қауіпсіз инфрақұрылым – благодаря системе фильтрации IP-адрестерді фильтрациялау жүйесінің арқасында  доступ к массивам данных CLARiiON деректер массивіне қол жеткізу бөлек басқару станцияларымен бақыланып,шектелетін болады.Қосымша қауіпсіздік шарасы ретінде администраторлар командалық сызық бойынша қол жеткізуді шифрлауды және аутентификациялауды қамтамасыз ете алады.  

Нормаларға сәйкестік және аудит – бұл функция администраторларға жүйеге қол жеткізудің барлық әрекеттерін құжаттауға мүмкіндік береді, ол  CLARiiON бөлек жүйелеріне қол жеткізудің толық есептілігін қамтамасыз ету үшін керек. Уақыт синхронизациясының желілік хаттамасын (NTP) арқылы серверді және сақтау журналын синхронизациялау қауіпсіздік бойынша есептердің нақтылығын және кезектілігін қамтамасыз етеді

iSCSI – дің жаңа мүмкіндіктері

EMC CLARiiON CX  жүйесі екі хаттамамен оптикалық каналдар бойынша (Fibre Channel), сондай-ақ  iSCSI бойынша қосылуды қолдайды.  Поскольку популярность внедрения системы CLARiiON жүйесін в сетевых средах хранения iSCSI сақатудың желілік орталарында енгізу танымалдылығы өсіп келетіндіктен,   FLARE сақтаудың операциялық ортасының жаңа нұсқасы  өшірілген iSCSI көшірудің жаңа функцияларынан тұрады. Бұл қолданушыларға EMC MirrorView™ және EMC SAN Copy™ бағдарламалық қамтамалары бар CLARiiON жүйелерінде iSCSI порттарын қолдана отырып, қашықтықтан деректерді көшіруге мүмкіндік береді, бұл өз кезегінде жүйеге бұзылулардан кейін деректерді қалпына келтіру кезінде эффективті жұмыс істеуге мүмкіндік бере отырып, өшірілген көшіруге шығынды азайтады

Жаңа функциялардың арқасында жүйе VMware® орталарында сәтті қолданылуы мүмкін, ол жерде  деректер виртуалды серверлерден консолидацияланады, ал олардың көшірмесін дистонционды орналастыру керек. Энергия сақтайтын дискілік жинақтауыштарды және қол жеткізу функцияларын қолдау.

Системы серии CLARiiON CX3 UltraScale сериялы жүйелер жаңа дискілік жинақтауыштарды SATA II 750 Гб қолдайды, бұл энергияны  33% эффективті қолдануға және шығындарды одан сайын азайтуға мүмкіндік береді.  EMC сондай-ақ RAID 6 қолдайды және осы арқылы клиенттерге қорғаныстың жаңа нұсқасын береді.  Сонымен қатар,  FLARE соңғы версиясы қиындатылған функцияларға бұзудан кейін активті қалпына келтіруге арналған  ALUA стандартын қолдайды. «Ыстық» резервтеудің бар проактивті мүмкіндіктерімен қосылып,бұл жаңа функциялар  В сочетании с имеющимися проактивными возможностями "горячего" резервирования эти новые функции позволяют системе хранения среднего уровня CLARiiON CX3 орта деңгейлі сақтау жүйесіне тұрақтылық стандартына одан сайын жақындауға мүмкіндік береді. «Бес тоғыздық» немесе  99,999%  тоқтаусыз жұмыс жасау уақыты.

Кори Оуэнс (Corey Owens), по сетевым операциям в компании Calamos компаниясының желілік операциялар бойынша вице-президенті былай дейді: " Біздің клиенттермен  және әріптестермен эффективті жұмыс істеу үшін біздің ақпараттық инфрақұрылымымыз әрқашан дайын жағдайда болуы керек.  EMC бізге динамикалық, тез өзгеретін ортада жұмыс істеуге дайын  иілгіш аппаратты және бағдарламалық қамтаманы бере отырып, осы тапсырманы шешуге көмектеседі. EMC CLARiiON үшін арналған жаңа операциялық орта    FLARE  бірнеше жаңа функцияны көрсетті, электроэнергияға және суытуға шығынды азайтатын біздің деректерге қол жеткізуді және қауіпсіздікті қамтамасыз ететін қол жеткізу мен қорғанысты бақылау секілді. Сонымен қатар, IP-адресті көшіру функциясы Calamos компаниясына бизнес-процестердің үзіліссіздігінің қатал жоспарын ұстануға көмектеседі".

Майк Карп (Mike Karp), Enterprises Management Associates компаниясында  сақтау бойынша жоғарғы аналитик, ойлайды: " Ақпараттың қауіпсіздігі және қорғанысы кез-келген өлшемді ұйымдасытру үшін маңызды тапсырма олып табылады. Қауіпсіздікті,қорғанысты жоғарылата отырып және оптикалық каналдар бойынша және  iSCSI бойынша қызметтерді ұсына отырып, корпорация EMC корпорациясы орта және корпоративті деңгейлі қолданушыларға өздерінің деректерін қорғауға және деректерді сақтауға арналған құралдарға жасаған салымдарынан пайда табуға көмектеседі".

Дэвид Донателли (David Donatelli), ақпаратты сақтауға арналған шешімдер бойынша атқарушы вицепрезидент жалғастырады:  "Бұл жаңа функциялар қолданушылардың өздерінің ақпараттық инфрақұрылымдарына қауіпзідікті қамтамасыз ету мүмкіндігін  айтарлықтай жоғарлатады. Бар клиенттер үшін жүйеде үзіліссіз оңай жаңартуды ұсынамыз, ал біздің техникалық қолдауы қызметін қолданатын компаниялар бұл функцияларды тегін алады. Орта деңгейлі ешқандай басқа платформа  жүз пайызды тұрақтылыққа, қорғаныс пен қауіпсіздіктің ең күшті мүмкіндіктеріне ие  EMC CLARiiON жүйесі секілді жоғары нәтижелерді және қолданылуда оңай және экономды болып табылмайды".

Құрылым туралы, қатты дискінің кестесінің есептеуі туралы ойлауға тура келмейді. Біз  Как правило, не приходится задумываться о структуре, а тем более о расчете таблицы разделов жесткого диска. Мы привыкли полагаться на Fdisk, PQMAGIC-қа және сол сеілді бағдарламаларға  сенуге үйреніп қалғанбыз. Мысалы,  BIOS-ты 8-Гбайт қатты дискі  қолдайтын, ал сіз көлемі 10 Гбайттық сатып алдыңыз немесе  оның физикалық қабаты қатты жарақатталған жағдайлар болады, сол кезде сізге мүмкін «қолмен» бөлімдерді құруға және есептеуге тура келуі мүмкін.  Дискінің бөлімдерінің кестелерін жылжыту кезінде де осындай жағдайлар болуы мүмкін. 

Жоғарыда айтылған барлық жағдайларда бөлімдер кестесінің құрылымын және оларды бөлуді білу керек. 

Құрылымдар

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

meddata struc ; Аты meddata болатын құрылым
index dd 0 ; карат номері
sex db 0 ; Полы
birth dw 0 ; Туған жылы
datein db ' / / ' ;Түскен уақыты
dateout db ' / / ' ;Шығатын уақыты
meddata ends ; құрылымды сипаттаудың соңы

Құрылымды сипаттауды бағдарламаның кез-келегн жеріне орналастыруға болады, бірақ нақты құрылымдық айнымалыларды сипаттағанға дейін. Транслятор құрылым сипаттамасымен кездесіп оның мәтінін трансляцияламайды, яғни жадыда  орын бөлмейді, оларды кейін осы құрылым типінің айнымалылары кездескен кезде оны қолдану үшін еске сақтайды. Деректер сегментінде алдын сипатталған құрылымның құрамына сәйкес кеоетін айнымалылардың қандай да бір санын оған ат қойып беруге болады. Бұл айнымалыларды оларды хабарлау кезінде нақты деректермен (алдында сипатталған құрылымға сәйкес) толтыруға болады, бірақ нақты деректерді көрсетпеуге де болады, егер бұл айнымалыны оны хабарлаған кезде емес бағдарламаның орындалуы барысында инициялизациялайтын болса.  Соңғы жағдайда транслятор айнымалының астына жадыдан орын бөледі (біздің мысалда 23 байт), оны құрылымды сипаттау кезінде көрсетілген нақты ақпаратпен толтырады: 

data segment
pat 1 meddata <1234567, 'м',1955, 1З/06/981, '15/06/98'>
pat2 meddata <1982234, 'м',1932, '18/06/98', '25/06/98 '>
pat3 meddata <4389012, 'ж',1966, '01/12/97', '15/12/97'>
pattemp meddata <>
data ends

patl, pat2 и т.б. аттар айнымалылардың аттар болып қызмет етеді, олардың әрқайсысы бір емделуші туралы толық деректерден тұрады.  Бұрыштық жақшалар әрбір құрылымдық айнымалға түсетін нақты деректерді шектейді. Аты Для переменной с именем pattemp айнымалысы үшін транслятор жадыдан 23 байт орын бөледі, оған құрылымда сипатталғанның барлығын орналастырады (нольдер және уақытқа арналған екі символды  шаблондар):  

0,0,0, ' / / ',' / / '

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

mov EAX,patl.index ;ЕАХ=1234567
mov SI,offset patl.datein ;31= patl.datein элементінің жылжуы
mov DL,pat3.sex ;DL='ж'

DOS қосымшаларында 32-разрядты регистрлерді (ЕАХ келтірілген үзіндінің бірінші қатарында) қолданудың ерекшеліктері 4 бөлімде сипатталатын болады.   Нақты құрылымдық айнымалының адресін базалық немесе индекстік регистрге орнтуға болады және жанама адресациясы бар конструкцияларда қолдануға болады:

mov BX,offset pat3 ;ВХ=жылжу pat3
mov EAX,[BX].index ;EAX=4389012
mov [BX].sех='м' ;Бағдарламалық инициялизация
Құрылым элементтерінің аттары құрылымның басынан осы элементтерге жылжулар болып табылады. Кейбір жағдайларда оларды осы ретте нүктесіз қолдануға болады:

mov BX, off set pat2 ;ВХ=жылжу pat2
add BX,sex ;ВХ=жылжу pat2.sex
mov DL, [BX] ;DL='M'
mov SI,birth ;SI=5 (күмәнді команда)

Жазбалар

Жазбалар құрылымдар секілді деректердің бөлек элеметтерін қолайлы мнеманикалық белгілеулерді енгізу мақсатында нақты деректерге қойылатын шаблондардан тұрады. Байттарға,сөздерге,екілік сөздерге немесе бүтін массивтерге ат беретін құрылымдарға қарағанда жазбаларда байттардың,сөздердің немесе екілік сөздердің ішіндегі биттер қатары анықталады. Файлдың құрылған уақтысы диск каталогында 16-биттік сөз түрінде сақталатыны белгілі, онда үлкен 7 бит жылды, келесі 4 бит – айды және соңғы 5 бит – күнді білдіреді (сурет 1). 

Сурет 1. Диск каталогына уақытты жазу форматын

 

Бұл деректерді бағдарламада келесі түрде анықталатын  filedate жазбасы арқылы спецификациялауға болады:

fdate record year:7, month: 4, day:5

record кілттік сөзі  fdate жазбаға жататындығын, ал year, month және day мнемоникалық белгілеуі сипатталып жатқанның бөлек биттік өрістерінің аты болып табылады. Бағдарламаға биттік өрістердің шаблонын сипаттауды қосу деректерді «қолмен» анықтау жұмысын жояды. Жоғарыдағы келтірілген жазбаға нақты айнымалыларды хабарлау келесі түрде болады:   

filel fdate <5,6,7> ;7 маусым 1985г.
file2 fdate <18,12,30> ;30 желтоқсан 1998г.
file3 fdate <> ;"Бос" (әзірше) айнымалы

 filel  айнымалысы 0AC7h саны ретінде анықталады, file2 - 259Eh ретінде, ал fileЗ -  0000h ретінде анықталады. Fdate типті айнымалыны бағдарламалық толтыру  керек болған жағдайда ассемблермен сөздің төменгі соңынан  саналатын биттік өрістерге сәйкес келетін индекстер ретінде  түсіндірілетін оны құраушылар аттарын қолдануға болады.  Келтірілген мысал үшін  day=0, month=5, aл year=9. Алайда  МП 86 командалар жүйесінде   биттік өріспен жұмыс істейтін құралдар жоқтың қасы. Сол себепті бағдарламалық толтыруды жылжулар командасымен және логикалық пқосумен орындауға тура келеді:

mov flle3,30 ;Күнді орналастырамыз
mov AX,12 ;Айды әзірше АХ
mov CL,month ; month битке жылжытамыз
shl AX,CL ; АХ-тегі айды  5 битке жылыттық
or file3,AX ;ай биттерін file3 –ке қостық
mov AX, 18 ;Жылды әзірще  АХ
mov CL,month ; year битке жылжытамыз
shl AX,CL ; АХ-тегі жылды  9 битке жылжыттық
or file3,AX ;Жыл биттерін file3-ке қостық

Нәтижесінде fileЗ айнымалысында file2 айнымалысындағы жыл 259Eh болады.

 

24.  Ішкі каталогты құрылуы/өшірілуі. Файлдарға соңғы қол жеткізудің уақытын алу/орнату. Енгізу/шығару. Соңғы портқа қол жеткізу.

 

Бөлімдер кестесі

Қатты дискінің бірінші секторында оның жүктелу бағдарламасы және бөлімдерге бөлу туралы деректері сақталады. Бұл барлық ақпарат MBR (Master Boot Record) —  басты жүктелетін жазба деп аталады  ( кейбір дерек көздерінде MBR-ге осы секторда сақталатын орындалатын кодты жатқызады). Бөлімді логикалық дисктер үшін контейнер қызметін атқаратын физикалық  дискінің бөлігі ретінде анықтайды. Бөлімдердің екі түрі бар: негізгі және кеңейтілген. Біріншісі бір логикалық дискіні «сидырады», дұрстап айтқанда өзі сондай болып табылады. Ал екіншісі (кеңейтілген) шынында да логикалық дискілердің контейнері қызметін атқарады. (Логикалық диск дегенде ОЖ-мен аты бар жинақтағыш ретінде танылатын физикалық дисктің қандай да бір аймағын түсінеміз).

MBR секторы,бөлімдер кестесінен тұратын басқалар секілді Uk(55 AA) сигнатурасымен аяқталады. ( DOS жүктеуіш секторы  осы сигнатурамен аяқталуы керек).  ДК тоқ көзіне қосқнада немесе оның жүктелуі кезінде BIOS дәл осы секторды жадыға жүктейді және онда сақталған бағдарлмааны орындалуға жібереді – алайда кейде бұл өкінішке орай вирус та болады.

Физикалық дискінің бірінші секторы (цилиндр — 0, басы — 0, сектор — 1) — ең маңызды. Егер ол қандай да бір себептерге байланысты жарақатталған болса, онда дискіні лақтырып тастау керек.

Бізді бөлімдер кестесі қызықтырады (кесте 1 және 3).

Ол жүктегіш сектордың 1BEh (446) жылжуынан басталады, 64 байтты алады және төрт 16-байт жазбалардың кезектілігінен тұрады. Әрбір 16 байт бір бөлімді сипаттайды, бұл соңғылрдың санына шектеу қояды: олар төрттен көп бола алмайды. Бірақ логикалық дикілердің санына шектеу кеңейтілген бөлімді қолданумен алынады.

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

Кесте 3 –те MBR-де  FAT 16 файлдық жүйесінің бөлімдері бар 3,2-Гбайт диск үшін жазылған бөлімдер кестесінің мысалы көрсетілген.

Кесте 2 және кесте 3 элементтері байланысқан, бұл байланысты келесі тізбек көрсетеді: 1->2; 2->3; 3->4,5; 4->1; 5->6; 6->7,8; 7->9; 8->10. Бұл жерде сол жақтағы мән – кесте 2 қатар номері, оң жақтағы мән – кесте 3 баған номері.

Егер бөлімдерде   FAT 32 файлдық жүйесі орнатылған болса,онда кесте 3-те 1-бағанның мәтіндік мәні  , то в табл. 3 текстовое значение 1-го столбца в зависимости от версии программы DiskEdit бағдарламасының версиясына байланысты келесілердің бірі болуы мүмкін: FAT 32, FAT 32x, BIGDOSx, EXTENDx.

Негізгі бөлімнің 4, 3, 5-бағандардың мәні жүктегіш секторға көрсетуі керек, бірақ логикалық дискінің (оны сондай-ақ  DOS-сектором).

3-ден 8-ге дейінгі бағандардың мәндерін біз өзіміз таңдаймыз және осымен біз логикалық дискінің(бөлімнің) басын және аяғын береміз. Алайда 9 және 10-бағандардағы деректерді келесі формуламен анықтау керек:

  H —цилиндрдегі бастардың саны (оның кормпусында көрсетіледі);

S —  жолақшадағы секторлар саны (ол да корпуста көрсетіледі);әдетте S = 63;

C, Nhead , Nsect. — сектор координаталары.

Бұл формула  Cstart , Nhead start , Nsect. start и Cend , Nhead end , Nsect. End параметрлері бар секторлар арасындағы секторлар санын анықтауға мүмкіндік береді. DOS-жүктегіштің MBR-ден жылжуын есептеуде келесі мәндер қолданылады:: Cstart = 0, Nhead start = 0, Nsect. start = 1, бұл дисктің 1-секторының координаталарына сәйкес келеді (0,0,1). Cend , Nhead end , Nsect. End координаттары логикалық дискінің 1-секторына жауап береді,  Nsect. End көбінесе бірге тең. Бұл координаталар  кесте 3-тің 4,3,5-бағандарынан алынады. Осылайша

 H және S қатты дискінің физикалық сипаттамаларымен анықталады.

Формула 2  справедлива только для расчета смещения начала логического диска (раздела) относительно сектора MBR секторына қатысты логикалық дискінің (бөлімнің) басын жылжытуды есептеу үшін қолайлы, ал басқа жағдайларда формула 1 қолданған дұрыс.  Әдетте Cstart , Nhead start және Nsect. start — бөлімдер кестесінен тұратын сектор координаталары. Cstart , Nsect. Start мәндері 4 және 5-бағандардың мәндеріне, ал Nhead start мәні кесте 3-тің 3-бағанынан бірге аз алынады.

Бөлімнің (логикалық дискінің) өлшемі былай анықталады:

Cend , Nhead end , Nsect. end мәндері кесте 3-тің  7, 6, 8-бағандарынан алынады. Айта кету керек, формула 2 мен 3 Cend , Nhead end , Nsect. end параметрлері әр түрлі бағандардан алынады.

DS және DL үшін алынған мәндер 9 және 10-бағандарға енгізіледі.

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

Бөлімдер кестесін есепттеу мысалы

C = 621, H = 64, S = 63 физикалық сипаттамалары бар қатты диск бар деп есептейік және оның жүктелетін секторы (0,0,1) жарақатталмаған.  1-цилиндрден 250-ге дейін және 516-дан 525-ке дейінгі интервалдарда көптеген жарақаттар бар. Fdisk бағдарламасы бұл дискіні жөндей алмайды.

Біздің мақсатымыз — бөлімдерді қолмен ұйымдастыру. Жұмыс үшін егер екінші диск болмаса дискетаны алайық. Қандай да бір жерден MBR аламыз — бұл DiskEdit бағдарламасының көмегімен орындалады (жұмыс дискісінің физикалық секторын (0,0,1) файлға жазамыз). Содан кейін тағы да DiskEdit бағдарламасын қолданып, алынған файлды Master Boot Records-тан біздің қатты дискіміздегі секторға (0,0,1) жазамыз.  Енді біздің тапсырмаға сәйкес бөлімдер кестесін түзету керек (тағы да DiskEdit көмегімен) – кестенің 1-ден 10-бағанға дейін біздің дискінің мәндіпрімен толтырамыз.

Жүйені таңдаймыз: бұл BIGDOS —  FAT 16 бөлімі болсын.

Жүктелу белгісін анықаймыз – 2-бағанға «Да/Yes» қоямыз.

Біздің бөлімнің/дискінің басын орнатамыз – 3-ден 5-ке дейінгі бағандарды 1,254 және 1 мәндерімен толтырамыз. Бөлімнің/дискінің соңын енгіземіз: 6-дан 8-ге дейінгі бағандарды 63,512,63 мәндерімен толтырамыз.

Жарақатталған аймақтардан алдын және кейн бір аралық береміз. 9-баған үшін мәнді формула 2 бойынша есептейміз:

Cend және Nhead end 4 және 3 бағандардан аламыз,яғни  Cend = 254, Nhead end = 1, ал H = 64, S = 63. Осылайша,

10-бағанның мәні формула 3 бойынша есептеледі:

 Бұл жерде H және S өзгермейді, ал Cend, Nhead end, Nsect. end  7, 6 және 8-бағандардан алынған.

Басқа бөлімдерді құрды жобаламағандықтан, басқа қатарлардың барлығын нольдермен толтырамыз. Қорытынды кестені аламыз.

Ішкі каталогты құру/өшіру

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

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

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

Жоғарғы деңгей

Бейсик MKDIR (каталог құр) және RMDIR (каталогты өшір) командаларын береді. Екеуінен декейін жинақтарының атымен және 63 симғолға дейін тұратын каталогты көрсету стандартты жолдары келуі керек. Жол тырнақшаға алынуы керек. BIRDS ішкі каталогының аты STORKS болатын ішкі каталог қосу үшін MKDIR "B:MAMMALS\BIRDS\STORKS" жазыңыз. Осы команданың орындалуынан кейін ішкі каталог ретінде қолданылатын STORKS файлы құрылады және оның бар екендігі туралы факт BIRDS ішкі каталогында аты STORKS болатын элементті құру кезінде көрінеді. Бұл ішкі каталогты өшіру үшін оның ішінен алумен барлық файлдарды өшіру керек [5.3.2]. Содан кейін    RMDIR "B:MAMMALS\BIRDS\STORKS" командасын қолдану керек.

Бұл мысалдарда сіздің ағымдық каталогыңыз түпкі каталог болады деп ойластырылған. Алайда,егер сіздің ағымдық каталогыңыз операция орындалып жатқан ішкі каталогтың жолында болса, онда барлық жолды көрсетудің қажеті жоқ. Сол себепті егер сіздің ағымдық каталогыңыз BIRDS болса, онда STORKS    ішкі каталогын құру немесе өшіру үшін     MKDIR "\STORKS" немесе RMDIR "\STORKS" командасын қолдануға болады.

Орташа деңгей.

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

Ішкі каталогты құру:

DS:DX жинақтағышты және ішкі каталог құрылуы тиіс каталогқа апаратын жолды беретін қатарға көрсетуі керек. Қатар  ASCII 0 байтпен аяқталуы керек. A: жинақтауыштың түпкі каталогында аты  PRIMATES болатын ішкі каталгты ашу үшін қатарды "A:\PRIMATES" түрде жазу керек. Ішкі каталогты аты  MAMMALS болатын басқа ішкі каталогта ашу үшін "A:\MAMMALS\PRIMATES  жазыңыз. А: жинақтауыш аты түсірілуі мүмкін,егер сіз үнсіздікте қолданылатын жинақтауышпен жұмыс істесеңіз және жол жол ағымдық каталогтан басталса. AH 39H-ты орнатып, 21H үзілуін орындаңыз;егер дұрыс жол көрсетілсе, жаңа каталог құрылады. Басқа жағдайда, тасымалдау жалаушасы орнатылады, ол AX 3 (жол дұрыс емес) немесе 5 (қол жеткізуге болмайды) қате кодынан тұрады.Мысалда  PRIMATES ішкі каталогы құрылады:

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

PATH    DB   'A:MAMMALS\PRIMATES',0

;--- PRIMATES атымен ішкі каталог құрамыз

   LEA  DX,PATH     ;DS:DX жолға көрсетуі керек

   MOV  AH,39H      ;функция номері

   INT  21H         ;ішкі каталог құрамыз

   JC   ERROR_ROUT  ;қателерді өңдеу

Ішкі каталогты өшіру:

Ішкі каталогты өшіру үшін сіз каталогты құруда көрсеткен қатарға сәйкес келетін қатар құру керек. Содан кейін AH 3AH орналастырып, 21H үзілуін орындаңыз. Функцияның орындалмаған жағдайында  AX-қа  3 немесе 5 (5 коды каталогтың бос еместігін көрсетуі мүмкін) кодтары қайтарылады.

 

25. Деректерді алмасу командалары. Бағдарламалауда 32-разрядты процессорлар құралдарын қолдану

 

Деректерді бір рет алмасу (SWP)

 

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

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

 

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

Алмасу адресі базалық регистр (Rn) мазмұнымен анықталады. Команданың орындалуының басында процессор осы адресті шегереді, сосын осы адреске көздік-регистр (Rm) мазмұнын жазады, оның адресі қабылдаушы-регистрде (Rd) анықталады. Одан басқа, сол және басқа да регистрлер біруақытта көздік-регистр мен қабылдаушы-регистрдің ролін орындай алады.

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

Байттар мен сөздер

Осы кластың командасы ARM7TDMI регистрлері мен жады арасындағы байттар (B=1) және сөздер (B=0) алмасу үшін қолданылуы мүмкін. SWP командасы нақты түрде LDR және STR командаларының тізбегінен тұрады, олардың әрекеттері деректерді бір рет жіберу әректеін қарастырады. Осымен конфигурация типіне бағыныштылық сақталынады: Little Endian немесе Endian.

Базалық регистр ретінде R15 қолдану

SWP командасында операнд (Rd, Rn және Rs) ретінде R15 регистрін қолдану.

Бағдарламалауда 32-разрядты процессорлардың құралдарын қолдану

Алдын атап өтілгендей, шындық режиміндегі 16-разрядты бағдарламаны өңдеу кезінде, MS-DOS операциялық жүйесін басқару бойынша орындауға арналған, 32-разрядты процессорлар мүмкіндіктерін қолдануға болады. Шындық режимде қолдануға болады:
32-разрядтық операндтарды; қосымша командаларды және МП 86 командасының кеңейтілген мүмкіндіктерін; адресацияның қосымша режимдерін; деректерді адресациялау үшін екі регистрдің орнына төрт сегменттік регистрді. Транслятор осы құралдарды тануы үшін бағдарламаны .586 (немесе, 486 немесе .386) директивасынан бастау қажет және осымен командалар мен деректер сегменті үшін use 16 сипаттаушысын көрсету қажет, бағдарлама 16-разрядты болып қалуы үшін. Есте сақтау керек, шындық режиміндегі бағдарламада 32-разрядты процессорлардың қосымша құралдарын пайдалану мүмкіндіктері тартымды көрінуі мүмкін, бірақ шынында шектеулі болады. Жаңа командалар көп емес, және принциптік сипаттамалары жоқ; 32-разрядты деректер қолданбалы бағдарламаларда салыстырмалы түрде сирек қолданылады (егер есептеуіш бағдарламаларды санамағанда, шынында да сандар кездесетін, мұндай бағдарламаларды ассемблер тілінде сирек жазады); адресацияның кеңейтілген мүмкіншіліктері толық өлшемде тек қана 32-разрядты бағдарламаларда болады, DOS-та жұмыс істемейтін. Әйткенмен, кейбір жағдайларда 32-разрядты процессор құралдарын тарту пайдалы болуы мүмкін және 16-разрядты бағдарламаларда да, біз олардың қолданылуының бірнеше мысалын келтіреміз.
DOS және BIOS жүйелік деректері арасында мынадай деректер бар, өзінің орналасуына 2 сөз қажет ететін. Ондай деректерге сонымен қатар, жүйелік уақытта жатады, 46Ch абсолютті адресі арқылы 4-байттық ұяшықта толтырылатын. Жоғарыда, 3.5 бөлімде ағымдық уақыттағы санаушының жүйелік процедурасы сипатталынған. Компьютердің бастапқы жүктелуі процесінде 46Ch адресті ұяшыққа шындық уақыт сағатынан уақыт тасымалданады, тәулік басынан ағыр өтетін, сосын осы ұяшықтағылар жүйелік таймерден әрбір үзіліс кезінде 1-ге ұлғайып отырады, векторға қосылған. 46Ch ұяшығын оқу ағымдағы уақытты 1/18 секундта таяу қателікпен анықтайды, ол уақыттың аралығын нақты түрде өлшеуге мүмкіндік береді. Жүйелік уақыты бар арифметикалық әрекеттер кеңейтілген 32-разрядты регистрлерде ыңғайлы орындалады. Бағдарламаны қарастырайық, қажетті уақытша аралықты орнатуға және оның аяқталуын кейбір бейнелермен өтеуге мүмкіндік беретін. Сондықтан MS-DOS біртапсырмалы жүйе болып табылады, параллельді проецстерді ұйымдастырудың ең бір тәсілі – бағдарламаны орындау және уақытша аралықтың аяталуын күту – үзілу механизмін қолдану болып табылады. Біздің жағдайда бағдарламада жүйелік таймерден үзілуді өңдеуші кездеседі, ол секундына 18 рет жүйелік уақытты оқиды және оның мәнін талдын берілген өлшеммен салыстырады. Теңдік жағдайына жеткенде үзілуді өңдеуші осы оқиғаны өзі өңдейді немесе уақытша аралық жалаушасын орнатады, негізгі бағдарламада периодты түрде тестіленетін. Бірінші нұсқа үлкен нақтылығымен уақытша аралықты өлшеуге мүмкіндік береді, бірақ екіншісі үлкен мүмкіндіктер ұсынады, мұнда үзілу өңдеушісінде DOS функцияларына байланыс жасауға болмайды, ал негізгі бағдарлама барлығын жасауы мүмкін, не ойласа да.

Төменде келтірілген мысал.СОМ типті бағдарлама түрінде. Бағдарламаның мұндай ұйымдастырылуы үзілуді өңдеушіні оңайлатады және оны жазуды жеңілдетеді. Процессор аппараттық үзілу бойынша үзілуді өңдеушіге өте отырып, тек қана  CS:IP рнегистрлерін модификациялайды (мәндерімен, үзілу векторынан алынған). Қалған регистрдің барлығы, соның қатарында сегменттіктер де бар, өздері үзілу сәтінде ие болған мәндерді сақтайды. Сол мәндер қажет болуы мүмкін, әсіресе, негізгі бағдарлама DOS функціияларын шақырар кезінде. Сондықтан, үзілу өңдеушісінде деректерге байланыс жасау керек болса, негізгі бағдарламада сақталынатын, қандай да бір сегменттік регистрлерден (мысалы, DS немесе ES) негізгі бағдарламаның сегменттік адреске деректер сегментін құру керек. Егер бағдарлама.СОМ форматында жазылса, онда оның деректер өрісі тура сол (жалғыз) сегментке кіреді, командалар орналасқан, деректерге байланыс жасау үшін CS регистрлерін қолдануға болады, өңдеушіні шақыру кезінде оны процессор жөндеп қояды.

; Мысал 1. Жүйелік уақытты оқу және салыстыру
;таймерден үзілу бойынша
.586 ;32-разрядты операндтар болады
assume CS : code, DS:code
code segment use16 ;16-разрядтық қосымша
org 100h ;Формат .COM
main proc
;Көздік векторды сақтаймыз
mov AX,3508h
int 21h
mov word ptr old_08,BX
mov word ptr old_08+2,ES
;Біздің өңдеушіні орнатамыз
mov AX,2508h
mov DX,offset new_08
int 21h
;Жүйелік уақытты оқимыз, қажетті аралықты қосамыз
;және жадының екісөзді ұяшығында сақтаймыз
mov AX,40h ;ES баптауы
mov ES,AX ; BIOS деректер облысындағы
mov EAX, ES : 6Ch ;Жүйелік уақытты аламыз
add EAX,time_int ;Аралықты қосамыз
mov time_end,EAX ;Жадыда сақатймыз
;Жалауша сұрауы бар бағдарламаның жұмыс циклының имитациясы
again: test flag,0FFh ;Жалау дайындығын тексеру
jnz ok ;Егер орнатылса, ОК
mov АН,02h ;Соңын күту
mov DL,'.' ;уақытша аралықтың
int 2 In ;экран нүктесіне шығарамыз
jmp again ;Және қайтадан жалауды тексеру
ok: mov АН,09h ;Аралық аяқталды.
mov DX,offset msg ;Орындаймыз, қалағанымызды
int 2 In
;Бағдарламаны аяқтаймыз, алғаш көздік векторды қайтара отырып
lds DX,old_08
mov AX,2508h
int 21h
mov AX,4C00h
int 21n
main endp
;Біздің жүұйелік таймерден үзілуді өңдеуші
new_08 proc
pushf ;Стеккке жалауды жазамыз
call CS:old_08 ;және жүйелік өңдеушіні шақырамыз
push EAX ;Қоданылатын
push ES ;регистрлерді сақтаймыз
mov AX,40h ; ES құрамыз
mov ES,AX ; BIOS деректер облысындағы
mov EAX,ES:6Ch;Ағымдық уақытты оқимыз
cmp EAX,CS:time_end ;Есептелінгендермен салыстырамыз
jb ex ;Егер кем болса, шығамыз
inc CS:flag ;Аралық таусылды, жалауды орнатамыз
ex: mov AL,20h ;Үзілудің соңы командасы
out 20h,AL ;үзілу контроллерінде
pop ES ;Қайтарамыз
pop EAX ;сақталынған регистрлерді
iret ;Өңдеушіден шығу
new_08 endp
;Бағдарламаның деректер өрісі
old_08 dd 0 ;Көздік векторды сақтау үшін
time_int dd 18*2 ;Қажетті аралық (~2с)
time_end dd 0 ;Аралықтың таусылу сәті
flag db 0 ;Аралықтың таусылу жалауы
msg db "Уақыт өтті !$' ;Ақпараттық хабарлама
code ends
end main

Қарастырылып жатқан  мысалда  өңдеушіні  орнату  қарапайым түрде орындалады. Себебі DS регистрін мәліметтер сегментіне баптаудың қажеттігі жоқ. Ол бағдарламаның  жалғыз сегментіне бапталып қойылған.  Өңдеушіні  орнатып,  бағдарлама ES  регистрін BIOS мәліметтер аумағына баптайды және add командасы арқылы 46Ch адресті  ұяшықтан ағымдағы жүйе уақытын  есептейді. Оған time_int ұяшығында  берілген интервал  қосылады және  нәтижесі timc_cnd  ұяшығында  сақталады. Өңдеушіні  орнату  бойынша іс әрекеттер аяқталды, енді бағдарлама оған жоспарланып қойылған  іс-әрекеттерді  орындауға кірісуге болады. Берілген мысалдағы  бағдарлама циклда нүкте символдарын экранға шығару DOS 02h функциясын  шақырады; ал шын мәнісінде ол мысалы, кейбір мәліметтерді экранға шығару және өңдеу жұмыстарын орындай алады. Циклдің  әрбір қадамында  берілген уақытша интервалының бітуі  бойынша үзілістерді өңдеушімен орнатылған flag  уақытша интервалының бітуінің жалауын тестілеу болып жатады. Жалау  алып тасталғанда цикл жалғасып  жатады. Жалау  орнатылып  болған кезде бағдарлама осы оқиғаны өңдеуге кіріседі. Қарастырып  жатқан  мысалда ақпараттық хабарламаны экранға шығару және 8  векторының бастапқы құрамындағыларды міндетті түрде қайта қалпына келтіру бойынша бағдарламаны аяқтау. new_08 үзілістерді  өңдеушісі ең алдымен, адресі old_08 ұяшығында  сақталған, бастапқы өңдеушіні шақыруды орындайды. 8 векторына біздің өңдеушінің қосылуы жүйелік сағаттардың жүрісін бұзбау керек. Сондықтан бұл  жағдайда  өңдеушілердің бірігуі қажетті. Жүйелік  өңдеушіден қайтқаннан кейін пайдаланатын регистрлердің  сақталуы  BIOS мәліметтер аумағына ES регистрін баптау,  ағымдағы уақытты оқу және оны  time_end ұяшығында  жазумен  салыстыру орындалады. Ағымдағы  уақыт  берілгендегіден аз болғанда, алдын ала сақталған регистрлерді қалпына келтіріп, үзіліс контроллеріне EOI үзілісті аяқтау командасына жіберіп, өңдеуші iret командасымен  аяқталады. Егер берілген уақыт  интервалы өтсе, және де ағымдағы уақыт time_end  ұяшығындағы мәнге тең болса, негізгі бағдарламада осы оқиғаға жоспарланып қойған іс әрекеттерді көрсетіп, өзінің жұмысы аяқталуы алдында flag жалауын орнатады. Егер мұндай іс әрекеттер компьютерге қосылған аппаратураны қосу/өшіру болатын болса, мұны өңдеушінің өзінде жасауға болады. Мұндай  жағдайда flag жалауы керек емес және негізгі бағдарламаның  іс-әрекеттері және үзіліс өңдеушісі өз еркімен және параллельді өтеді. Қарастырылған  бағдарламаны, flag жалауы берілген интервал өткеннен кейін емес, берілген күнтізбелік уақытта орнатылатындай етіп  жасауға болады.  Бұл  есеп бізге 32-разрядты операндтарға жасалатын арифметикалық операцияларды орындалу әдістерін көрсетуге мүмкіндік береді. 2 мысал алдыңғысынан уақытты есептеу алгоритмін өзгертумен және қызметті мәліметтер өрісімен  ерекшеленеді. Үзіліс өңдеушісін, жалауды орнатудың циклін және үзілістің өзін өңдеушіні орнату процедуралары 1 мысалмен  сәйкес  келеді.  46Ch ұяшығымен жұмысы кезінде жүйемен қолданылатын, сол бірліктегі керек уақыт мәнін алу үшін, ең алдымен күн басталғаннан уақытты секундтап есептеу керек, кейін таймер тактысында уақытты   алу үшін сол шаманы 18,2065  көбейту  керек. Арифметикалық сопроцессорды қолданбау үшін, 32-битті бүтін санда қалу үшін,  18.2065 санына көбейту келесі формула бойынша орындалады:

Такты = t*18 + t/5 + t/154

4-2 мысалын машинада  қатеге тексеру кезінде берілген уақыт ағымдағы уақыттан машиналық сағатпен көбірек болу керектігін бақылап отыру қажет. Әйтпесе, бағдарлама жалаудың орнатылуын күтіп отырады.  <Ctrl>/<C> пернелерін басу арқылы аяқтау, жүйенің  дұрыс жұмыс істемеуіне әкеледі, ал бұл жағдайда бағдарламамен алып қалған вектордың  бастапқы құрамдарындағылардың қайта қалпына келтіру қатары орындалмай қалады. Жүйемен қолданылатын, қандай да бір үзілісті  өңдеушілері  бар бағдарламаларда жұмыстарының дұрыс аяқталуы үшін <Ctrl>/<C> басуды өңдеу құралдарын  қарастыру қажет.

;Пример 2. Берілген уақытты  күту
; таймер  үзілісі  бойынша
.586
assume CS:code,DS:code
code segment use16
org 100h
main proc
;Бастапқы векторды сақтау
...
; Біздің өңдеушіні орнатамыз
...
; Талап етілетін күнтізбелік уақытты санға айналдырамыз
; 55 мс интервалы бойынша
mov EAX,hour ;  Сағатты алайық
mov EBX,3600 ; коэффициентті секундқа айналдыру
mul EBX ;  EDX:EAX –гі сағатты секундқа айналдырамыз
mov temp,EAX ; temp-ке сағатты сақтайық
mov EAX,min ; минутын алайын
mov EBX,60 ; секундқа айналдыру коэффициенті
mul EBX ; EDX:EAX-та минутты секундқа айналдырамыз
add temp,EAX ; temp-ке минутты қосамыз
mov EAX,sec ; секундты алайық.
add temp,EAX ; temp-ке секундты қосайық
mov EAX,temp ; Секунд  саны
mov EBX,18 ;  18 көбейтеміз
mul EBX ;18 көбейтеміз
mov time,EAX ;time-ке сақтаймыз
xor EDX,EDX ; бөлінуге дайындаламыз
mov EAX,temp ; Секунд санын бөлеміз
mov EBX,5 ; 5-ке  бөлеміз
div EBX ; бөлеміз
add time,EAX ; time-ға қосамыз
xor EDX,EDX ; бөлуге дайындаламыз
mov EAX,temp ; Секунд санын бөлеміз
mov EBX,154 ; 154 –ке бөлеміз
div EBX ; бөлейік
add time,EAX ;time –ға қосамыз
; жалауды сұрау арқылы бағдарламаның  жұмыс циклін имитация жасау
...
; бастапқы векторды қалпына келтіріп, бағдарламаны аяқтау
...
main endp
new_08 proc
...
new_08 endp
old_08 dd 0
hour dd 13 ;сағат
min dd 45 ;Минуттар
sec dd 0 ;Секундтар
time dd 0 ; таймер тактысындағы есептелінген уақыт
temp dd 0 ; аралық нәтиже  ұяшығы
flag db 0 ; берілген уақытқа жалауы
msg db "Время наступило!$'
code ends
end main

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

xor EAX,EAX
mov AL,hour

Сағаттарды секундқа айналдыру үшін сағат санын 3600 көбейту. Екі  көбейтінділерде 16-разрядты регистрлерде сыйатын кішігірім сан болады. Бірақта нәтижесі  АХ  регистріне сйымайтын  82800 шамаға жетеді. Егер біз екі 16-разрядты  регистрлерін көбейтіндісін орындасақ, мысалы, АХ –ті ВХ-ке, онда (mul командаларын орындау ережесі бойынша) нәтижесі DX:AX регистрінің жұбында болатын еді, сөйтіп бізге осы екі санды  бірнеше ауыстыру және жылжыту операцияларына біріктіреді:

push AX ;  АХ уақытына сақтаймыз
mov AX,DX ;  өрнектің үлкен бөлігі
sal ЕАХ,1б ;  ЕАХ үлкен бөлігіне жылжытамыз
pop AX ; өрнектің кіші бөлігі

 

26. Деректерді алмасу командалары. Деректерді жәбері. Аламасу инициализациясының әдістері

 

Деректерді жіберу кезіндегі үзілу (data aborts)

Егер адрес, SWP командасында қолданылатын, жадыны басқару жүйесі үшін қол жеткізерлік болмаса, онда жады диспетчері басым жоғары қалып күйде ABORT сигналын орнату құралдарымен хабарлауы мүмкін. Бұл оқу циклы уақыты кезінде жүргізілуі мүмкін, жазу циклы уақытында да (немесе дереу екеуінде де), бұл жағдайда осындай шығарылып тастайтын қалып күйдің басқаруы өңдеушіге жіберіледі (Data Abort). Сонан соң, үзілудің себебі жарияланып, жойылғаннан кейін, үзілген команда қайтадан орындалуы мүмкін.

Машиналық тактілердің саны

SWP комиандасы 1S + 2N + 1I кезінде орындалады, мұндағы S, N және I машиналық тактілердің типіне байланысты.

Ассемблердегі синтаксис

<SWP>{cond}{B} Rd,Rm,[Rn]

мұндағы:{cond}: команданың орындалу шартының екісимволды мнемоникасы (6 кестені қараңыз);

{B}:  бар кезінде байттық жіберудің режимін анықтайды, жоқ кезінде – алмасудың сөздік режимін;

Rd,Rm,Rn: өрнек, жалпы қызметтің регистрлер номерін анықтайды.

SWP мысалдары     R0,R1,[R2]    ; R0-ге R2-дегі адрес бойынша сөзді жүктеу, және R2-де R1 сақтау.

SWPB    R2,R3,[R4]    ; R2-ге R4-тегі адрес бойынша байтты жүктеу,

                      ; және R4-те R3 кіші байтын сақтау.

SWPEQ   R0,R0,[R1]    ; Шарт бойынша сөзді алмасу, R1-дегі адрес бойынша анықталған         ; және R0 регистрінде кездесетін.

Командаларды сипаттау

Идентификациялық ақпарат

Идентификациялық ақапарт оқуға ғана арналған. Сұранысқа ЭЕМ деректер өрісіне 866 кодтауындағы символдар жолын шығарады. Жолдың ұзындығы қабылданған пакет ұзындығымен анықталады. 

ЭЕМ-нің қысқаша аталуы: "MK152"

ЭЕМ-нің толық аталуы: "Пернелік ЭВМ ЭЛЕКТРОНИКА МК-152"

Ішкі құрылған бағдарламаны соңғы модификациялау мерзімі: "ДДММГГ",

мұндағы ДД - күн;

ММ - ай;

ГГ - жыл.

 Бағдарлама версиясы және соңғы модификация мерзімі:"Версия X.XX  ДД.ММ.ГГ-ден",

мұндағы "X.XX" – ЭЕМ-нің ішкі құрылған версиясының номері.

Әзірлеуші-кәсіпорынның қысқаша аталуы: "SEMICO"

Әзірлеуші-кәсіпорынның толық аталуы:

"ООО ғылыми-өндірушілік кәсіпорын СЕМИКО, г.Новосибирск, Россия, www.semico.ru"

ДЕРЕКТЕРДІ АЛМАСУ ТӘСІЛДЕРІ         

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

Жадыға тікелей қол жеткізу

Жадыға тікелей қол жеткізу (DMA - Direct Memory Access) процессордың қатысуынсыз сыртқы құрылғылар мен жады арасындағы деректер алмасудың тәсілі болып табылады және көбінесе құрылғыларға арналған, оперативті жадымен үлкен блоктың деректерді алмасатын. Процессор DMA контроллерін инициализациялайды, және келесіде алмасу контроллер басшылығында орындалады. Егер алмасудың таңдалған режимі шинаның барлық өткізуші тәсілдерінің орнына ие бола алмаса, DMA амалы кезінде процессор жұмысын жалғастыруына болады. Алмасудың бұл типі келесіде қарастырылмайды, сондықтан оны жүйелерді өңдеуде тапсырмалар нұсқаларында қолдануға ұйғарылмайды.

Бағдарламалық-басқарушы енгізу-шығару

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

х86 процессорлары енгізу-шығарудың порты мен жадысының бөлек адресациясына ие және сәйкесінше енгізу-шығару не енгізу-шығарудың кеңістігінде бейнеленген, не оперативті жадының (memory-mapped I/O) кеңістігінде. Соңғы жағдайда жады адресі сыртқы құрылғыда декрдталады және енгізу-шығарудың орындалуы үшін жадыға байланысудың барлық командалары қолданылуы мүмкін.

Енгізу-шығару адрестік кеңістігінің әрбір адрестелінетін элементі енгізу опртымен, шығару портымен немесе енгізу-шығару портымен аталынады. Порттарға байланысу үшін процессордың төрт негізгі командасы бар: In (портқа енгізу), Out (порттан шығару), Ins (порттан жады жолының элементіне енгізу) және Outs (жады жолынан элементті шығару). Соңғы екі енгізу-шығарудың жолдық командалары порт пен жады арасындағы блоктарды жылдам жіберу үшін қолданылады сыртқы құрылғыда порттар адресінің тізбектей орналасқан жағдайында. Портпен деректер алмасу, онда енгізу-шығарудың жолдық командалары қолданылатын, PIO (Programmed Input/Output) атына ие болды – бағдарламалық енгізу-шығару.

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

АЛМАСУДЫ ИНИЦИАЛИЗАЦИЯЛАУ ӘДІСТЕРІ

Бағдарламалық-басқарушы алмасу бірнеше себептермен жеке ынталандырылуы мүмкін:

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

- Аппараттық үзілудің сұранысымен. Аппараттық үзілу сыртқы құрылғылар мен компьютер компоненттерімен шақырылады, өзінің ақпараты үшін жедел түрде өңдеуді қажет ететін және атқарушы бағдарламаға қатынасы бойынша асинхронды келетін. Үзілдуі жүйедегі кейбір ерекше оқиға ретінде қарастыруға болады, кейбір талап етілген қызметтерді іске асыру үшін өзінің бағдарламасын орындалуын тоқтатуға процессорды мәжбүрлейді. Аппараттық үзілулердегі бағдарламалық өңдеушілер блоктык алмасуды инициализациялайды немесе сыртқы құрылғымен жүйелік шина бойынша жіберудің жеке амалын орындайды. Үзілу есептеуіш жүйенің тиімділігін арттырады, сондықтан олар сыртқы құрылғыларға қажеттілік өлшемінде процессорларды «өзіне назар аудартуына» мүмкіндік береді.

- Сонымен қатар кешенді шемімі де бар – периодтық үзілу бойынша бір немесе бірнеше сыртқы құрылғыларды (polling) дайындық сұрағы, мысалы, жүйелік таймерден. Дайын құрылғы қызмет етеді, дайын емесі келесі үзілуге дейін өткізіледі. Дайындық анализісіз сыртқы құрылғымен қандай да бір әрекетті периодты түрде орындауға болады.

DDE арқылы деректерді алмасу

Бағдарлама басқа қосымшалармен байланыс орнатуы мүмкін, динамикалық деректер алмасу механизмін қодана отырып - DDE, осымен бағдарлама DDE сервер де, DDE клиентте болуы мүмкін.  

Бағдарламаны DDE клиент ретінде қолдану құжаттар мен есептерді қалыптастыру кезінде мүмкін болады. Ішкі құрылған тілде DDE арқылы жұмыс үшін құралдар бар. Басқа бағдарламаға деректер немесе командалар жіберілуі мүмкін, макростар іске қосылуы мүмкін. Мысалы, осы механизмді MS Excel-мен алмасу үшін қолданған ыңғайлы. Осымен есептер мен құжаттар формасы алғашында Excel-де жасалынады. Құжатты қалыптастыру кезінде қажетті ұяшықтар бағдарламадағы деректермен толтырылады.

V V S  "Транспорт" бағдарламасы DDE сервер ретінде іске кірісуі мүмкін. Басқа қосымшалар бағдарламаны басқару үшін DDE механизмін қолдануына болады.

Байланысты орнату үшін DDE сервер аты: Transport

DDE командаларды қолдау.

Параметрлер командаға табуляцияның бөлуші-символдарымен жіберіледі:

INIT

Бастапқы инициализация, деректер қорымен байланысты орнату.

ADDGOAL Код  Аталуы Қала Адрес ФИО Телефон  E-mail Www_Сервер Номер_ICQ Жұмыс_сағаты

Жаңа контактіні қосу. Параметрлерде қабылдаушының реквизиттер мәні беріледі, табуляцияның бөлуші-символдары. Контакт жаңадан құрылады немесе сәйкес «Есептік бағдарламадағы коды» мәндік өрісі бар контакт ізделінеді.

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

ADDTASK  №_заказа_в_учетной_программе

Есептік бағдарламада (бөлуші-табуляция) шоттық номерді көрсетілуі бар жаңа тапсырманы қосу. Бағдарлама жаңа тапсырманың қосымша параметрлерін сұрайды – қызметін, атқарушы бөлімін.

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

FINDADDTASK №_заказа_в_учетной_программе

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

 SHOWGOAL

Контакт деректерін экранға шығару, ADDGOAL командасымен жаңа ретінде ізделінген немесе орналастырылған, параметрсіз.

SHOWLIST №_заказа_в_учетной_программе

Тапсырмалар тізімін шығару. Экранға жіберілген тапсырыс номері бойынша фильтрі орнатылған тапсырмалар тізімі шығарылады. Жаңа тапрсырысты орналастыру үшін, «есептік бағдарламадағы тапсырыс №» өрісіне жіберілген мән жазылады.

VVS "Офис - Қойма - дүкен" бағдарламасынан DDE командасы көмегімен VVS "Транспорт" шақыру мысалы:

Есептің баспалық түрдегі формасында VVS "Офис - Қойма - Дүкен" бағдарламасында келесі код болуы мүмкін:

@DDECONNECT Transport;Transport

@DDEEXECUTE INIT

@DDEEXECUTE ADDGOAL \[BP30,-1\] \[BP2,-1\] \[BP6,-1\] \[BP7,-1\] \[BP8,-1\] \[BP10,-1\] \[BP12,-1\] \[BP17,-1\]

@DDEEXECUTE ADDTASK \[AP3,-1\]

Осындай баспалық форманы шықару нәтижесінде VVS "Транспорт" бағдарламасында контакт жаңадан құрылады немесе «Есептік бағдарламадағы коды» сәйкес мәндік өрісі бар контакт ізделінеді және осы контакт үшін жаңа тапсырма қосылады.

        

27.  Басқару командалары . Енгізу - шығару жүйесі

 

Басқару командалары

ТЕСТ Командасы

ТЕСТ командасы оқу бойынша ғана қол жетімді және бір уақытта ЭЕМ ағымдық жағдайын және дискілік операцияларды орындау нәтижесін оқуға мүмкіндік береді. Сұранысқа ЭЕМ деректер өрісіне екі байтты қайтарады.

Бірінші байттың (жағдай байтты) биттерінің жағдайы ЭЕМ – ң ағымдық уақытын анықтайды:

  • бит 0 орнатылған, егер ЭЕМ пернетақтасының құлыпталуы орындалса, әйтпесе – тасталған ;
  • бит 1 орнатылған, егер ЭЕМ ұзақ операцияларды орындаумен бос болмаса (мысалы, энерготәуелді жадыға деректерді жазу іске асырылуда ) , әйтпесе – тасталған;
  • бит 7 орнатылған, егер ЭЕМ қолданушының бағдарламасын орындаса.

Жағдай  байтының бақа биттері әрқашан тасталған.

Екінші деректер байтының құрамы дискілік операциялардың орындалу нәтижесін анықтайды:

- 0 –операция сәтті орындалды;

- 1 – дискі жоқ;

- 2 – диск форматталмаған;

- 3 –дискіде орын жоқ;

- 4 –катологта орын жоқ;

- 5 - каталог/файл атнда қателік;

- 6 –катологты өшіру мүмкін емес;

- 7 - каталог/файл таңдалмаған.

Пернетақтаның құлыпталуы

ЭЕМ жұмыс істеу кезінде сыртқа қол жеткізу режимінде деректерді жіберу процессіне операциялардың әсер етуін жою үшін пернетақтаны құлыпта режимі қарастырылған. Құлыпталу 9.2 командасымен қосылады (екінші кесте) ЭЕМ экранына сәйкес пиктограмма шығарылады. ЭЕМ қолданушы бағдарламаны орындаған кезде ғана құлыптауды қоса алады кері жағдайда берілген командаға ЭЕМ 04 қате (Деректер дайын емес) шығарады.

Құлыптауды өшіру 9.3 командамен беріледі. ЭЕМ ток көзін өшіргенде де құлыптау өшеді. 

Қолданушының бағдарламасын басқару

ЭЕМ жұмыс істеу кезінде сыртқы қол жеткізу режиміне қолданушы бағдарламаны іске қосу және тоқтату мүмкіндігі қарастырылады. Бағдарламаны қосу 9.4 командамен беріліп орындалады, бағдарламаның орындалуы 0000 адресімен басталады. Егер команданы дер кезінде пернетақта құлыптауды орындаған болса бағдарлама іске қосылмайды, ЭЕМ 04 қате (Деректер дайын емес) шығарады.

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

Микропроцессорлардың үздіксіз жетілуі және барлық есептеу жүйесінің өнімділігін максималды жоғарлатуға ұмтылуға компьютердің ішкі ұйымдасуына алып келді: шиналардың разрядтылығының жоғарлығы, деректер алмасу магистральдарының ішкі тез әрекет ететін түрлерінің пайда болуы, жадымен дискілер арасында алмасуды жылдамдату үшін кэш-буферлерді пайдалану және т.б. алайда идея өнімділік жағынан маңызды бірақ бағдарламалаушы үшін маңызды емес бөлшектерден ойды бөлсек, онда қазіргі компьютерлердің логикалық сызбасын дәстүрлі түрде микропроцессор және компьютердің барлық құрылғылары қосылатын жүйелік шина(магистраль) түрінде лестетуге болады(сур-1).

Сурет 1. Компьютер құрылғыларын жүйелік шинаға қосу (A - адрестер; D - деректер; M/IO – басқару сигналдарының бірі)

Жүйелік шина компьютердің барлық құрылғылары бірдей қосылатын линиялар – сымдар жиынын құрайды.  Жүйелік шина ұғымына кең ауқымды шина линияларында әрекет ететін сигналдардың электрлік және логиклық сипаттамасын, олардың қызметін, шинада қандай да бір операцияны орндауда осы сигналдардың байланысу ережелері - әдетте оны  ақпарат алмасу хаттамасы деп атайды. Шинада таратылған сигналдар оған қосылған барлық құрылғыларға қол жетімді және әр құрылғының қызметіне оған арналған сигналдарды таңдау және оларға алмасу хаттамасына сәйкес реакцияларды қамтамасыз ету кіреді.

Процессор жүйелік шина мен үлкен көлемді линиялармен байланысқан (барлығы өзінің шығыстарымен), олардың ішінен бізд үш катигория қызықтырады: адрестер линиясының жиыны, деректер линиясының жиыны және аты  М / IO' (М - "IO терістеумен")болатын басқару сигналдарының бірі соңғы сигнал микропроцессордың шығыс сгналдарының арасында болады, ол жүйелік шинаға осы сигналға туындағандардан келеді, олар оқу және жазу басқару сигналдарымен М / IO' сигналыңы комбинациясы ретінде құрылған алйда бұдан іс өзгермейді, қарапайымдылық үшін осыны түсіндірдік.

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

mov mem,AX

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

Егер процессор  команда типін орындай отырып

mov AX, mem

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

Сигналдардың жазылу және оқылу процедуралары тек жадыға ғана әділетті емес: компьютердің басқа барлық құрылғылары үшін олар дәл осындай болады. Олар әр құрылғыға ол шақыру тиіс адрестер топтарына қосылған. өзінің адресін магистарльдан тауып, құрылғы процессормен деректерді жіберу бағытына қарағанда магистральдан түскен деректерді алады немесе керісінше деректерді магистральға орналастырады сур – 1 компьютердің барлық құрылғыларынекі катигорияға бөлуге болады. Біріншісі компьютердің видео буфер оны басқару құрылғысы екі адрестер тобына бапталған, олар оперативті жадыға жататын адрестерді жалғастырады. Оперативті жады соңғы байт адресі  9FFFFh  тұрады, ал келесі адрес A0000h графикалық видео буфердің бірінші байтының адресі болып табылады. Графикалық видео буфер AFFFFh адресінен дейін 64 кбайт адрестік кеңістікті алады. Мәтіндік видео буфер графикалықтан біраз қашықтықта орналасқан және  B8000h адресінен бастап 32 кбайт алады.

Құрылғылардың екінші категориясына адрестерді жедел жады адрестерімен жабылатын  барлық құрылғыларды жатқызуға болады. Мысалы пернетақта контроллеріне екі адрес қослған:  60h және  61h. 60h адресі бойынша басылған перненің кодын оқу орындалады ал  61h адресі контроллер жұмысын басқару үшін қолданылады. Екі адресте жедел жадыда болады және хабарласу жасалады құрылғыны тану қйыншылығы туындайды. Машина құрамында екі контроллер болғандықтан олар үшін адрестердің екі  жұбы бөлінеді IBM PC  типтік компьютерлердің барлығында үзілу контроллері болып, 20h-21h және A0h-Alh адрестерде белгіленеді, олар жедел жадының кейбір байттарына жауап береді.

Құрылғылардың жабылатын адрестерін идентификация мәселелері екі аспектіден тұрады: аппаратты және бағдарламалық. Жүйелік шинада құрылғыларды идентификациялау    М / IO' сигналың көмегімен жүзеге асады. Жадыға немесе видео буферге хабарласқан кезде процессор сигнал мәнін орнатады   М / IO' = 1 (М memory,жады). Басқа құрылғыларға хабарласу кезінде бұл сигнал О – орнатылады  (IO in-out, енгізу-шығару). Шинаға жалғанған барлық құрылғылар М / IO1 сигналының мәнін сараптайды. Жадымен видео буфер шинада оқу жазу операцияларына шақырылады, егер олар М / IO' = 1 мәнімен берілсе,  ал басқа құрылғылар магистраль сигналдарын тек М / IO' = 0 мәнінде қабылдайды. Осымен жады типінің құрылғылармен енгізу-шығару құрылғларын аппаратты бөлу орындалады. Құрылғыларды бағдараламалық бөлу процессордың екі команда жиынынң көмегімен іске асырылады. Жады үшін енгізу – шығару құрылғылары үшін. Командалардың бірінші тобына процессордың барлық командалары кіреді, олардың көмегімен екі адресчке хабарласуға болады:mov және movs, add, mul және div арифметикалық амалдары, rol, ror, sal және  sar жылжулары, байттың немесе    test  сөзінің құрамы және т.б. командалардың екінші тобын енгізу-шығару спецификалық командалар құрайды. МП86 – да олар бар жоғы екеу  in енгізу командасы және  out шығару командасы. Бірінші топтың командасын орындау кезінде процессор автоматты түрде генерациялайды М / IO' = 1;  in және out командаларын орындағанда процессор М / IO' = 0 сигналын орнатады.

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

 

28. Адрестермен және көрсеткіштермен жұмыс. Файлдық құрылым

 

 Сипаттама

ЭЕМ-нің электронды дискілерінде сақталатын файлдармен жұмыс әрекеті бойынша  дискілік операциялық жүйелердің (бұдан былай - ДОС) командаларына аналогты командаларды шақырумен іске асырылады. Қол жеткізу тек ЭЕМ  пернетақтасының  бекітілуі орнатылған кезінде мүмкін.

ЭЕМ-нің дискілеріндегі барлық файлдар каталогқа топтастырылған, олар файлдардан басқа ішкі каталогтардан тұруы мүмкін (келесі деңгейдегі каталогтар), олар өздерінің ішкі каталогынан және т.с.с болуы мүмкін. Сонымен, файлдық құрылым бірнеше бұтағы (дискінің сиымдылығы және каталог көлеміне байланысты шектеулі) және шектеусіз салымдары бар бір кірісі бар (бастапқы каталог) ағаштан тұрады. Файлдық құрылымда қозғалу тек екі бағытта мүмкін – алға ішкі каталогқа және артқа аналық каталогқа.  

Файлдарға және ішкі каталогтарға қол жеткізу ұзындығы 2048 байтпен ОЗУ-дың арнайы аймағына жүктелетін белсенді каталог арқылы жүзеге асырылады және 32 байттық 0-ден 63-ке дейінгі сандары бар 64 қатардан тұратын тізімді құрайды.  Әрбір файлға/ішкі каталогқа оның атынан, файл типінен, оның құрылған уақытынан, ұзындығынан (бағдарлама файлы үшін) және дискідегі орналасқан орнынан тұратын каталогтың бір қатары сәйкес келеді. Номері 0 болатын қатарда аналық каталогқа сілтеме және аналық каталогтың атынан тұрады.   

Тізім аралықсыз жоғарыдан төмен қарай, қатар номерінің көбеюі жағына толтырылады, бос қатарлардың барлық байттары  FFh коандасымен толтырылады. Жаңа файлдарды құруда сәйкес қатар тізімнің астынан қосылады, ішкі каталогты құруда  жаңа қатар тізімнің басына  қойылады (номері 1 болатын қатарға), қалған қатарлар төменге жылжиды. Файлдарды және ішкі каталогтарды өшіргенде  тізім қысылады. 

Дискіні таңдау

Белсенді дискіні таңдау үшін 8.1 команда қолданылады. 0 санын жазу кезінде А дискісі таңдалады, 1 санын жазуда В дискісі таңдалады, ОЗУ-да жүктеліп жатқан дискінің бастапқы каталогы автоматты түрде жүктеледі. Егер көрсетілген диск қол жетімсіз болса (жоқ немесе форматталмаған болса) сәйкес қателік орнатылады, ОЗУ каталогының алдыңғы құрамы өзгермейді. 

Сұраныс жасалған кезде деректер өрісіне белсенді дискінің номері жүктеледі.  

Диск туралы ақпаратты оқу

Белсенді диск туралы ақпаратты 8.3 командасының көмегімен алуға болады. Сұранысқа жауап ретінде ЭЕМ ұзындығы 38 байттық деректер қатарын береді. Қатар фиксирленген өрістерге бөлінген. Өрістер қатардың басынан басталады және келесі құрамға ие: 

Өріс 1. Дискінің құрылған (форматталған) уақыты. 8 байт  BCD форматта кезекпен – секундалар,минуталар, сағаттар,күн,ай,апта күні,жыл. Соңғы байтпен 0-ден 255-ке дейінгі кездейсоқ сан жазылған. 

Өріс 2. Дискінің атауы, 24 байт рұқсат етілген символдардан тұрады. 

Өріс 3. Бос кластерлер саны, 2 байт. 

Өріс 4.  Бос емес кластерлер саны, 2 байт.

Өріс 5. Бұзылған кластерлер саны, 2 байт.

Диск туралы ақпараттың жаңаруы дискіні таңдау кезінде жүзеге асырылады. 

Каталогты оқу

Каталог қатарлап қаралады, сол үшін 8.2 команданың көмегімен каталог қатарының номері орнатылады (0-ден 63-ке дейін)  және 8.4 командасы бойынша сұраныс орындалады. ЭЕМ деректер өрісінде номері орнатылған каталог қатары бар жауапты қайтарады. 

Каталог қатарының өрістері келесі құрамға ие:

Өріс 1. Идентификатор, ұзындығы 1 байт. Жазба типін анықтайды:

0 – каталог тақырыбы;

1 - қолданылмайды;

2 – ішкі каталог;

3 – бағдалама файлы;

4 – ондық деректерфайлы;

5 – мәтіндік файл;

6 – екілік деректер файлы.

0 идентификаторы  бар қатар әрқашан нольдік қатарда орналасады. Егер нольдік қатардың басында  байттың басқа мәні болса – каталог жүктелмеген. 

Өріс 2. Дискідегі файл/каталогтың басының кластерінің номері (алрес), ұзындығы 2 байт. 

Дискідегі файл/каталогтың орналасқан жерін анықтайды. Каталогтың тақырыбы үшін  аналық каталогтың басын анықтайды. Егер аналық каталогтың адресі  0000h болса, онда дискінің бастапқы каталогы жүктелген. 

Өріс 3. Файла/каталогтың аты,ұзындығы 20 байт.

Рұқсат етілген символдардан тұрады, бос орыннан бастала алмайды. Каталотың тақырыбында белсенді каталогтың аты орналасады. 

Өріс 4.  Файла/каталогтың құрылған уақтысы,ұзындығы 8 байт.

Өріс 5. Файл ұзындығы, 1 байт.  Параметр тек 1-ден 100-ге дейінгі беттерде бағдарлама файлдары үшін анықталған. 

Файлды/каталогты жүктеу

Файлды немесе каталогты жүктеу үшін 8.5 команда қолданылады. Операцияны орындау кезінде ОЗУ каталогтан номері алдын-ала 8.2 командамен берілген қатар идентификаторы есептеледі. Идентификатор типіне байланысты ішкі каталогқа өту, ЭЕМ жадысының  сәйкес аймағына дискіден жүктеу немесе аналық каталогқа өту жүзеге асырылады. Егер берілген қатар идентификатордан тұрмаса операция орындалмайды, 7 қате коды құрылады.  

Файлдарды жүктеу тек ЭЕМ ОЗУ аймағына жүзеге асырылады, бағдарламалар файлдары 0 адресінен жүктеледі, энерготәуелсіз жадының құрамы өзгеріссіз қалады.  

Файлды/каталогты өшіру

Функция файлдар мен ішкі каталогтарды каталог қатарының берілген номері бойынша өшіруге арналған. Каталог қатарының номері 8.2 командамен беріледі, операция 8.6 команданың көмегімен орындалады. Функция файлдар мен ішкі каталогтардан тұратын ішкі каталогтарды өшірмейді. Бұл жағдайда 6 қателік коды құрылады. 

Каталогтың құрылуы

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

Файлдың құрылуы

Белсенді каталогта жаңа файл 8.8 командасы бойынша жазбаны орындау кезінде құрылады. Команданың деректер өрісіне каталог қатарына аналогты қатар беріледі, онда  өріс 1,файл идентификаторы,өріс 3, құрылып жатқан файлдың аты және өріс 5, файл ұзындығы (тек қана бағдарлама файлдары үшін) толтырылған, бағдарлама файлы үшін бастапқы адрес болып ЭЕМ бағдарламасының ОЗУ жадысының  0 адресі    қабылданады. Егер құрылып жатқан файлдың аты бар файлдың атына сәйкес келсе немесе ат бос орыннан басталса операция орындалмайды және 5 қателік коды беріледі.

 

29. Мәліметтерді өзгерту. Ішкі бағдарламалардың қолданылуы

 

 Бағдарламалардың жады

1. ЭЕМ бағдарламасының жады жазумен және оқылумен қолайлы. Оқу ЭЕМ-нің қандай күй-жағдайында болмасын мүмкін, ал жазу ЭЕМ-нің клавиатураларын анықталған бітеу жанында ғана мүмкін. Болмаған жағдайда мәліметтерді жазу командасына ЭВМ «Мәліметтер дайын емес» - деген  04 қатесін береді.    

2. Оқу және жазу бір байт немесе постранично (100 байт) шығарылады. Ағымдағы мекен-жай бағдарлама жады немесе ағымдағы бет номері айырбасқа арналған командалармен 2.1 және 2.2 сәйкесінше алдын ала  орналастырады. Алдын ала мағыналар екілік түрде кіші байттарға беріледі.

3. Айырбас 2.3 және 2.4 командаларының көмегі арқылы жүзеге асырылады. Айырбас кезінде ОЗУ құрамының ЭЕМ бағдарлама жады ескеріледі. Жазу кезінде тек қана ОЗУ құрамы ғана өзгереді Мәліметтерді енгізген соң,  2.5 командасын беру арқылы немесе алдыңғы күй-жағдайларды қайта қалпына келтіру, 2.6 командасын беру арқылы, барлық ОЗУ бағдарлама жадының мазмұнын энерготәуелсіз жадында сақтауы мүмкін.

Ондық мәлімет, екілік мәлімет және мәтін

1. Ондық мәлімет регистрлеріне, екілік мәлімет регистрлеріне және мәтінге рұқсаты ЭЕМ бағдарлама жады рұқсатына ұқсас. Сонымен қатар ондық мәлімет жеке сандармен    ( 8 байт МК формат түрінде, таңбалы байттарға алдын-ала ) немесе блоктап 8 сандармен (64 байт), екілік мәлімет – байттап немесе 64 байттан блоктап, мәтін – бір символдан немесе  қатарлап (қатарда 24 символдан) беріледі.

Графикалық экран

1. Оқумен графикалық экран буферіне рұқсат ЭЕМ-нің барлық жағдайында мүмкін болады. Мәліметтермен айырбас үшін 6.3 және 6.4. командалары қолданылады. Оқу бір байттан немесе қатарлап (128 байт) шығарылады. Графикалық жадтың ағымдағы мекен-жайы немесе ағымдағы қатар номері айырбас үшін 6.1 және 6.2 командаларымен алдын-ала орналастырылады.

Электронды блокнот

1. ЭЕМ электронды блокнот мәліметтері жазу және оқу арқылы ЭЕМ-нің клавиатураларын анықталған бітеу жанында ғана мүмкін. 

2. Оқу және жазу бір жазуды (4 саны) 7.1. командасын қолдану арқылы жүзеге асырылады. Ағымдағы номер жазуы айырбас үшін 7.2 командасын орналастыру арқылы жүзеге асырылады. Берілетін мәліметтер энерготәуелсіз ЭЕМ жадында жазылады. 

Бағдарламаларды қолдану

Ішкі бағдарламаларды қолданудың жалпы ойы анық: егер бағдарламада бір фрагментті қайта-қайта орындау қажет болса, оны ішкі бағдарлама түрінде формаға келтіруге және  қажеттілік өлшемімен шақыруға болады. Егер ішкі бағдарлама өзінің орындалуына ешқандай параметрлердің орындалуын қажет етпесе және негізгі бағдарламаға өзінің жұмыс нәтижесін қайтармауы тиіс, онда процедура түрінде іс ішкі бағдарлама мәтінін дайындаумен шектеледі. ret аяқтаушы команда. Осы процедураны call командасы көмегімен шақырады. Бұдан бұрынырақ көрсетілгендей, ішкі бағдарлама процедураны құрастырмай ақ, жай ғана негізгі бағдарламаның бөлігі бола алады. Оның кіріс таңбасы болғаны маңызды, және ол ret командасымен аяқталуы тиіс. Келесі мысалда, delay ішкі бағдарламасы негізгі мәтін бағдарламасына бекітілген мөлшер бағдарламасының тоқтауларын қолданады.

Бағдарлама мәтінінде алдымен процедура-ішкі бағдарламасы суреттелген, содан соң негізгі бағдарлама. Бұрын белгіленгендей, суреттелу реті роль ойнамайды; аяқтау директивасында трансляцияны аяқтау end негізгі бағдарламаның кіріс нүктесі ретінде көрсетілген (main біздің мысалда).

СХ адымдар есепшісінің регистрі ретінде қолданушы ішкі бағдарлама тоқтауды loop командасымен ішіне салынған циклдар арқасында жүзеге асырады. Негізгі бағдарламада бұл регистр цикл ұйымына үш қатар шығару үшін қолданылады. Сол себепті бірінші ішкі бағдарлама не істеу керек – бұл СХ регистр мазмұнын сақтау, стекті табиғи түрде қолдану. ret аяқтау командасынан бұрын СХ регистрі қайта қалпына келтірілуі тиіс. Тоқтауды жүзеге асыратын фрагмент, 3.2. бөлігінде бұдан бұрын да суреттелген.Негізгі бағдарлама 09h функциясы көмегімен мәтіннің үш қатарын экранға шығарады. Бағдарламаны жеңілдету үшін, сонымен қатар кейбір қабылдаулар бағдарламасын демонстрациялап өту үшін, қатарды шығару циклда жүзеге асырылған. Қатарлар бір ұзындықта жасалған, және модификациясы кезекті қатарға  DX регистр мазмұнына қатар ұзындығын қосу арқылы орындалады. Негізгі бағдарламадағы цикл ұйымына назар аударған пайдалы. Циклға, тоқтау және ұсыныс ішкі бағдарламасын шақырушы DX регистрін модификаттаушы командасынан басқа, int 21h командасы ғана қосылған. АН регистрі номер функциясымен бірге қайтадан жөнделмейді. Оның қажеті де жоқ, себебі DOS талап етілген операцияны орындай отырып, алдымен бағдарламаның барлық регистрін сақтайды, ал бағдарламаға қайтарудың алдында оларды қалпына келтіреді. Сондықтан, DOS (немесе BIOS) функциясын шақыра отырып, регистрлердің сақтау туралы ойланбай ақ қоюға болады – олардың мазмұн жүйесі құртылмайды. Тек қана мынаны ескеру қажет, көптеген DOS және BIOS функциялары өзінің аяқталуынан кейін бағдарламаға кейбір хабарларды қайтарады (нақты енгізілген символдар санын, жад көлемін, видео-режим номерлерін және т.б.). Әдетте бұл хабар АХ регистріне қайтады, бірақ басқа да регистрлер немесе олардың үйлесімі қолданылуы мүмкін. Сондықтан, бағдарламадағы  жүйелік функцияларға қарап, олардың сипаттамаларымен танысу керек, жекелей, қайтарымды мәндер үшін қандай регистрлер қолданатынын көру қажет.

Бағдарламаны қосып, экранда мәтін қатарлары белгілі бір уақыт аралығында көрінетіндігін байқауға болады.

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

Одан әрі баруға және ішкі бағдарламаны оған берілетін параметр тоқтау уақытын секундпен характеризоват ететіндей құруға болады. Егер жүйелік таймерді байланыстырмай қолдануды  интервал уақытын анықтайтын құралы ретінде қолданумен, ал бұрынғыдай процессорлы цикл көмегімен тоқтауды жүзеге асыру, оның өлшемі нақты компьютер жұмыс жылдамдығына байланысты және тәжірибелік түрінде теріп алынған  болады. Келтірілген төмендегі ішкі бағдарлама нұсқасы  Pentium поцессорында 200 МГц ырғақты жиілікпен дұрыс жұмыс жасады.

Тәжірибелер көрсетті, параметр мағынасының дұрыс тоқтау алуы үшін секунд сан білдірушіні 600-ге көбейту керек. Көбейту кезінде МП 86 жүйелік командасында бірінші көбейткіш  АХ регистрінде болуы тиіс, ал екіншісі қатынассыз мағына болмауы тиіс, сәйкесінше регистрлердің біріне орналасуы тиіс, сонымен қатар, туынды екі DX:AX регистрлерін алады,  ішкі бағдарламаға кіру кезінде бір ғана регистрді сақтау қажет емес, алдыңғы мысалда көрсетілгендей 4. SI параметріне берілетін АХ ауыстырылады, ВХ екінші көбейткіш енгізіледі, ал mul командасы бойынша  алынған өрнектің АХ-те орналасқан кіші бөлігі қолданылады. Осылайша берілген ішкі бағдарлама нұсқасы үшін тоқтау мәні 109 с (109 х 600 = 65500, ең жоғарғы мән 65535 сәйкес келеді) аспау қажет. Көбейту операциясын орындау кезінде кездесетін қауіпті жағдайларға назар аудару қажет. Берілетін параметр мәні 5-ке тең болсын. 600-ге көбейту кезінде,  АХ регистріне орналасатын,  3000 саны шығады. Бірақ та 16-разрядта операндты көбейту операциясы 

mul BX

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

Ішкі бағдарламаға параметрлерді жалпы пайдаланудағы регистрлер және сигменттік регистрлер арқылы берілу әбден мүмкін, бірақ практикада параметрлерді беру үшін стек қолданылады. Стеккке кез-келген параметр санын орналастыруға болады. Стекпен жұмыс кезінде өзіндік әдіс push және pop командалардың көмегінсіз, ВР регистрі арқылы жанама адресациялы mov командасы көмегімен қолданылады. Бұл стекке адресация жасауға арналған. а мысалын былай түрлендірейік, мысалдағы жалғыз параметр ішкі бағдарламаға SI регистрі арқылы емес, стек арқылы жіберілсін. delay ішкі бағдарлаасын шақыру келесі түрде орындалсын:

push 2000 ;Параметр мағынасын стекке апарамыз
call delay ;Ішкі бағдарламаны шақырамыз delay

Ішкі бағдарлама мәтіні өзгерістерге ұшырайды:

call командасы, басқаруды ішкі бағдарламаға бере отырып, стекте негізгі бағдарламаға қайту мекен-жайын сақтайды. Ішкі бағдарлама стекте тағы 16-разрядтық регистрді сақтайды. Нәтижесінде стек 1 сур. бейнедегідей күйде қалады. ВР регистрдің шығыс мазмұнын стекте сақтағаннан кейін (біздің мысалдағы негізгі бағдарламада бұл регистр қолданбайды, бірақ жалпы жағдайда бұл былай болмауы да мүмкін) ВР регистріне стек көрсеткішінің мазмұны көшіріледі. Осыдан кейін ВР-те стек төбесінің жылжуы. Әрі қарайй mov командасы арқылы СХ регистріне стек ұяшықтарының мазмұны, 6 байтқа ағымдағы төбеден төмен енгізіледі. Бұл стек орнына 1 суреттің сол бағанында көрсетілгендей, ішкі бағдарламаның параметрін жіберуші орналасқан. Нақты жылжу шамасын стек төбесіне қатысты әрбір ішкі бағдарламаға жеке анықтауы тиіс,

Сур. 1. Регистрлерді сақтағаннан кейінгі стектің ішкі бағдарламадағы жағдайы.

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

Оған берілген тапсырманы орындай отырып, ішкі бағдарлама ret командасының көмегімен бұдан бұрынырақ сақталынған регистрлерді қайта қалпына келтіреді және негізгі бағдарламаға қайтаруды жүзеге асырады. Аргумент ретінде байт сандары көрсетілетін стекте орын алатын ішкі бағдарлама параметрлерін шақырудан бұрын сонда жіберілген. Біздің жағдайда жалғыз параметр 2 байтты алады. Егер бұл жерде қарапайым ret командасын аргументсіз қолданса, онда негізгі бағдарламаға қайтқан соң параметр стекте қалады. Оны ол жақтан алып шығу керек болады (бірақ түсініксіздеу, себебі барлық регистрлер бос болмауы мүмкін). Аргументпен бірге команда шақырушы бағдарламаға қайта оралуды жүзеге асырғаннан соң, бағыттаушы стек мазмұнын аргумент көбейтеді. Осы арқылы логикалық параметрлерін алуды жүзеге асырады. Физикалық түрде бұл параметр, басқа барлық мәліметтер секілді, стекке орналасқандай стекте қалады және кейінірек  те стекке назар аударғанда да солай қалады.

Әрине, стекке бір ғана емес, бірнеше параметрлерді сыйдыруға болатын еді. Онда олардың оқылуы үшін бірнеше mov командасының ВР+6, ВР+8, BP+0Ah және  т.с.с. мағынасымен орын ауыстыруын қолдану керек еді.

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

 

30. Ассемблердің макроәдістері. Қайталану блоктары. Шартты трансляцияның директивалары.

 

Ассемблердің макроәдістері  

Заманауи ассемблерлер өздерінде макроәдістерден тұрады, сондықтан да макроассемблер деп кейде аталады. Макроәдістердің  жалпы идесы ағымдық мәтінге қосымша бағдарламасын макроәлем тіліне қосу мен аз мөлшерде бағдарлама трансляциясын басқару болып табылады.  Макро тіл  бағдарламаның жеке учасклеріндегі трансляцияны біз белгілеген шарт(тансляция шарты) бойынша орындауға және орындамауға мүмкіндік береді; бағдарламаның бастапқы текстінің учасксінің көбейтуді орындайды сонымен бірге  әр бір қайталану модификациясы бойынша да (қайталану блоктары); бағдарламаға бөлек фрагмент бойынша жазылған тексті белгіленген параметрлерді құра отырып қосады. Макротілдің дириктивасы  арқылы құрылатын объектіні макрос деп атайды. Кейде  макрос терминін макроәдістің тек анық бір түріне жатқызады, дәлірек айтар болсақ макрокомандаға жатқызады. Макростарды қолдану бағдарламаның бастапқы текстін құруды оңайлатады және кейде ол тексті көрнекі етеді, бірақтан жеке жағдайда мысалға,  шартты трансляция дериктиваларныда, керісінше бастапқы тексті қиындатады.

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

 Қайталану блоктары

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

sym='A' ; уақытша айнымалының бастапқы мәні
symbols: ; оған сілтеме үшін массив атауы
rept 32 ;осынша рет қайталау
db sym ;қайталанатын директива
sym=sym+l ;айнымалының өзгеруі
endm ;қайталану блогының соңы

келтірілген фрагметтен көрініп тұрғандай қайталану блогы  rept (от repetition,қайталау) ассемблер директивасынан басталып, endm (end macro, макрос соңы) директивасынан аяқталады. Деректер сигментінде орыс әріптері секілді қарауды талап ететін 81h ден 9Fh дейінгі сандармен толтырылған 32 байт көрсетіледі. Дәл осы нәтижені келесі сөйлемменде алуға болады:

symbols db "А", "Б", "В", "Г", және т.с.с. Я  әріпіне дейін, немесе қарапайым:

symbols db 128,129,130,131, және т.с.с. 159 санына дейін.

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

in AL,300h ;құрылғыға бірінші  қатынас
jmp a ;уақыттқа тоқтау
a: jmp b ;орындалу
b: jmp с ;     jmp үш командасы
c: in AL,301h ;құрылғыға келесі қатынас

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

in AL, 300h ; құрылғыға бірінші қатынасу
jmp $+2 ;       уақытқа тоқтату
jmp $+2 ;      орындалу
jmp $+2 ;    jmp үш командасы
in AL,301h ; құрылғыға келесі қаттынас

Бұл жерде S ағымдық адресінің мәні қолданылады. Ағымдық адрестің есептеуішінің кез-келген командасын трансляция жасау кезінде, осы команданың адресі сақталып қалады. Қысқаша өтудің командасы 2 байт оырн алады, сондықтан jmp $+2 командасы соңынан келетін когмандаға ауысуды орындайды.

Жиі мұндай жағдайларда макросекунд уақытында керекті тоқтатуды жасайтын бір jmp командасымен шектелі. Бұл жағдайларда құрылғымен қиыстырылған құрылғы процессордан жай жұмыс жасағандықтан,  командалар арасында  5-6 порттарына jmp қатынасын орнату қажет болады. Мұндай фрагментті қайталану блогы ретінде көрсетуге болады:

rept 6 jmp $+2 endm

Қайталану макростарының бірнеше түрлері бар, бірақ біз оларды қарастырмаймыз.

Макрокомандалар

Ассемблер тілінде жазылған бағдарламалар жиі өзінде қайталанатын бірдей құрылымды мәтіндік участоктарға ие болады.  Мәтіннің мұндай участогын жанама атау немесе міндетті емесе формальді аргументтер тізімімен мінезделетін, макроанықтамалар түрінде құжаттауға болады. Мұндай анықтама жасалынып болғаннан кейін, макроанықтамалар мен нақты аргументтердің тізімінен тұратын бағдарламада пайда болатын қатар макрокеңейту деп аталатын қажетті мәтінді генерацияға алып келеді. Макроанықтамалар, макроанықтамалардың қатарда көрсетілген атымен және  macro директивасымен көрсетілуі тиіс. Ал макроанықтамалар endm директивасымен аяқталады.

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

psh macro a,b,c

push a
push b
push с
endm

ағымдық қатар бағдарлама мәтініде пайда болу 

psh АХ, ВХ, СХ

мәтіннің келесі фрагменттерін генерацияға алып келеді:

push AX push BX push CX

егер де ағымдық мәтінде қатар болса 

psh DX, ES, ВР

онда сәйкес макрокеңейтілім келесі түрде болады:

push DX
push ES
push BP

нақты аргументтер ретінде берілген командаға рұқсат етілген ассемблердің кещз-келген мәні шыға береді. Мысал үшін, макрошақыру

psh mem, [BX], ES: [17h]

келесі макрокеңейтілуге алып келеді: 

push mem
push [BX]
push ES : [17h]

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

delay macro
local point
mov CX,200
point: loop point
endm

delay макросы фиксирленген ұзақтықта тоқтауды жасайды. Егер де команда мәтініне екі delay макрокомандасын қоятын болсақ:


delay

delay

Онда олардың бағдарлама мәтініне орнатылған макрокеңейтілулері келесі түрде көрсетіледі: 


mov CX, 20000
??0000: loop ??0000

mov CX, 20000
??0000: loop ??0000

Макроанықтауларды қайталауда транслятор point таңбасын ажыратылатын мән ??0000, ??0001  және т.с.с. алмастырады.   Ішкібағдарламаларға ұқсас макрокомандалар біз кейбір бағдарламалық фрагментті бір рет жазып, ал оған бірнеше рет қатынас жасағанда, әртүрлі параметрлдерді беру арқылы болады. Алайда, бұл есептеуіш әдістері өз мүмкіндіктері секілді қолданылуда да солай ажыратылады. Ішкібағдарламалар орындалатын файл көлемін бағдарламаның қайталанатын участоктарын бір рет жазу арқылы кішірейтуге мүмкіндік береді. Ішкібағдарламаның мәтінін оны жазу этабында толығымен анықталады, ал оның ішкібағдарламаның орындалу барысында өзгеруі тек ғана оған сол немесес басқа нақты мәндерді беру есебінен ғана болады. 

Мәлімет сізге көмек берді ма

  Жарияланған-2015-10-21 14:47:34     Қаралды-26910

ГАЛАКТИКА ДЕГЕНІМІЗ НЕ?

...

Ежелгі гректер бұл жұлдыздар шоғырын Галактика деп атаған, ол Құс жолы дегенді білдіреді.

ТОЛЫҒЫРАҚ »

ҒАЛАМ ҚАЛАЙ ПАЙДА БОЛДЫ?

...

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

ТОЛЫҒЫРАҚ »

ДҮНИЕЖҮЗІЛІК МҰХИТ ТУРАЛЫ НЕ БІЛЕМІЗ?

...

Дүниежүзілік мұхиттар – гидросфераның негізгі бөлігі

ТОЛЫҒЫРАҚ »

ЭЛЕКТР ҚУАТЫН КІМ АШТЫ?

...

Бенджамин Франклин есімді адам бірінші болып электр тоғының не екенін толық түсіндіруге тырысты.

ТОЛЫҒЫРАҚ »

ВЕЛОСИПЕДТІ АЛҒАШ КІМ ОЙЛАП ТАПТЫ?

...

Бұл скутер педальсыз велосипедке көбірек ұқсады...

ТОЛЫҒЫРАҚ »

КОФЕНІ ҚАШАН ЖӘНЕ КІМ ОЙЛАП ТАПТЫ?

...

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

ТОЛЫҒЫРАҚ »

ӘЛЕМДЕГІ АЛҒАШҚЫ СМАРТФОН

...

Сенсорлық экраны бар ең алғашқы смартфон IBM Simon болды.

ТОЛЫҒЫРАҚ »

СІЗ АУАНЫ КӨРЕ АЛАСЫЗ БА?

...

Ауаның мөлдір, түссіз, иіссіз екенін бәрі біледі.

ТОЛЫҒЫРАҚ »

ЕҢ БИІК ТАУ ҚАЙ ЖЕРДЕ?

...

Планетамыздағы ең биік тау құрлықта емес, Тынық мұхитының түбінде тұр

ТОЛЫҒЫРАҚ »