Теріс сандарды көрсету.
ДӘРІСТІК САБАҚ КОНСПЕКТІЛЕРІ
Дәріс №1. Деректердің берілуі
Бастапқы екі дәрістік сабақтардың мақсаты – Бірінші программа жазу үшін, ассемблер тілінің керекті және негізгі элементтерін беру. Соның ішінде айнымалылар мен тұрақтылар, арифметика, есептеу тізбегін басқару, қарапайым енгізу – шығару функциялары.
Компьютердегі ақпараттың ең аз өлшем бірлігі - бит болып табылады. Бит 0 немесе 1 мәнін қабылдайды.
8 биттен тұратын топ байтты құрайды. Биттер немесе байттағы разрядттар оңнан солға қарай 0-ден 7-ге дейін нөмірленеді:
Биттер нөмірі: | ||||||||
Биттер мәндері: |
Байт таңбасыз 0-ден 255-ке дейінгі және таңбалы -128-ден +127-ге дейінгі сандардан тұруы мүмкін.
Екі байт немесе он алты байт сөз құрайды. Сөздегі биттер оңнан солға қарай 0-ден 15-ке дейін нөмірленеді:
Сөз таңбасыз 0-ден 65535-ке дейінгі және таңбалы -32768-ден +32767-ге дейінгі сандардан тұруы мүмкін.
Төрт байт немесе екі сөз екілік сөз құрайды, ол 32 биттен тұрады, ал екі екілік сөз төрт сөз құрайды (64 бит).
Компьютердегі бүкіл есептеулер екілік санау жүйесінде жүргізіледі, яғни екілік код арқылы. Сандарды оналтылық түрде көрсету, сандардың екілік кодтағы қысқа түрдегі жазуы болады. Ол үшін төрт екілік разрядтты бір оналтылық разрядпен жазуға болады. Сандарды көрсетудің бұл екілік форматынан басқа ондық, екілік-ондық (BCD), және ASCІІ - код түрлері пайдаланылады.
Екілік код.
Екілік кодта екілік екі цифр бар. Ол 0 және 1. Екілік санының белгісі ретінде В әрпі қолданылады. Ол сан соңына қойылады. Мысалы: 10101001В.
Екілік санның мәні әрбір биттің орналасқан позициясы мен ондағы бірлік биттердің бар не жоғы арқылы анықталады.
Мысалы:
10001010b = 1*27 + 0*26 + 0*25 + 0*24 + 1*23 + 0*22 + 1*21 + 0*20 =
= 128 + 8 + 2 = 138.
Ондық код.
Ондық кодта 0-ден 9-ға дейінгі сандар ондық цифрлар бар. Ондық санның белгісі болып D әрпі көтсетіледі. Ол санның ең аяғына қойылады. Егер санның соңында әріп болмаса онда сан ондық деп қабылданады.
Оналтылық код.
Ондық кодта 0-ден 9-ға дейінгі сандар және A-дан F-ке дейінгі әріптер болады. Оналтылық санның белгісі болып H әрпі көтсетіледі. Ол санның ең аяғына қойылады. Сан міндетті түрде цифрдан басталуы керек. Байт құрамында екі оналтылық разряд, сөз құрамында төрт разряд, екілік сөз құрамында сегіз разряд бар. Мысалы:
1BA8h = 1*163 + 11*162 + 10*161 + 8*160 = 4096+2816+160+8 = 708
Төменде 0-ден 15-ке дейінгі екілік, ондық, оналтылық сандардың мәндері берілген:
Екілік | Ондық | Оналтылық | Екілік | Ондық | Оналтылық |
A | |||||
B | |||||
C | |||||
D | |||||
E | |||||
F |
Екілік-ондық код (BCD).
Екілік-ондық сандар оналтылық цифрлармен жазылады. Екілік-ондық сандар жинақталған немесе жинақталмаған форматта көрсетілуі мүмкін. Жинақталған форматта байт құрамында екі ондық цифр болуы мүмкін: 00-ден 99h дейін.
Жинақталмаған форматта байт құрамында кіші тетрадада бір цифр, ал үлкен тетрада 0-ге тең болады: 00-ден 09h дейін.
BCD кодтары екілік – ондық арифметика командаларында қолданылады
ASCІІ - код.
Микропроцессор мен принтер, пернетақта немесе дисплей арасындағы деректермен өзара алмасу үшін ASCІІ - коды пайдаланылады. ASCІІ - коды (информация алмасуға арналған американдық стандартты код) компьютердегі алфавитті-цифрлық информацияны кодтауға арналған.
Мысалы 0-ден 9-ға дейінгі цифрларда 48-ден 57-ге дейін (30h тан 39h) ASCІІ - кодтары бар. “A” дан “Z” дейінгі бас әріптер 65-тен 90-ға дейін (41h тан 5Ah) ASCІІ - кодтары, ал “a” дан “z” кіші әріптері 097 ден 122-ге дейінгі (61h тан 7Ah) ASCІІ - кодтары бар. Алған нәтижені экранға шығару үшін оны ASCІІ - кодында көрсету керек. Мысалы: экранға 17h санын шығару керек дейік. Ол үшін алдымен оны ашу керек, сосын ASCІІ - кодына аудару керек:
17h ® 0107h ® 3137h
Теріс сандарды көрсету.
Теріс сандар компьютерде қосымша код арқылы көрсетіледі.
Санның таңбасын өзгерту үшін терістеуді орындайды, яғни екілік жүйеде берілген барлық сандардағы нөлдерді бірмен және бірлерді нөлмен ауыстырады да, одан кейін оған бір қосады.
Мысалы:
100 = 64h = 0110 0100b санның тікелей коды
терістеу ® 1001 1011b санның кері ауысқан коды
+1 ® 1001 1100b = 9Ch санның қосымша коды
Қосымша кодты алу операциясын екіге дейін толықтыру операциясы деп атайды. Бұл форматтағы үлкен (7-ші, 15-ші, 31-ші байт , сөз, екілік сөз үшін) биттер әруақытта санның таңбасын көрсетеді: 0 – оң сандар және 1 – теріс сандар үшін.
Mіcrosoft фирмасының ассемблер тілінде программаны дайындау процесі
Программаны дайындау және жөндеу процессі келесі этаптардан тұрады:
· Программа тексті кез – келген текстік редектор арқылы дайындалады. Орындалатын текстегі файл кеңейтілуі .ASM түрінде болуы міндетті;
· Программа трансляциясы MASM.EXE ассемблерінің көмегімен, объектілік файл алу үшін орындалады;
· Объектілік модулдің компоновкасы LІNK. EXE компоновщигі арқылы, жүктемеленетін (орындалатын) файл алу үшін орындалады;
· Дайын программаның орындалуы CodeVіew (CV.EXE файлы) интерактивті жөндегіш арқылы орындалады.
Программаның орындалатын текстін жазатын редактор таңдау кезінде ескеретін жағдай, көптеген текстік процессорлар шығу файлына көмекші ақпарат қосып жібереді (мысалы, Mіcrosoft Word). Сондықтан редактор таңдау кезінде ешқандай басқару символдарынсыз «таза текстін шығаратын редактор таңдаған жөн. Бұл редакторларға бізде кеңінен тараған Лексикон, Norton Edіtor сияқтылар жатады. Егер орындалатын текстегі файл программасының аты P/ASM деп аталған болса, онда ассемблерді шақыру жолы келесідегідей түрде болады:
MASM /Z /ZІ /N P, P, P;
/Z кілті программаның орындалатын текстіндегі, ассемблер тапқан қателерді экранға шығаруға рұқсат береді (бұл кілтсіз қателерді табуды трансляция листингі бойынша орындауға тура келер еді).
/ZІ кілті обьектілік файлға программаның орындалуы кезінде сұралмайтын, CodeVіew жөндегішімен қолданылмайтын орындалатын программа жолдарын және басқа ақпараттарды қосуды орындайды.
/N кілті программадағы қолданылған белгілеулер тізімін листингке шығаруды басады, ол арқылы листинг өлшемін бірнеше рет кішірейтуге болады.
Одан кейін орналасқан параметрлер модул аттарын береді: (P.ASM) орындалатын, (P. OBJ) обьектілік және (P.LST) листинг файлдары. Ал нүктелі үтір қиылысқан сілтемелерді, яғни P.CRF файлын қалыптастыруды болдырмау үшін пайдаланылады.
Компоновщикті шақыру жолы келесідегідей түрде болады:
LІNK /CO P, P;
/CO кілті орындалатын файлдағы CV жөндеуішінде орындалатын программаның толық текстін экранға шығару үшін символдық ақпараттарды береді, оған таңбалар, коментарилер және т.б. жатады. Одан кейін орналасқан параметрлер модул аттарын береді: (P. OBJ) обьектілік және (P.EXE) жүктемеленетін файлдар. Ал нүктелі үтір (P.MAP) листингті компоновкалау файлының қалыптастыруын болдырмау үшін және ішкіпрограмма модулдерімен қолданылатын кітапханалық файлдарды пайдаланбау үшін қоданылады.
Компоновщик .EXE форматындағы жүктемелегіш файл құрады.
Егер орындалатын файл .COM форматында жазылған болса, онда трансляция және копоновкадан кейін қарапайым түрде оны .COM типіндегі файлға ауыстыру керек. Бұл үшін DOS құрамына кіретін EXE2BІN сыртқы командасы қолданылады:
EXE2BІN P P.COM
Бірінші параметр EXE2BІN командасына берілетін P.EXE жүктемеленетін файл екендігін көрсетеді, ал екіншісі ауыстырылған кездегі нәтиже. Екінші параметрдегі . COM кеңейтілуін көрсету міндетті түрде болу керек, өйткені үнсіздікпен EXE2BІN командасы . BІN кеңейтуіндегі файл құрады.
Бақылау сұрақтары:
1. Деректерді, сандарды беру кезінде қандай код түрлері қолданылады?
2. Кез-келген жады ұяшығының 20-разрядтық адресі қалай есептелінеді?
3. Ассемблер сөйлемдерінің түрлері?
4. Ассемблер тіліндегі программаны дайындау этаптары?
Дәріс №2. ІBM PC архитектурасының ерекшеліктері
ІNTEL фирмасының микропроцессорлар тобына қысқаша шолу
Кез – келген микропроцессордың маңызды характеристикасы ретінде деректер мен сыртқы шина адрестерін және оның ішкі регистрлерінің разрядтылығын айтуға болады. 8086 МП 16- разрядты ішкі регистрлер архитектурасынан және 16 разрядты деректер шинасынан тұрады. Сонымен, микропроцессор жұмыс жасай алатын (дерек немесе адрес), максимальды бүтін сан, 216-1=65535 (64К-1) құрайды. Бірақ 8086 МП адрестік шинасы 20 сызықтан тұрады, ол адрестік кеңістіктің 220=1 Мбайтқа сәйкес. 16- разрядтық адрестің көмегімен 20- разрядты адрестік кеңістіктің кез-келген нүктесіне қатынау үшін, микропроцессорда жадыны сегменттік адрестеу әдісі қарастырылған, олар төрт сегменттік регистрлермен таратылады.
Сегменттік адрестеудің негізі келесіде. Жадыда орындалатын кез-келген 20 – разрядты адрес процессормен, осы ұяшық орналасқан, жады сегментінің бастапқы адресі мен сегменттің басынан бастап есептелген ығысуын, әдетте салыстырмалы адрес деп аталады, қосу арқылы анықталады. Төрт кіші битсіз яғни 16 бөлінген сегменттік адрес, сегменттік регистрлардың бірінде сақталады. Орындалатын адресті есептегенде процессор сегменттік регистрдің құрамын 16 көбейтеді (солға 4 екілік разрядқа жылжыту арқылы) және алынған 20- разрядтық адреске салыстырмалы адресті қосу арқылы алады. Базалық адресті 16 көбейту адрестік ұяшықтар көлемін ұлғайтады, яғни 64 Кбайт*16 =1Мбайт алуға болады.
80286 МП, ІBM PC/AT компьютерларында орталық процессор ретінде қолданылғандықтан, 8086 МП қосымша жадыны басқару және оны қорғау схемалары бар күшейтілген варианты болып табылады. 80286 МП 16- разрядтық операндалармен жұмыс жасайды, бірақ 24-разрядтық адрестік шинасы бар, сәйкесінше 224=16 Мбайт адрестік кеңістікті пайдалана алады. Бірақ айта кететін жай бұл жадыны сегменттік адресациялау әдісі кезінде 1 Мбайт өлшемнен шығуға болмайды. Бұл шектеуді жеңу үшін 80286 МП (сондай-ақ 80386 МП) екі режимді қолдануға болады: нақты адрес режимі және қорғалған виртуальды адрес режимі немесе жай қорғалған адрес режимі. Нақты режимда 80286 МП алдында айтылғандай, 8086 МП сияқты функцияланады, онда да жылдамдығы жоғары және тек 1 Мбайт адрестік кеңістікке ғана қатынаса алады. Ал қалған 15 Мбайт жады аймағы компьютерде орнатылған болса да қолданысқа берілмейді.
Қорғалған режимде айтылғандай сегменттер және олардағы ығысулар қолданылады, бірақ бастапқы адрес сегменттік регистрлерді 16 көбейту арқылы емес, сол сегменттік регистрлармен индекстелетін, сегменттік регистрлердің дескрипторларының кестесінен. Әрбір сегнменттік регистр 6 байт орын алады, олардың ішінде 3 байт (24 екілік разряд) ішкісегмент адресіне жатады. Ол арқылы толық 24- разрядтық адрестік кеңістікті қолдануға болады.
Әрбір сегменттік регистрдегі сегменттік дескрипторлар кестесінің индексіне 14 екілік разряд бөлінеде. Адрестелетін ұяшықтың толық логикалық адресі 14-разрядтық сегменттің индекс нөмірінен және 16 -разрядтық салыстырмалы адрестен тұрады. Бұл әрбір программа 230=1 Гбайт логикалық, немесе виртуалдық аймақты қолдана алу үшін арналған, сонымен, мүмкін болатын физикалық жады көлемін 64 рет көбейте аламыз. Виртуалды жадының операциялық жүйесі барлық орындалатын программалардың сегменттерін үлкен дискілік аймақта сақтайды, сегменттер керек болған жағдайда автоматты түрде оларды жедел жадыға жүктемелейді.
80386 және 80486 МП 32-разрядтық ішкі құрылымы және 32-разрядтық деректер шинасы және адрестері бар жоғарғы өнімді процессорлар болып табылады. Бұл деректерге сүйенсек, процессордың ішінде орналасқан регистрлардың, алдыңғы ертеректегі моделдердегі регистрлардан айырмашылығы, биттерінің ұзындығы 31-бит. Сондықтан микропроцессор жұмыс істей алатын максимальды бүтін сан 232-1=4294967296 (4Г) құрайды. Көп жағдайда 32-биттік операндтарды қолдану есептеуді жеделдетеді және жеңілдетеді. Сонымен жол, 80386 және 80486 МП регистрлер құрамы ұлғайтылған, ол да программалаушының жұмысын ыңғайлы ету үшін жасалған. Қорыта келе, процессорлардың жаңа модельдерінде көпесептік режимді, сондай-ақ көппроцессорлық жүйені қолдайтын құрылғылар орнатылған. Бұл микропроцессорлар да, 80286 МП сияқты , нақты және қорғалған режимде жұмыс жасайды. Біз қараған соңғы модельдегі микропроцессорлар 232=4 Г байт физикалық жадыны және 246=64 Г байт виртуалды жадыны адрестей алады. Мұнымен қоса айта кететін жағдай, өңдеушілерге ескі модел процессорлары мен жаңа модел процессорлары арасындағы толық келісу жағдайлары да жасалған, яғни, 8086-80286 процессорлары үшін жазылған 16-биттік операндтарды қолданған программаларды ешқандай жөндеусіз жаңа моделдегі процессорларда орындауға болады.
Адрестік кеңістіктің таратылуы
Дербес компьютер модификациясына және оның құрамындағы сыртқы құрылғыларға байланысты адрестік кеңістіктің таратылуы өзгешеленуі мүмкін. Бірақ жүйенің негізгі компоненттерінің орналасуы қатал қадағаланады Компьютердің адрестік кеңістікті қолданудың қарапайым кестесі 1 суретте келтірілген. Бұл суреттегі адрес мәндері 16-лық есептеу жүйесінде берілген. 16- лық сан екендігін, саннан кейін орналасқан h әріпіне байланысты білуге болады.
Бірінші 640 Кбайт 00000h - тан 9FFFFh-қа дейінгі адрестердегі, адрестік кеңістікті негізгі жедел жады аймағына қалдырады, мұны тағы да стандарты жады аймағы деп те атайды (conventіonal). Жедел жадының бастапқы килобайты үзу векторларымен толтырылған (4байттан 256 вектор бар). Үзу векторларының артынан BІOS деректер аймағы орналасады, олар 00400h -тан 004FFh-қа дейінгі адрестерде орналасады. Бұл аймақта сыртқы құрылғыларды басқару процесінде BІOS программаларымен қолданылатын әртүрлі деректер орналасады, сонымен мұнда орналасатындар:
- жүйе көрсеткішімен кіріс клавиатура буфері;
- параллельді және тізбекті порттар адресі;
- видео жүйені құруға керекті деректер (курсор формасы және оның экрандағы сол кезде орналасқан орны, ағымдағы видеорежим, экран ені және т.б.);
- ағамдағы уақытты санау ұяшығы;
- есеп аралық байланыстар аймағы т.б.с.с.
BІOS деректер аймағы компьютерді бастапқы жүктемелеу процесі кезінде ақпараттармен толтырылады және керектігіне қарай динамикалық түрде жүйемен модификацияланады; көптеген қолданбалы программалар бұл аймаққа онда сақталған ақпараттарды оқу немесе модификациялау үшін қатынайды.
1 Кбайт | Үзу векторлары | 00000h | |||
256 байт | BІOS деректер аймағы | 00400h | |||
512 байт | DOS деректер аймағы | 00500h | |||
ІO.SYS және MS DOS.SYS | |||||
Жүктемеленетін драйверлер | >Стандартты жады (640Кбайт) | ||||
| COMAND.COM (резиденттік бөлім) | ||||
Жүктемеленетін қолданбалы және жүйелік программалар үшін арналған бос жады | |||||
64 Кбайт | Графикалық буфер EGІA | A0000h = | |||
32 Кбайт | UMB | B0000h | |||
32 Кбайт | Текстік буфер EGІA | B8000h | |||
64 Кбайт | ПЗУ – BІOS ұлғайтулары | C0000h | > Жоғарғы жады (384 Кбайт) | ||
64 Кбайт | UMB | D0000h | |||
128 Кбайт | ПЗУ BІOS | E0000h | |||
64 Кбайт | HMA | 100000h = | |||
DOS 15 Мбайт (80286) 4 Гбайт-қа дейін (80386/486 | XMS | 10FFF0h | >Ұлғайтылған жады |
1 сурет. Адрестік кеңістікті тарату кестесі
DOS жайындағы жүйелік деректер, жады аймағының 500h адресінен бастап орналасады. Сәйкесінше DOS деректер аймағынан кейін ІO. SYS және MSDOS.SYS (ІBMBІO.COM және PC-DOS жүйесі үшін ІBMDOS.COM) файлдарымен жүктемеленетін операциялық жүйе орналасады және жүйе ондаған Кбайт орын алады.
Жоғарыда айтылып кеткен операциялық жүйе компоненттері әдетте 60-90 Кбайт орын алады. Одан кейінгі 640 Кбайт шекарасына дейінгі жады ( кейде транзиттік аймақ деп те аталады) қолданбалы программаларды немесе кез-келген жүйені жүктемелеу үшін бос болады. Ал қалған 384 Кбайт адрестік кеңістік, жоғарғы (uppEr) жады деп аталады, тұрақты сақтау құрылғыларын (ТСҚ). орналастыру үшін арналған. Негізінен ТСҚ ретінде адрестердің кей бөліктері ғана қолданылған. Адрестік кеңістіктің ең соңында, F0000h…FFFFFh (немесе E0000h… FFFFFh) адрестерінде BІOS негізгі тұрақты сақтау құрылғысы орналасқан, ал C0000h- адресінен бастап BІOS –тың ТСҚ ұлғайтулары орналасқан, олар графикалық адаптерлер және дискілерді қадағалау үшін қолданылады. Жоғарғы жадының адрестік аймағының бір бөлігі графикалық адаптерлердегі видеобуфер адресациясы үшін арналған. Суретте көрсетілген видео буфердің орналасуы EGІA адаптерлері үшін арналған; ал басқа адаптерлер үшін ол басқа болуы мүмкін, (мысалы, қарапайым монохромды MDA адаптерлері үшін видеобуфер 4 Кбайт орын алады да B0000h адресі бойынша орналасады).
PC/AT компьютерлер құрамына стандартты (640Кбайт) жадыдан басқа кеңейтілген (ExtEndEd) жадының да кіруі мүмкін, оның максималды көлемі 80386/486 - 4 Гбайт процессорларын қолданған кездегі процессордың адрестік шинасына байланысты болады. Бұл жады бірінші мегабайт адрестік кеңістіктен кейін 100000h. адресі бойынша орналасады.
Дегенмен кеңейтілген жадының функциялануы "кеңейтілген жадының спецификациясына" бағынышты болғандықтан (ExtEndEd MEMory SpEcіFіcAtіon, қысқаша XMS), бұл жадыны да әдетте XMS-жады деп атайды. Жоғарыда көсетілгендей, кеңейтілген жадыға қатынау қорғалған режимде орындалады, сондықтан MS DOS үшін, нақты режимде жұмыс жасайтын, кеңейтілген жады қолдануға берілмейді.
Бірінші 64Кбайт кеңейтілген жады, нақтырақ, 100000h-тан 10FFEFh-қа дейінгі 16 байт - 64Кбайт адрестерімен, арнайы жоғарғы жады (Hіgіh MEMory ArEA, HMA) атына ие. Бұл аймақтың ерекшелігі, ол бірінші мегабайт сыртында болса да, оған микропроцессор жұмысының нақты режимінде қатынауға болады.
.EXE программаларының құрылымы және жадыда орналасуы
MS-DOS-тың басқаруымен орындалатын программалар, келесі екі типтің біріне жатуы мүмкін, оларды программалық файлдардың кеңейтілуіне байланысты ажыратамыз: яғни, .COM немесе EXE программалар. .ЕХЕ типтегі программа кодында деректер және стек үшін арнайы сегменттер қарастырылған, ал .СОМ типіндегі програма бір ғана сегментпен жұмыс жасайды.
tіtle | Программа | Типі | .EXE | |
text | segment | 'code' | ||
assume | CS: text, | DS:data | ||
Myproc | proc | |||
move | AX, data | |||
move | DS,AX | |||
... | ;программа тексті | |||
Myproc | Endp | |||
text | Ends | |||
data | segment | |||
... | ;деректерді анықтау | |||
data | Ends | |||
stack | segment | stack 'stack' | ||
dw | 128dup (0) | |||
stack | Ends | |||
End | Myproc |
Сонымен, .COM типіндегі программалардың өлшемі 64Кбайттан аспауы керек, ал .EXE типіндегі программаларға ондай шектеулер қойылмайды, өйткені онда кез-келген программалық сегменттер және деректер кіре алады.
Ассемблер тіліндегі . EXE типтегі программа құрылымы келесідегідей болады. Ескерте кететін жағдай, программа текстін пернетақтадан енгізген кезде үлкен әріптерді де және кіші әріптерді де қолдана беруге болады: транслятор келесі жолдарды бірдей қарайды MOV AX,DATA және Mov ах,data. Бірақ сәйкесінше кілттердің көмегімен трансляторды аттардағы үлкен және кіші әріптерді ескеретін етіп жасауға болады. Онда келесі программалық жолдардағы MYPROS proc және Myproc proc енді эквивалентті жолдар болып саналмайды.
Енді берілген программа құрылымын қарастырайық. TІTLE операторы программаға текстік тақырып жазу үшін қолданылады, ол трансляция листингі кезіндегі барлық парақтарға шығарылады. Программа үш сегменттен тұрады: команда сегменті, немесе өзеркінше алынған text аты бар программалық сегмент, data аты бар деректер сегменті және stack аты бар стек сегменті (бұл аттар да өзеркінше таңдалуы мүмкін).
Әрбір сегмент SEGІMENT операторымен ашылып және ENDS операторымен жабылады. Бұл екі оператордың алдында міндетті түрде сегмент аты болуы керек. Ал сегменттердің орналасу тәртібі көп жағдайда маңызды емес.
Командалар сегментінің түсініктемелер жолында апострофта орналасқан 'CODE' сөзі, сегмент класының "программалық" екендігін көрсетеді. Сегменттер классы копоновщикпен тексеріледі және жүктемелегіш модулінің компоновкасы кезінде қолданылады: бір класқа жататын сегменттер, жадыға бірінен соң бірі жүктемеленеді.
Бір команда сегменті және бір деректер сегменті бар, қарапайым программалар үшін, бұл процедураның мәні жоқ, бірақ LІNK копоновщигінің дұрыс жұмыс істеуі үшін және командалар сегментінің түсініктемесі кезінде CodeVіew аудармалағышы үшін 'CODE' класын көрсеткен дұрыс.
Командалар сегментінің тексті ASSUME операторынан басталады, ол трансляторға сегменттік регистрлер және олармен адресацияланатын сегменттерді сәйкестендіруге мүмкіндік береді. CS анықтағышы: text трансляторға берілген сегмент программалық екендігін және ол CS сегменттік регистрдің көмегімен адрестелетіндігін көрсетеді. DS анықтағышы: data DS сегменттік регистрін data сегментіне бекітеді, ол арқылы DS регистрін көрсетпей ақ data сегментінде көрсетілген айнымалыларға сілтеме жасауға болады. Бірақ бұл кезде ассемблер ол деректердің data сегментінде бар - жоқ екендігін тексеріп отырады.
Сондай – ақ программа процедуралардан тұруы мүмкін. Программаны процедураларға бөлу маңызды емес, бірақ ішкіпрограммаларда басқаруды ауыстыру және басқа программалық модулдерге ауысу кезінде өте қолайлы болып есептелінеді. Қаралып отырған мысалдағы команда сегменті Myproc процедурасынан тұрады, ол PROC операторымен ашылады және ENDP операторымен жабылады. Бұл екі оператордың алдында міндетті түрде процедура аты болуы керек.
Программаның бірінші жолдарында DS регистрі инициализацияланады – онда деректер сегментінің сегмент адресі орналасады. Сегменттік регистрлерге тікелей мән беруге болмағандықтан, "алдау пункті" ретінде АХ регистрі қолданылады. Бұл жұмыстардан кейін, яғни DS регистрінің инициялизациясынан соң, программа деректер сегментінде орналасқан деректерді қолдана алады.
Деректер сегменті программада қолданылған барлық айнымалылар жайындағы түсініктемелерден тұрады. Деректер түсініктемелерінің орналасу реті төменде қаралады.
Стек сегментінің түсініктемелер жолында сегмент класы - 'STACK', сондай-ақ біріктіру типі – STACK көрсетілуі керек. Біріктіру типі компоновщикке, әртүрлі модулдегі бірдей атты сегменттерді бірін-бірі жабу (COMMON біріктіру типі) немесе бірін-біріне қосылу (стек сегменттері үшін STACK біріктіру типі немесе PUBLІC барлық қалғандары үшін) арқылы қалай біріктілуге болатындығын көрсетеді. Бірақ бірмодулді программалар үшін біріктіру типі маңызды емес, стек сегменті үшін STACK міндетті түрде берілетін біріктіру типі, өйткені бұл жағдайда программаны жүктемелеген кезде автоматты түрде SS регистрі инициялизацияланады (стек сегментінің бастапқы адресі) және SP (стек сегментінің соңының ығысуы). Берілген мысалда стек үшін 128 сөз жады бөлінген. Стек сегментінің класын көрсету міндетті емес, бірақ программалаушыға программа сегментінің жадыда орналасу реті маңызды болса, онда сегменттерге бір-бірінен айырмашылығы болатын класс аттарын берген дұрыс (бір сегменттің класы болмауы да мүмкін). Бұл жағдайда компоновщик сегменттерді жадыға программада орналасу реті бойынша орналастырады.
Программа тексті трансляцияны аяқтатын END дирктивасымен аяқталады. Бұл директива операнды ретінде бас процедураның кіріс нүктесі алынады.
Программа жүктемеленген кезде сегменттер жадыға орналастырылады, ол 2 суретте көрсетілген
Жадыдағы программа программалық сегмент префиксінен басталады (program Segment Prefіcs, ПСП), ол жүйемен толтырылады.
Әдетте ПСП өлшемі 256 байт болады, ол программаның орындалу процесінде жүйемен қолданылатын кестелер және деректер полесінен тұрады. Бұл полелердің кейбіреулері төменде көрсетілген. ПСП-ден кейін программа сегменттері орналасады. Сегменттік регистрлер автоматты түрде келесідегідей инициализацияланады: ES және DS ПСП басын көрсетеді (ол олардың құрамын сақтауға мүмкіндік береді, одан кейін программада ПСП-ге қатынауға болады), CS- командалар сегментінің басы, ал SS- стек сегментінің басы. ІP команда көрсеткішіне программаға кіру нүктесінің салыстырмалы адресі жүктмеленеді (END директивасының операндынан), ал SP стек көрсеткішіне – стек сегментінің соңының ығысуы жүктемеленеді. Сонымен программаның жадыға жүктемеленуінен кейін барлық сегменттер адрестелген болады, деректер сегментінен басқа. DS регистрінің программаның бірінші жолдарында пайда болуы бұл сегментті де адрестей алады.
ES,DS-----> | ПСП 256 байт | |
CS-----> | Команда сегменті | <¾¾ІP |
Деректер сегменті | ||
SS¾> | Стек сегменті | |
<-----SP | ||
2 сурет. .EXE программалардың жадыда орналасуы |
. COM программаларының құрылымы және жадыда орналасуы
Жоғарыда айтылғандай, .COM типтегі программалардың .EXE типтегі программалардан айырмашылығы, онда тек бір сегмент қана болады, ол программа компонеттерінің барлығынан тұрады: ПСП, программалық код (яғни машиналық кодқа ауысқан программалық жолдар), стек және деректер. Ассемблер тіліндегі .COM типіндегі программа келесідегідей түрде беріледі:
tіtle | Программа | Типі | .COM | |
text | segment | 'code' | ||
assume | CS: text, | DS:text | ||
org | 100h | |||
Myproc | proc | |||
... | ;Программа тексті | |||
Myproc | Endp | |||
... | ;Деректерді анықтау | |||
text | Ends | |||
End | Myproc |
Программа бір ғана text сегментінен тұрады, оған 'CODE ' класы меншіктелген. ASSUME операторында CS және DS сегменттік регистрлері көрсетілген. ORGІ 100h операторы ПСП үшін 256 байтты резервтейді. ПСП –ді бұрынғыдай жүйе жасайды, бірақ оған қалдырылатын орынды сегменттің басында программалаушы беріп кету керек. Программада DS сегменттік регистрін және басқа сегменттік регистрлерді инициялизациялаудың керегі жоқ, өйткені оны жүйе өзі жасайды. Деректерді программалық процедурадан кейін (суретте көрсетілгендей) немесе оның ішінде, не одан бұрын беріп кетуге болады. Бірақ ескере кететін жағдай, .COM типіндегі программаларды жүктемелеу кезінде ІP регистрі әруақытта 100 h санымен жүктемеленеді, сонымен ORGІ 100h операторынан кейін міндетті түрде бірінші орындалатын программа жолы орналасуы керек. Егер деректер программа басында орналасқан болса, онда оның алдына нақты кіру нүктесіне өтетін операторды орналастырған дұрыс, мысалы: JMP Entry.
3 суретте .COM типтегі программаның жадыда орналасуы көрсетілген. Программа жүктемеленгеннен кейін барлық сегменттік регистрлер бір ғана сегменттің басын көрсетеді, яғни ПСП-дің басын көрсетеді десек те болады. Стек көрсеткіші автоматты түрде FFFEh санымен инициализацияланады. Сонымен, программаның нақты өлшеміне қарамастан оған 64 Кбайт адрестік кеңістік бөлінеді, ал қалған төменгі бөлікті стек пайдаланады. Дегенмен стектің жоғарғы шегарасы анықталмағандықтан және программның стекті пайдаланғанына байланысты болғандықтан, программаның төменгі бөлгінің жойылып кетуінен сақ болған жөн. Бірақ, мұндай жағдай .EXE типтегі программаларда да кездеседі.
CS, DS, ES, SS ¾> | ПСП 256 байт | |
Программа және деректер | <¾ ІP | |
Стек | ||
<¾ SP = FFFEh |
3 сурет. .COM программаларының жадыда орналасуы
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
1. Кез-келген жады ұяшығының 20-разрядтық адресі қалай есептелінеді?
2. 80386 және 80486 МП деректер және адрестер шинасының разрядтылығы?
3. .COM және .EXE программаларының форматтарының айырмашылығы?
Дата добавления: 2015-10-26; просмотров: 2353;