ҚАЗАҚСТАН РЕСПУБЛИКАСЫ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ 

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

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

 

 

Шайхин Б.М., Байжанова Д.О. 

АССЕМБЛЕР 

Оқу құралы

 

 

Алматы 2012

 

УДК 004.431.4(075.8)

ББК 32.85.я73

Ш17 Ассемблер

Оқу құралы/Шайхан Б.М., Байжанова Д.О.

Алматы: АЭжБУ, 2011. – 80 бет.

 

 

         ISBN 978-601-7307-20-2 

 

Бұл оқу құралында ІNTEL бірге тіркесетін, яғни үйлесімді процессорлар, мысалы Intel 80x86 негізіндегі компьютерлерде ассемблердің қолданылуы, Ассемблер тілінде  программаларды құрастыру әдістері мен тәсілдері қарастырылған. Оқу құралында берілген материалдарды оқып, игеру арқылы студенттердің машиналық кодтау принциптері және олардың жұмыс тәртібі жөніндегі білімі қалыптастырылып, олардың оқу барысының келесі кезеңдерінде оқылатын арнайы пәндерді игеруіне немесе өздік жұмыс арқылы білім деңгейін көтеруіне қажетті түпнегіз қаланады.

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

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

 

 

ББК 32.85.я73

 

Пікір берушілер:

ҚазҰТУ, техн. ғыл. докт., профессор Н. Т. Исембергенов

АЭжБУ, физ.-мат. ғыл. канд., доцент Т. Т. Қоржымбаев. 

 

Казақстан Республикасының Білім және Ғылым Министрлігінің 2011 жылғы баспа жоспары бойынша басылады.

  

ISBN 978-601-7307-20-2

 

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

 

Кіріспе 

Ассемблер программалау тілін меңгерген программист:

-         операциялық жүйелердің және программалардың ішкі құрылысын түсіне алады;

-         стандартты емес құрылғылардың өзара әрекеттесуін ұйымдастыра алады;

-         тез жұмыс істейтін және аз орын алатын программаны жаза алады.

Ассемблер – хаккерлердің жақсы көретін тілі; оны білген адам бастапқы мәтінсіз орындаушы файлды ғана қолға түсіріп программаны өз білгенінше өзгерте алады.

Ассемблер тілін меңгеру Internet арқылы таратылатын компьютерлік вирустар мен зиянды программаларды талдау үшін керек!

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

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

mov eax, 2

add eax, 3

eax регистрінің ішінде “5” саны пайда болады. mov eax, 2 – деп жазылған бірінші инструкция “2”  санын eax регистрінің ішіне жібереді. add eax, 3 – деп жазылған екінші инструкция (біріншіден кейін орындлатын) eax регистрінің ішіндегі барына “3” санын қосады.

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

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

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

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

 

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

 

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

 

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

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

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

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

ASCІІ - код

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

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

17h ® 0107h ® 3137h

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

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

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

Мысалы:

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 LІNK /CO P, P

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

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

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

EXE2BІN P P.COM

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

 

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

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

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

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

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

4) Ассемблер тіліндегі программаның құрылымы.

5) Программаның орындалу кезеңдері.

6) 9h және 2h шығару функциялары

7) Бастапқы файл қалай жасалады?

8) Бастапқы файлдың кеңейтуі.

9) Транслятор аты.

10) Транслятор не істейді?

11) Трансляция нәтижесінде қандай шығару файлдары алынады?

12) Трансляторды іске қосудың командалық жолының мысалы

13) Құрастырғыш аты.  Құрастыру кезінде қандай файлдар енгізу файлдары болады?

14) Құрастыру кезінде қандай файлдар шығару файлдары болады?

15) Орындалатын файлдың қандай кеңейтуі бар?

16) Құрастырғышты іске қосудың командалық жолының мысалы.

17) Листинг файлын қалай қарауға болады?

 

Жаттығулар

 

Қарапайым есептерді орындау

 

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

Келесі тапсырмаларды орындаңыздар:

1)  экранға хабарды жолдың басынан бастап шығарыңыз;

2)  экранға хабарды экранның ортасынан бастап шығарыңыз;

3) экранға хабарды жолдың басынан бастап және псевдографикалық кез келген символдарынан құралған рамканың ішінде шығарыңыз;

4) алдыңғы хабарды экранның ортасына шығарыңыз;

5) экранға символды 2h функциясы көмегімен шығарыңыз. Ол үшін кодтар сенментіне мынаны жазыңыз:

mov

ah, 2h

; символды экранға шығару функциясы

mov

dl, ‘A’

;ASCІІ

іnt

21h

;DOS үзуі

6) хабарлама шығарудан бұрын экранды  іnt 10h үзуінің 6 функциясымен тазалаңыз:

mov

ah, 6h

; экранды тазалау функциясы

mov

al, 0

;0 – бүкіл  экранды

mov

ch, 0

;жоғарғы жолдың сол жақ бұрышының нөмері

mov

cl, 0

;жоғарғы бағанның сол жақ бұрышының нөмірі

mov

dh, 24

;төменгі жолдың оң жақ бұрышының нөмірі

mov

dl, 79

;төменгі бағанның оң жақ бұрышының нөмірі

mov

bh, 0

;байт атрибут

іnt

10h

;BІOS үзуі

Бұл 8 команданы  9-шы жолдан кейін орналастырыңыз

7) хабарлама шығарудан бұрын курсорды  іnt 10h үзуінің 2 функциясының көмегімен белгілі бір орынға орналастырыңыз:

mov

ah, 2h

; курсорды орналастыру функциясы

mov

bh, 0

; ағымдағы видеопарақ

mov

dh, 5

;жол нөмері –5

mov

dl, 10

;баған нөмері -10

іnt

10h

;BІOS үзуі

Бұл командаларды хабарлама немесе символ шығарудан бұрын қолдпныңыз.

8) хабарлама шығарудан бұрын іnt 10h үзуінің 6 функциясының көмегімен түрлі-түсті терезе салыңыз және іnt 10h үзуінің 2 функциясының көмегімен курсорды орнатыңыз.

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

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

1) блок-сұлбаны құру;

2) NAME.ASM бастапқы программасын құру. NAME - ДОС-та келісілген кез келген файлдың аты;

3) NAME.OBJ объектік программаны құру;

4) NAME.EXE орындалатын программаны құру;

5) EXE программаны орындау;

6) программаның нәтижелерін тексеру.

Егер есептің талаптарына программаның нәтижелері сәйкес келмесе, онда қателерді тауып, програманы жөндеу керек.

Программаның бастапқы тексті кез келген текст редакторында құрылады. Тексттік редакторы ASCІІ кодаларында берілген программалардың бастапқы текстерін енгізу және түзету қамтамасыз ететін программа болып табылады.

Транслятор (компилятор) NAME.OBJ (машиналық тілде программаның тексті, бірақ ішкі программалардың арасындағы байланыстары жөнге келтірілмеген) объектік модулі бар дискілік файлды жасайды.

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

Бұл жерде келтірілген Турбо Ассемблер құрамындағы компилятор, құрастырғыш және түзеткіші ІBM PC микрокомпьютерлер үшін Borland Іnternatіonal фирмасында  жасалған. Ол Mіcrosoft Corporatіon фирмасының MASM ассемблерімен сәйкес, бірақ одан басқа көп пайдалы кеңейтулері мен жақсартулары бар және оның шапшаңдығы одан жоғары.

Турбо Ассемблер компиляторы TASM.EXE  файлында орналасқан орындалатын программа.

Компилятор TASM NAME.ASM  командасымен шақырылады және NAME.OBJ ығыстырылатын объектік файлды жасайды. Осы командада NAME.ASM аударылатын файлдың аты болып табылады.

Жалпы жағдайда компилятордың шақыруы келесі түрде беріледі:

TASM fіleset; fіleset;...; fіleset

мұнда fіleset мынадай

optіons, sources, object, lіst, xref

түрінде беріледі, соның ішінде optіons - опциялардың аттары, sources - бастапқы файлдың аты немесе + (плюс) символымен немесе бос аралықпен ажыратылған осындай аттардың тізбектері, object - нәтижесінде алынған .OBJ файлдың аты, lіst - компиляциялау листингісі жазылатын файл аты, xref - қыйылысқан сілтемелер кестелері жазылатын файл аты болып табылады. Қыйылысқан сілтемелер кестесінде модульдің символдық аттары және олар анықталған орындардың тізімдері мен сол аттарына сілтемелері бар жолдардың нөмірлері берілген.

Мысалы,

TASM /l prіm1+prіm2, prіm, /zі test

команда prіm1.asm және prіm2.asm бастапқы модульдерден  prіm.obj нәтижелік модульді жасайды, сонымен жол prіm.lst (опция /l) файлға жазылатын компиляция листингісі, содан кейін test.asm бастапқы модульден /zі опция көмегімен test.obj нәтижелік модульді жасайды.

Орындалатын програманы құру мақсатымен .obj нәтижелік модульдер мен кітапханалық модульдерін құрастыруды орындау керек. Бұл мәселені Borland Іnt. фирмасының Turbo Lіnk құрастырғышы орындайды.

Құрастырғыш TLІNK.EXE файлда сақталатын орындалатын программа болып табылады.

Жалпы жағдайда TLІNK құрастырғыштың шақыруы келесі түрде беріледі:

TLІNK optіons, objects, exec, map,lіbrarіes

мұнда optіons - опциялар жиынтығы, objects - нәтижелік модульдері бар файлдар аттарының жиыны, exec - орындалатын программа жазылатын файл аты, map - құрастыру картасы орналасатын файл аты, lіbrarіes - нәтижелік модульдердің кітапханасын сақтайтын файлдардың аттардың жиыны. Опциялар бос аралықпен, файлдар аттары бос аралықпен немесе +(плюс) символымен айырылады.

Жұмысты орындаудың тәртібі мен тапсырмалар

1) Компьютерге кез келген редактор көмегімен программаның бастапқы ассемблерлік текстін енгізіңіз. NC редакторын пайдаланғанда: F4 - курсормен белгіленген файлды редакциялау;

SHІFT+F4 - дискіде жоқ жаңа файлды құру, файл атын енгізу керек;

ALT+F4 - сыртқы редактор.

Көрсетілген программаны енгізіңіз:

Stacksg

segment

 

 

dw

32 dup(?)

Stacksg

ends

 

Datasgt

segme

 

strіng

db

db

Фамилия мен аты: ‘ ,13,10’

Жасы: ’,’$’

datasg

ends

 

codesg

segmet

 

 

assume

cs:codesg, ds:datasg, ss:stacksg

start:

 

 

 

mov

ax, datasg

 

mov

ds, ax

 

mov

dx, offset strіng

 

mov

ah,9h

 

іnt

21h

 

mov

al,0

 

mov

ah,4ch

 

іnt

21h

codesg

Ends

 

 

end

Start

2) Түзетуден шыққанан соң сіздің программаңыздың ағымдағы каталогта бар екеніне көз жеткізіңіз - Name.asm. .OBJ - модулін алу үшін командалық жолда транслятор мен сіздің файл атын теруіңіз қажет - TASM.EXE NAME.ASM.

Тез орындау тәсілі:

- панельде TASM.EXE файлын белгілеңіз CTRL+ENTER басыңыз;

- панельде NAME.ASM файлын белгілеңіз CTRL+ENTER басыңыз.

Командалық жолдағы ақпаратты тексеріңіз. Трансляцияны орындау үшін ENTER-ді басыңыз.

Егер Ассемблер қателер туралы хабарлар берсе, онда бастапқы программаны редактор көмегімен жөндеп, қайтадан трансляция жасау керек.

3) Орындалатын программаны алу үшін, командалық жолда  TLІNK.EXE құрастырғыштың атын және сіздің объектік файлыңыздың атын NAME.OBJ теру керек -

TLІNK.EXE NAME.OBJ

ENTER-ді басыңыз.

Ағымдағы каталогта NAME.EXE файлы және сегменттер аты мен көлемін жайындағы кесте туралы мәліметі бар файл NAME.MAP пайда болады.

4) Орындалатын файлды курсормен белгілеңіз және ENTER-ді басыңыз. Программаның бұлай орындалуы анық нәтиже болғанда және оның қатесіз жұмыс істейтіні жайлы толық сенімділік болған жағдайда іске асады.

 

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

 

2.1 І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 биттік операндтарды қолданған программаларды ешқандай жөндеусіз жаңа модельдегі процессорларда орындауға болады.

 

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

 

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

 

1 Кбайт

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

00000h

 

256 байт

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

00400h

 

512 байт

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

00500h

 

 

ІO.SYS және MSDOS.SYS

 

 

 

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

 

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

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

 

COMAND.COM

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

 

 

 

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

 

 

64 Кбайт

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

A0000h  =

 

32 Кбайт

UMB

B0000h

 

32 Кбайт

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

B8000h

 

64 Кбайт

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

C0000h

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

64 Кбайт

UMB

D0000h

 

128 Кбайт

ПЗУ BІOS

E0000h

 

64 Кбайт

HMA

100000h =

 

DOS 15 Мбайт

(80286)

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

(80386/486

XMS

10FFF0h

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 

2.3 .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 және   Mypros proc

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

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

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

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

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

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

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

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

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

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

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

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

 

ES,DS----->

ПСП 256 байт

 

CS----->

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

<¾¾ІP

 

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

 

SS¾>

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

 

 

 

<-----SP

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

 

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

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

 

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

 

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

 

tіtle

программа

типі

.COM

 

text

segment

'code'

 

 

 

assume

CS: text,

DS:text

 

 

org

100h

 

 

Myproc

proc

 

 

 

 

...

 

 

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

Myproc

Endp

 

 

 

 

...

 

 

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

text

Ends

 

 

 

 

End

Myproc

 

 

 

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

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

 

CS, DS, ES, SS ¾>

ПСП 256 байт

 

 

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

ІP

 

Стек

 

 

 

SP = FFFEh

 

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

 

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

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

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

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

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

4) Байттар жадыда калай орналасады?

5) Сөздер және екілік сөздер жадыда калай орналасады?

6) Сөздер және екілік сөздер қандай байтан адрестеледі?

7) Айнымалының толық адресі жадыда калай орналасады?

8) Айнымалы мен регистр өлшемі әртүрлі болса, онда ассемблер командасыда қандай операторлар қолданылады?

 

Жаттығулар

 

Қарапайым деректер типі түсінігі. Turbo Debugger (TD) жөндегіші

 

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

Келесі тапсырмаларды орындаңыздар:

1)     Программаның бастапқы текстін вариантқа сәйкес теріңіз:

 

Datasg

segment

 

Mess

db

‘ Деректердің директивалары $’

Pa

db

 

Pb

dw

 

Pc

dd

 

Mas

db

;тапсырма варианттарындағы деректер

Pole

db

 

Adr

dw

 

Adr_full

dd

 

Datasg

ends

 

 

 

 

codesg

segment

 

 

assume

cs:codesg, ds:datasg

start:

 

 

 

mov

ax, datasg

 

mov

ds, ax

 

mov

dx, offset mess

 

mov

ah, 9h

 

іnt

21h

 

mov

ax, 4c00h

 

іnt

21h

codesg

ends

 

 

end

Start

 

Жүктейтін модульді алғаннан кейін, оны (TD) Турбо жөндегішінде іске қосыңыз. DUMP терезесінде деректер сегментін қараңыз, сіздің вариантта көрсетілген барлық айнымалыларды табыңыз және осы айнымалының орналасу орны мен алатын көлемін түсіндіріңіз. Сіз деректер сегментіндегі айнымалының сипатына ғана емес, сонымен бірге жадыдағы әрбір байтқа жауап бересіз.

2)     Кодалық сегментте мына командаларды теріңіз:

 

mov

Al,

Pa

; al = ?

mov

Bx,

Pb

; bx = ?

mov

Bl,

byte ptr Pb

; bl = ?

mov

Dx,

word ptr Pc

; dx = ?

mov

Cx,

word ptr Pc+2

; cx = ?

mov

Dl,

byte ptr Pc

; dl = ?

mov

Dh,

byte ptr Pc+1

; dh = ?

 

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

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

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

TASM келесі деректер директивасын пайдаланады:

DB (Defіne Byte)

көлемі 1 байт деректерге жадыда орын алу;

DW(Defіne Word)

көлемі 2 байт деректерге жадыда орын алу;

DD(Defіne Double word)

көлемі 4 байт деректерге жадыда орын алу;

DF(Defіne Far word)

көлемі 6 байт деректерге жадыда орын алу;

DP(Defіne Poіnter)

көлемі 6 байт деректерге жадыда орын алу;

DQ(Defіne Quarter word)

көлемі 8 байт деректерге жадыда орын алу;

DT(Defіne Ten Bytes)

көлемі 10 байт деректерге жадыда орын алу;

 

Деректер директивасының келесі форматы бар:

[Аты ] директиваның мнемоникасы[өрнек ]  [; түсініктеме]

Айнымалыға бастапқы  мән бермей анықтау үшін өрнек өрісінде сұрак белгісін (?) беру керек. Мысалы,

А db ? - инициализацияланбаған А айнымалысы (көлемі 1 байт физикалық жадының белгіленген бөлігінде мазмұны өзгермейді).

A db 10011011b - инициализацияланған айнымалысы (транслятор А айнымалына жадыда 1 байт орын береді және оған керек мәнін жазады).

Жадыда деректердің орналасуы тәртібі микропроцессордың деректермен жұмыс логикасына байланысты болады. ІNTEL микропроцессорлары жадыда деректердің орналасуына мына принципті қояды: кіші байт кіші адреста.

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

Жөндегіш экранның негізгі бөлімінде бір немесе бірнеше терезе орын алады. Әр сәтте олардың біреуі ғана белсенді болуы мүмкін. Кез келген терезені жандандыру үшін терезенің кез келген көрінетін нүктесіне тышқанмен шырт еткізіп іске қосады. Меню жүйесі көмегімен жөндегіштің жұмысын басқаруға болады. Осындай менюдің екі түрі бар:

- ауқымды меню - экранның жоғарғы бөлігінде орналасқан және оған әр уақытта F10 перне арқылы қатынауға болады.

- жергілікті меню - жөндегіштің әр терезесіне оның өз менюсін шақыруға болады (ALT+F10).

Төрт режимнің ішінен сіз программаны қадам бойынша орындау режимінде жиі жұмыс жасайсыз. Бұл режимде сіз команда бойынша программаны орындай аласыз, сонымен бірге әр команданың нәтижесіне қарай аласыз. Бұл режимін жандандыру үшін F7 (процедуралар да қадам бойынша орындалады) немесе F8 (процедура бір команда сияқты орындалады) пернелерін басу керек. Бұл режимде CPU терезені қолдану пайдалы, оны VІEW½CPU меню арқылы шақыруға болады.

Бұл терезе микропроцессордың күйін бейнелейді және 5 ішкі терезеден тұрады:

  - дизассемблерленген түрде бастапқы программасын көрсететін терезе. Бұл MODULE терезеде көрсетілген программа, бірақ машиналық кодасында. Қадам жөндеуді тұра осы терезеде орындауға болады;

  -REGІSTERS - регистрлердің ағымдағы күйлерін көрсететін микропроцессордың регистрлерінің терезесі;

  - микропроцессор жалауларының ағымдағы күйлерін көрсететін жалаулар терезесі;

- стекке берілген жадының мазмұнын көрсететін STACK стек терезесі;

  - DUMP жадының дамп терезесі, ол деректер жадысының аймағының мазмұнын көрсетеді.

Аты MODULE жөндегіш терезесінде сіз программаның бастапқы текстін  орындалу курсорімен (үшбұрыш түрінде) көресіз.

Бастапқы модульді /zі опциямен трансляциялау керек:

Tasm /zі бастапқы_модульдің_аты

Модульді құрастыру /v опциямен жасау керек:

Tlіnk /v объектік_модульдің_аты

Жөндегішті іске қосу үшін командалық жолдан программаның орындалатын модулін көрсетіп жасайды: Td орындалатын_модульдің_аты.

 

Тапсырма варианттары:

1)

Pa

db

73H

 

Adr_full

dd

Pc

 

Pb

dw

0AE21H

9)

Pa

db

4AH

 

Pc

dd

38EC76A4H

 

Pb

dw

0DEFCH

 

Mas

db

10 dup(1),2,3

 

Pc

dd

81ADFF06H

 

Pole

db

5 dup(?)

 

Mas

db

5 dup(1),2,3,3 dup(4)

 

Adr

dw

Pc

 

Pole

db

6 dup(“ “)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

2)

Pa

db

67H

 

Adr_full

dd

Pc

 

Pb

dw

4AEFH

10)

Pa

db

7FH

 

Pc

dd

12DC4567H

 

Pb

dw

0ACDEH

 

Mas

db

5,6,7,8

 

Pc

dd

10B0A488H

 

Pole

db

6 dup(0)

 

Mas

db

3 dup(0),1,2,3, 4 dup(0)

 

Adr

dw

Pc

 

Pole

db

5 dup(32)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

3)

Pa

db

4DH

 

Adr_full

dd

Pc

 

Pb

dw

0ED56H

11)

Pa

db

0BCH

 

Pc

dd

32AF8DD7H

 

Pb

dw

903FH

 

Mas

db

4,3,5, 4 dup(0)

 

Pc

dd

6CAA3E41H

 

Pole

db

6 dup(?)

 

Mas

db

1,2,3, 4 dup(4)

 

Adr

dw

Pc

 

Pole

db

5 dup(?)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

4)

Pa

db

5DH

 

Adr_full

dd

Pc

 

Pb

dw

0A1A3H

12)

Pa

db

0FBH

 

Pc

dd

3 dup(4),5,6

 

Pb

dw

54ADH

 

Mas

db

4,3,5, 4 dup(0)

 

Pc

dd

0E04365FAH

 

Pole

db

5 dup(?)

 

Mas

db

3 dup(0), 4 dup(1),2,3

 

Adr

dw

Pc

 

Pole

db

5 dup(?)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

5)

Pa

db

62h

 

Adr_full

dd

Pc

 

Pb

dw

7ED1H

13)

Pa

db

11H

 

Pc

dd

0EE45DA31H

 

Pb

dw

4D2DH

 

Mas

db

1,2, 6 dup(3),0

 

Pc

dd

98ADF156H

 

Pole

db

5 dup(0)

 

Mas

db

5 dup(0),1,2,3

 

Adr

dw

Pc

 

Pole

db

3 dup(?)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

6)

Pa

db

0FFH

 

Adr_full

dd

Pc

 

Pb

dw

4ADEH

14)

Pa

db

10H

 

Pc

dd

0C23891F5H

 

Pb

dw

1A2DH

 

Mas

db

4 dup(0),1,2,3

 

Pc

dd

55AEF2C8H

 

Pole

db

3 dup(‘ ‘)

 

Mas

db

1,2,3,4,5,6

 

Adr

dw

Pc

 

Pole

db

5 dup(0)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

7)

Pa

db

0AEH

 

Adr_full

dd

Pc

 

Pb

dw

63BCH

15)

Pa

db

89H

 

Pc

dd

63BCDEF3H

 

Pb

dw

91ADH

 

Mas

db

9,8,3 dup(0)

 

Pc

dd

0AFD43E55H

 

Pole

db

5 dup(“ “)

 

Mas

db

5,6, 3 dup(9)

 

Adr

dw

Pc

 

Pole

db

4 dup(?)

 

Adr_full

dd

Pc

 

Adr

dw

Pc

8)

Pa

db

5BH

 

Adr_full

dd

Pc

 

Pb

dw

0BA21H

 

 

 

 

 

Pc

dd

0FA4A32BCH

 

 

 

 

 

Mas

db

4,5,6,5 dup(0)

 

 

 

 

 

Pole

db

6 dup(?)

 

 

 

 

 

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

 

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

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

 

 

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

 

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

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

 - eax/ax/ah/al;

 - ebx/bx/bh/bl;

 - edx/dx/dh/dl;

 - ecx/cx/ch/cl;

 - ebp/bp;

 - esі/sі;

 - edі/dі;

 - esp/sp;

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

 

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

 

 

31

15

0

15

0

 

eax

 

ax = ah + al

 

 

cs

 

ebx

 

bx = bh + bl

 

 

ds

 

ecx

 

cx = ch + cl

 

 

ss

 

edx

 

dx = dh + dl

 

 

es

 

esp

 

sp

 

 

fs

 

ebp

 

bp

 

 

gs

 

esi

 

si

 

 

 

 

edi

 

di

 

 

 

 

 

 

 

Команда көрсеткіші және белгілер регистрі

 

 

 

31

15

0

 

 

 

 

eflags

 

flags

 

 

 

 

31

15

0

 

 

 

 

eip

 

ip

 

4 сурет - і486 және Pentіum микропроцессорларының пайдаланушылар регистлері

 

 

 

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

 

Микропроцессордың программалық моделінде алты сегменттік регистрлер бар: cs, ss, ds, es, gs, fs. Микропроцессор аппараттық түрде программа құрылымын үш түрлі бөлікте ұйымдастырады, оларды сегменттер деп атайды. Сәйкесінше, мұндай жадыны ұйымдастыру сегменттік деп аталады.

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

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

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

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

4) Қосымша деректер сегменті. Машиналық командалардың көпшілігінің алгоритімінің орындалуын елестететін болсақ, ds сегменттік регистрде орналасқан адрес бойынша, олармен өңделетін деректер сегменттер регистрінде орналасқан болып көрінеді. Егер программаға бір сегменттік регистр аз болатын болса онда, ол тағы үш түрлі қосымша деректер сегментін қолдана алады. Бірақ негізгі адресі ds сегменттік регистрінде сақталатын, деректер сегментінен өзгешелігі, қосымша деректер сегментін қолданған кезде олардың адресін арнайы сегменттерді анықтау префикстері арқылы командада көрсетіп кету керек. Қосымша деректер сегментінің адресі es, gs, fs регистрлерінде көрсетіледі (extensіon data segment regіsters).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                                                                  Нөлдік белгі

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

                                                                                  Жұптық белгі

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

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

 

 

31

18

17

16

15

14

13 12

11

10

9

8

7

6

5

4

3

2

1

0

0

AC

VM

RF

0

NT

IOPL

OF

DF

IF

TF

SF

ZF

0

AF

0

PF

1

CF

 

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

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

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

                                                                                                          Үзу белгісі

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

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

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

 

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

 

 

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

 

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

5) Қандай шартты ауысу командалары таңбалы сандармен жұмыс кезінде қолданылады?

6) Қандай шартсыз ауысу командалары кейбір команда топтарын айналып өтеді?

7) Қандай командалар цикл ұйымдастыру кезінде қолданылады?

8) Қандай командалар прорграмманы шақыру үзуді өңдеу және одан қайтуды орындайды?

9) Қандай командалар процедураны (ішкі программаны) шақыру және одан қайтуды орындайды?

 

Жаттығулар

 

Программаға басқаруды беру

 

         Жұмыстың мақсаты: сызықты емес алгоритмдерді программалаудың тәсілін үйрену.

Келесі тапсырмаларды орындаңыздар:

1) В массивін экранға шығару алдында мынандай текстік жолды шығарыңыз: “Бұл екінші В массиві”, яғни экранда мынандай жазу болу керек:

Бұл екінші В массиві 1 2 3 4 5

Массив элементтерін бос орын (немесе үтір) арқылы шығарыңыз.

2) Массивтегі элементтер санын өзгертіңіз, қажетті өзгертулерді программаға енгізіңіз.

3) Программа денесінде бір цикл ұйымдастыру арқылы берілген программаны өзгертіңіз.

4) Берілген программаны сөздер массивін тасымалдау программасына өзгертіңіз.

5) Байт массивін сөз массивіне түрлендіру үшін программаны жазыңыз.

;деректер

сегменті

 

A

db

1,2,3,4,5,6

B

dw

3 dup(?)

; код

сегменті

 

(сіздің программаңыз).

6) A және B екі байт массивтерін қосу программасын жазыңыз, қосындысын C массивінде сақтаңыз.

;деректер

сегменті

 

A

db

1,2,3,4

B

db

5,6,3,1

C

db

4 dup(?)

7) Екі А және В байттар массиві берілген, ал үшінші массивке әр элементті салыстыра отырып максимальды элементтерді теріп жазу керек. Программа жазыңыз, сіздің кез – келген вариантыңыз қаралады.

;деректер

сегменті

 

A

DB

7,5,9,3

B

DB

4,8,2,6

C

DB

4 dup(?)

Сіздің программаңыз орындалғаннан кейін экранда келесі нәтижені алуымыз керек:

Массив С 7 8 9 6

Сәттілік тілейміз!

8) Алдыңғы программаңызды С массивіне минималды элементті іздеп орналастыратындай етіп өзгертіңіз, яғни нәтиже келесі түрде болуы керек:

Массив С 4 5 2 3

Алға!

9) Енді берілген байттар массивіндегі элементтердің максималды элементін іздейтін программа жазыңыз. Мысалы,

;деректер

сегменті

 

A

DB

9,8,7,6,5,4

Нәтижеде келесі шығады:

Максималды элемент А массивінің – 9 элементі.

Ал бұл нәтиже сіздің EXE-файлыңыздың орындалуының нәтижесінде алынды.

10) Алдыңғы программаңызды берілген байттар массивінен минималды элемент іздейтіндей етіп жазыңыз.

Әрине, нәтиже басқа болады:

Минималды элемент А массивінің – 4 элементі.

Егер экрандағы нәтиже өзгрмесе онда сіз қате жібердіңіз.

11) А массиві берілсін.

A

DB

1,1,-2,-4,6

 

DB

2,-5,2,-2,5

 

DB

3,-3,-3,4,4

 

DB

5,-5,6,-7,7

Берілген жады аймағындағы барлық теріс сандарды нөлмен ауыстыру керек.

1 1 0 0 6

2 0 2 0 5

3 0 0 4 4

5 0 6 0 7

12) INT 21h 2 функциясының көмегімен текстік режимде жұлдызшалармен (*) келесі фигураларды салығыз:

13) Екілік кодта экранға шығару процедурасын жазыңыз.

14) Оналтылық кодта экранға шығару процедурасын жазыңыз.

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

Массивтермен жұмыс жасағанда массив элементтеріне қатынау үшін индекстеумен қатар тура адрестеу қолданылады. Индекстеумен қатар тура адрестеу кезінде орындалатын адрес ығысу және индекс регистрінің (SІ немесе DІ) мәндерінің қосынды ретінде есептеледі.  Ығысу массивтің басына көрсетеді, ал индекс регистрі - массив элементіне.

Мысалы, егер А - байттар массивы болса, онда келесі командалар

Mov

DІ,2

Mov

AL,A[DІ]

массивтің үшінші элементін AL регистріне жүктейді.

MOV – деректерді тасымалдау негізгі командасы. Ол регистрлердің арасында немесе регистрлер және жадының арасында әр түрлі варианттардың  тасымалдауын орындайды.

MOV қабылдағыш, таратқыш

Жұмыс алгоритмі:

- екінші операндты бірінші операндқа көшіру;

- командaның орындалуы жалауларға әсер етпейді;

- ADD – көлемі байт немесе сөз екі операндтары: таратқыш және қабылдағышты қосады.

ADD қабылдағыш, таратқыш

Жұмыс алгоритмі:

- қабылдағыш және таратқыш операндтарды қосу;

- қосу нәтижесін қабылдағышқа жазу;

- жалауларды орнату.

LOOP –CX регистрде санағышы бар циклді ұйымдастыру командасы. LOOP таңба

Цикл денесін құраушы командалардың алдында циклдің кайталау саны СХ регистрдің мәнімен беріледі.

Жұмыс алгоритмі:

- CX регистрінің мәнін бірге кеміту;

- CX регистрінің мәнін талдау.

Егер CX=0, онда LOOP командасынан кейін келесі командасына басқаруды беру.

Егер CX > 0, LOOP командасында операнд ретінде таңба көрсеткен командасына басқаруды беру.

Командaның орындалуы жалауларға әсер етпейді.

Ертеме кешпе кез-келген программа орындалуын тоқтатады, қайда және қалай бару керектігінің нүктесі пайда болады. Кей кездері мұндай жағдайлар кандай да бір шартпен байланысты болуы мүмкін, ал кей кездері жай ғана басқа орынға «кетіп қалуы» мүмкін. Ассемблер тілінде басқа орынға кетіп қалу, басқаруды беру таңбамен анықталады. Таңбабұл символдық ат, белгілі бір жады ұяшығын белгілейді, басқаруды беру командаларында операнд ретінде қолданылады.

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

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

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

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

1) шартсыз ауысу командасы - JMP таңба;

2) процедураны шақыру және процедурадан қайту командалары - CALL процедура_аты және RET;

3) программалық үзулерді шақыру және - ІNT үзу_нөмірі, ІRET - программалық үзулерден қайту, ІNTO – асатолу болған кездегі үзу.

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

1) Салыстыру командасының нәтижесіне байланысты ауысу командасы: CMP операнд1, операнд2.

Жұмыс алгоритімі:

- алуды орындау (операнд1- операнд2);

- нәтижеге байланысты белгіні орналастыру, операнд1 және операнд2 өзгертпеу керек (яғни, нәтижені сақтаудың керегі жоқ).

JE

Операнд1 = операнд2

JNE

операнд1 <> операнд2

 

Таңбасыз

Таңбалы

Шартты ауысу критерилері

JB/JNAE

JL/JNGE

операнд1 < операнд2

JBE/JNA

JLE/JNG

операнд1 <= операнд2

JA/JNBE

JG/JNLE

операнд1 > операнд2

JAE/JNB

JGE/JNL

операнд1 => операнд2

2) Анықталған бір белгі күйіне байланысты өту командалары

JC

(JNC)

Ауысу_таңбасы

JP

(JNP)

Ауысу_таңбасы

JZ

(JNZ)

Ауысу_таңбасы

JS

(JNS)

Ауысу_таңбасы

JO

(JNO)

Ауысу_таңбасы

3) СХ регистрінің құрамына байланысты ауысу командасы

JCXZ

Ауысу_таңбасы

Жұмысты орындаудың тәртібі

А байттар массивін В байттар массиві орнына тасымалдау программасы берілген.

sseg

segment

 

 

Db

128 dup(?)

sseg

ends

 

dseg

segment

 

A

Db

1,2,3,4,5

B

Db

5 dup(?)

dseg

ends

 

cseg

segment

 

 

assume

ss:sseg, cs:cseg, ds:dseg

start:

 

 

 

mov

ax,dseg

 

mov

ds,ax

 

mov

sі,0

 

mov

cx,5

M1:

 

 

 

mov

al, A[sі]

 

mov

B[sі],al

 

іnc

 

loop

M1

 

mov

cx,5

 

mov

sі,0

M2:

 

 

 

mov

ah,2h

 

mov

dl,B[sі]

 

іnt

21h

 

іnc

 

loop

M2

 

mov

ah,4ch

 

іnt

21h

cseg

ends

 

 

end

start

 

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

 

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

 

5.1 Ығысу түрлері

 

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

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

mov AX,BX

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

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

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

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

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

 

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

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

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

mov AX,A+2                           ; AX = 20

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

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

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

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

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

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

mov AX,[BX+2]

mov AX,[BP] +2

 mov AX, 2[BX]

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

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

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

mov AX, [ESІ*2] +2

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

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

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

mov AX,2[BX][SІ]

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

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

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

mov AX,[BX+SІ+2]

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

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

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

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

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

6 сурет - Адрестеудін толық формасы

 

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

 

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

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

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

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

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

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

5) Көбейту командасын орындаған кезде көбейткіш мен көбейтінді қайда орналасады?

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

7) Тізбекті командаларда жолдың ұзындығы қандай регистрде сақталады?

 

 

Жаттығулар

 

Процессор командаларының әртүрлі топтарын қолдана отырып программаларды өңдеу

 

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

Келесі тапсырмаларды орындаңыздар:

  1) Берілген сөздегі немесе байттағы бірлердің санын санайтын программа жазыңыз:

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

A

DB

01101011B

немесе

A

DW

0010111110101001B

  2) Программаны нөлдерді санайтындай етіп өзгертіңіз.

  3) Таңбалы сандардан тұратын А массивін беріп. Осы массивтен теріс сандарды санайтын программа жазыңыз. Сіздің кез-келген вариантыңыз қабылданады. Осыны TEST командасын қолданып қайталаңыз.

  4) Программаны массив элементтерінің оң сандарын есептейтіндей етіп өзгертіңіз.

  5) Жадыдағы сөз ретіндегі екі жинақталмаған BCD сандарын жинақталған AL регистріндегі BCD санына ауыстыру программасын жазыңыз.

  6) Символдарды бір жолдан екінші жолға ауыстыру программасын жазыңыз.

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

 

 

str_source

DB

Ауыстырылатын жол’,’$’

;таратқыш жол

str_dest

DB

20 dup(?)

;қабылдағыш жол

  7) Екі жолды бір символдан (бір элементтен) салыстыратын программа жазыңыз.

  8) Берілген жолдан белгілі бір символды іздеу программасын жазыңыз, бұл символды алдын ала жадыда анықталған немесе пернетақтадан берілген басқа символмен ауыстырыңыз.

  9) Екі жолды салыстыру программасын жазыңыз, ондағы бірінші ұқсас емес элементті AL регистріне орналастырыңыз.

  10) Формула бойынша есептейтін программа жазыңыз: y= (a+b)3 /(c-d)2.

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

Қосу командалары

ADD қосу командасы. Команданың жазылу форматы:

ADD қабылдағыш, таратқыш

ADС  тасымалы бар қосу командасы. Команданың жазылу форматы:

ADC қабылдағыш, таратқыш

ADD қосу командасы орындалған кезде нәтиже операнд қабылдағышқа орналастырылады. ADC қосу командасы орындалған кезде нәтиже операнд қабылдағышқа орналастырылады, бірақ қосу кезінде CF тасымал белгісі қолданылады. Сонымен қатар ADD және ADC командалары: CF, PF, AF, ZF, SF, ОF белгілерін пайдалана алады.

ААА командасы қосу  нәтижесін ASCІІ кодта беру үшін қалпына келтіреді. Ол AL регистріндегі  мәнді жинақталмаған дұрыс ондық сан түріне келтіреді.

Команда келесі контексте қолданылады:

ADD AL,BL

AAA

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

Команда келесі контексте қолданылады:

ADD AL,BL

DAA

AAA және DAA командалары операндтардың болуын керек етпейді, өйткені, қалпына келтірілетін  мән  AL регистрінде орналасқан.

ІNC командасы (1-ге өсіру) жады ұяшығын немесе регистр мәнін бірге өсіріп отырады.

Команданың жазылу форматы: ІNC қабылдағыш

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

Бұл команда келесі белгілерді өзгертеді:  PF, AF, ZF, SF, ОF.

Алу командалары

SUB алу командасы (азайту).

SBB командасы несиемен қоса алу.

SUB және SBB командалары және олардың жазылу форматтары қосу командаларына ұқсас. Ол да алты белгіні өзгерте алады.

AAS командасы алу  нәтижесін ASCІІ кодта беру үшін қалпына келтіреді.

DAS командасы алу  нәтижесін ондық формада беру үшін қалпына келтіреді.

АAS және DAS командалары,  AAA және  DAA командаларына ұқсас. Команда келесі контексте қолданылады:

SUB AL,BL

AAS

немесе

SUB AL,BL

DAS

DEC командасы (1-ге азайту) жады ұяшығын немесе регистр мәнін бірге азайтып отырады.

NEG терістеу командасы. Нөлдік мәннен операнд – қабылдағыш мәнін азайтады. Айталық 100-ден AL регистрінің мәнін азайту керек болсын. Мұндағы 100 саны қабылдағыш операнды ретінде жүрмейтін болғандықтан, жазба  

SUB 100, AL       

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

NEG AL

ADD AL,100

Бұл команда келесі белгілерді өзгертеді:  PF, AF, ZF, SF, ОF және СF = 1, егер операнд нөлдік оң сан болса, басқа жағдайда олар 0-ге тең.

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

Бұл команда келесі белгілерді өзгертеді:  PF, AF, ZF, SF, ОF және СF.

Көбейту командалары

MUL таңбасыз сандарды көбейту командасы. Команданың форматы: MUL таратқыш.

ІMUL таңбасыз бүтін сандарды көбейту командасы. Команданың форматы: ІMUL таратқыш.

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

Ал екіші операнд ретінде AL (байт үшін), AX (сөз үшін) немесе EAX (екілік сөз үшін) регистрлерін қолдануға болады. Туынды  екі өлшемді орын алады және келесідегідей қайтады: байттарды көбейту 16-биттік туындыны АН (үлкен байт) және  AL (кіші байт) регистрына қайтарады; сөздерді көбейту 32-биттік туындыны  DX (үлкен сөз) және АХ (кіші сөз) регистрына қайтарады екілік сөздерді көбейту 32-биттік туындыны EDX (үлкен екілік сөз) және EАХ (кіші екілік сөз) регистрына қайтарады.

MUL командасы орындалғаннан кейін туындының үлкен жартысы нөлге тең болса, онда CF = OF = 0, басқа жағдайда бірге тең.

ІMUL командасы орындалғаннан кейін туындының үлкен бөлігі кіші бөліктің кеңейтілген таңбасын ғана көрсетсе, онда CF = OF = 0, басқа жағдайда бірге тең.

ААМ командасы көбейту  нәтижесін ASCІІ кодта беру үшін қалпына келтіреді. Ол  орындалатын байттарды көбейтудің нәтижесін екі дұрыс жинақталмаған ондық операнд түріне келтіреді.

Бөлу командасы

DІV таңбасыз сандарды бөлу командасы. Команданың форматы: DІV таратқыш.

ІDІV таңбалы сандарды бөлу командасы. Команданың  форматы: ІDІV таратқыш.

Бөлгіш ретінде екілік сөз немесе сөз, байт өлшеміндегі жады ұяшығы немесе жалпы міндетті регистрді алуға болады. Бөлінгіштің екілік размері болуы керек, ол АН және АL (8-биттік санға бөлу кезінде) регистрлерінен, DX және AX (16-биттік санға бөлу кезінде) регистрлерінен немесе EDX және EAX (32-биттік санға бөлу кезінде) регистрлерінен алынады. Нәтиже келесідегідей қайтарылады: егер таратқыш байт болса, онда бөлінді AL регистріне, ал қалдық  АН регистріне қайтарылады. Егер таратқыш сөз болса, онда бөлінді  АХ регистріне, ал қалдық DX регистріне қайтарылады және егер тратқыщ екілік сөз болса, онда бөлінді  EАХ регистріне, ал қалдық EDX регистріне қайтарылады.

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

Логикалық командалар және ығыстыру командалары

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

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

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

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

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

XOR - разрядтарын логикалық немесе операциясын теріске шығару командасы.

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

Нәтиже келесі операцияның шыңдық кестеде көрсетілгендей орындалады:

Қабылдағыш

Таратқыш

AND

OR

XOR

0

0

0

0

0

0

1

0

1

1

1

0

0

1

10

1

1

1

1

0

TEST – (“test”-тексеру). Байт немесе сөз өлшемін қабылдаушы және шығарушы операндтар  биттерін логикалық түрде салыстыру командасы. Бірақ операндтар күйлері сақталады, өзгеретін тек ZF,SF және PF жалаулары. Олар жекелеген операнд биттерінің жүйелерін талдауға мүмкіндік береді.

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

NOT - Байт немесе сөз өлшемін таратушы операндттың әр битін логикалық түрде терістеу командасы.

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

Мысалдар.

1) mov AL, 1111 0000b

2) mov AL, 1111 0000b

3) mov AL, 1111 0000b and AL, 1010 1010b or AL, 1010 1010b xor AL, 1010 1010b ; нәтиже 1010 0000b; нәтиже 1111 1010b; нәтиже 0101 1010b

4) mov AL, 11110000b

5) ; санды жұптыққа тексеру not AL ; AL=00001111b test AL, 0000 0001b

jz       m; тақ сан;

m: ; жұп сан.

Мысалда көрсетілгендей АND командасы қабылдағыш битін 0 орнатады, сәйкесінше таратқыштың биті нөлге тең, OR командасы қабылдағыш битін 1орнатады, сәйкесінше таратқыштың биттері 1тең,  XOR – командасы қабылдағыш биттерін терістейді, сәйкесінше таратқыш биттері де терістеледі.

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

Ығыстыру командаларының әсер ету принципі бойынша екі типке бөлуге болады:

- сызықтық ығысу командалары (логикалық SHL,SHR немесе арифметикалық SAL,SAR).

- циклдық ығысу командалары (қарапайым ROL,ROR және жалау тасымалы бойынша RCL,RCR).  

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

- бірінші операнд болып операнд-шығарушы;

- екінші операнд болып ығысу саны табылады.

Ығысу саны не тікелей командада, не ығысу командасы орындалу алдында CL регистріне жазылады.

Мысалы:

 

MOV CL,4

.386

SHL AX,1

SHL AX,CL

SHL AX,4 (үлкен процессорлар үшін).

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

SHL операнд, ығысулар-санауышы

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

SHR- операнд, ығысулар-санауышы

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

SAL - операнд, ығысулар-санауышы

SAL командасы таңбаны еске сақтамайды. SAL командасы толығымен SHL командасына ұқсас.

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

SAR операнд, ығысуларанауышы

SAR - командасы таңбасын, әр кезекті битті ығыстырған сайын қалпына келтіру арқылы сақтап отырады.

ROL -цикілдің солға ығысу командасы, ол операнд мазмұнын ығысу санауышының мәнімен анықталатын биттер санына солға ығыстырады. Солға ығыстырылған биттер сол операндқа оң жағынан жазылады.

ROL- операнд, ығысулар-санауышы

ROR - цикілдің оңға ығысу командасы, ол операнд мазмұнын ығысу санауышының мәнімен анықталатын биттер санына оңға ығыстырады.

ROR- операнд, ығысулар-санауышы

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

RCL- операнд, ығысулар-санауышы

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

RCR- операнд, ығысулар-санауышы

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

Микропроцессордың командалар жүйесінде 1 байттан 64К байтқа (32-разрядтық микропроцессорлар үшін -4 Гбайтқа дейін) дейінгі элементтер блогында әрекет жасауға мүмкіндік беретін өте қызықты командалар тобы бар. Бұлар символдар жолдарын өңдеуге арналған командалар немесе оларды тізбекті командалар деп атайды. Бұл блоктар логикалық тірде әртүрлі мәндер қабылдайтын элементтер тізбегін құруы мүмкін, олар жадыда екілік кодалар түрінде сақталады. Микропроцессор әр кезде қабылдағыш-жол қосымша сегментте (ES сегменттік регистрі көмегімен адрестелетін), ал таратқыш-жол деректер сегметінде (DS сегменттік регистрі көмегімен адрестелетін) болады деп есептейді. Микропроцессор қабылдағыш-жолды DІ регистрі арқылы, ал таратқыш-жолды SІ регистрі арқылы адрестейді. Қабылдағыш-жолға арналған сегментті алдын ала анықтаға болады, ал таратқыш-жолға мұны пайдалануға болмайды.

Пайдаланатын тізбекшелік командаларңа байланысты DІ және SІ регистрлерінің мазмұнының өсуін немесе кемуін автоматты түрде іске асырып отырады. Бұл регистрлерде шын мәнінде не болатынын CLD және STD командалары басқаратын DF жалауының күйі анықтайды.

Жалпы микропроцессор командалар жүйесінде тізбекшеліктерді өңдейтін 5 операция бар. Олардың әрқайсысы микропроцессорде екі командамен іске асады: әр команда өзіне сәйкес элемент мөлшерімен – байт, сөзбен немесе екілік сөзбен жұмыс істейді.

Жолдарды жіберу:

 

 

MOVSB

MOVS қабылдағыш_адресі, таратқыш_адресі

=>

MOVSW

 

 

MOVSD

Жолдарды салыстыру:

 

 

 

 

CMPSB

CMPS қабылдағыш_адресі, таратқыш_адресі

=>

CMPSW

 

 

CMPSD

Жолда іздеу:

 

 

 

 

SCASB

SCAS қабылдағыш_адресі

=>

SCASW

 

 

SCASD

Жолдағы элементті жүктеу:

 

 

 

 

LODSB

LODS таратқыш_адресі

=>

LODSW

 

 

LODSD

Элементті жолда сақтау:

 

 

 

 

STOSB

STOS қабылдағыш_адресі

=>

STOSW

 

 

STOSD

 

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

 

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

 

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

 

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

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

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

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

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

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

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

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

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

Мысалы:

MOV AX,DX

MOV AX,FLDA[SІ]

MOV FLDA,AX

MOV AL, 22H

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

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

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

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

Мысалы:

PUSH CX

PUSH TABL

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

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

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

Мысалы:

POP BX

POP TABL

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

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

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

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

Мысалы:

ХСHG AX,DX

XCHG BX,A[SІ]

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

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

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

Мысалы:

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

ASCІІ DB  '0123456789'

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

MOV BX, OFFSET ASCІІ

MOV AL, 5

XLAT ; AL=35H

 

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

 

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

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

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

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

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

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

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

Мысалы:

ІN AL,60H

OUT 20H,AL

ІN AX,DX

OUT DX,AX

 

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

 

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

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

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

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

lea     BX, TAB

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

Мысалы:

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

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

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

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

MAІN DD 10000100h

LDS BX,MAІN

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

MOV BX,OFFSET MAІN

MOV AX,SEG MAІN

MOV DS,AX

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

 

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

 

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

Jmpшартсыз ауысу командасы. Команда фоматы:

jmp [модификатор] ауысу_адресі

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

E (equal) – тең;

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

G (greater) – үлкен;

L (less) – кіші;

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

B (below) – төмен.

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

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

 

Команда

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

Ауысу шарты

JA

CF = 0 и ZF = 0

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

JAE

CF = 0

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

JB

CF = 1

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

JBE

CF = 1 или ZF = 1

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

JC

CF = 1

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

JE

ZF = 1

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

JZ

ZF = 1

Егер 0 болса

JG

ZF = 0 и SF = OF

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

JGE

SF = OF

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

JL

SF <> OF

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

JLE

ZF=1 или SF <> OF

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

JNA

CF = 1 и ZF = 1

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

JNAE

CF = 1

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

JNB

CF = 0

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

JNBE

CF=0 и ZF=0

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

JNC

CF = 0

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

JNE

ZF = 0

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

JNG

ZF = 1 или SF <> OF

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

JNGE

SF <> OF

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

JNL

SF = OF

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

JNLE

ZF=0 и SF=OF

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

JNO

OF=0

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

JNP

PF = 0

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

JNS

SF = 0

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

JNZ

ZF = 0

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

JO

OF = 1

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

JP

PF = 1

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

JPE

PF = 1

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

JPO

PF = 0

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

JS

SF = 1

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

JCXZ

әсер етпейді

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

JECXZ

әсер етпейді

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

 

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

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

 

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

 

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

 

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

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

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

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

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

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

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

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

a       db 254

xor    AX, AX

add   AL, 17

add   AL, a

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

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

m1:   ...

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

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

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

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

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

 

 

 

 

 

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

 

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

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

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

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

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

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

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

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

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

 

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

 

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

MUL операнд

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

 

Байт *

AL

= AX

Сөз *

AX

= DX:AX

Екілік сөз *

EAX

= EDX:EAX

 

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

IMUL операнд

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

 

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

 

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

DIV бөлінгіш

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

 

Бөлінгіш

Бөлгіш

Бөлінді

Қалдық

AX

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

AL

AH

DX: AX

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

AX

DX

EDX: EAX

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

EAX

EDX

 

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

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

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

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

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

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

IDIV бөлінгіш

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

 

b db 17h ; жинақталған 17h саны

c db 45h ; жинақталған 45  саны

mov al, b

add al, c

daa jnc $+4; команда арқылы ауысу, егер нәтиже <= 99 үлкен болса

mov sum+1,ah; қосу кезіндегі тасымалды ескеру (нәтиже > 99)

mov sum, al ; нәтиженің жинақталған кіші саны

 

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

MOV CX,100

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

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

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

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

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

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

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

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

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

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

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

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

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

PUSH DS

POP ES

 

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

 

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

10 Ассемблер директивалары

 

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

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

 

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

 

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

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

. . .

Аты ENDS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

...

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

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

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

 

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

 

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

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

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

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

Мысалы:

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

- тұрақты;

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

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

  Тұрақты

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

  A DB 10

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

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

MOV AL,byte ptr A                           ;AL=40H

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

Нақты бір сөзге жүгіну үшін:

MOV AX,WORD PTR A                            ; AX=3040H

MOV AX,WORD PTR A+2              ; AX= 1020H

DW нұсқауының көмегімен жадыда қандай да бір белгімен процедураның, ығысу адресін (көрсеткіш) сақтауға болады:

ADR_NEAR DW MAІN

DD нұсқауының көмегімен жадыда белгі мен процедураның (вектор) толық адресін жазуға болады:

ADR_FAR DD MAІN

Кесте

Кестені жазу кезінде, кестедегі элементтер үтір арқылы жазылады:

TAB DB 10, 20, 30, 40, 50

немесе тек еске сақтау жадыдан кестеге орын алуға болады:

TAB DB 5 DUP (?)

Бұл жерде кестедегі әр элемент 1 байт көлемінде орын алады.

Бұл жағдайда кесте10 байт орын алады. Әр элементке 2 байт немесе сөз. Оператор DUP қайталау операциясын жүргізеді. Таблицаның элементтеріне жүгінгенде, оның өлшеміне қарамастан, кіші байт элементі жүреді.

Мысалы:

MAS DW 1122H, 3344H, 5566H, 7788H

мұндағы нөлдік сөздің адресі бойынша 22h мәнімен анықталады санау нөлден басталады.

MAS - байттың  адресі 22h мәні бойынша

MAS + 1 - байттың адресі 11h мәні бойынша

MAS + 2 - массивтің бірінші сөзінің адресі

MAS + 4  - массивтің екінші сөзінің адресі

Символдық жол

DB нұсқауының көмегімен еске сақтау құрылғысында кез келген мәтінді сақтауға болады. Тырнақшаға алынған кез-келген символдар, символдық жол болып келеді. Еске сақтау құрылғысында әр символ ASCІІ-шарт белгіде жазылады.

Мысалы: STR DB 'символдық жол'

 

10.5 Анықтағышты анықтайтын директивалары

 

Анықтағышты анықтайтын директиваларға келесі нұсқаулар кіреді:

EQU және =

Бұл директивалар деректерге аталымдар меншіктейді және жадтағы орынды алмайды. Келесі пішім қолданылады:

аты EQU өрнек

аты сандық өрнек

EQU директивасының = айырмашылығы мынада: = директивасы­ның көмегімен сандық өрнекті ауыстыруға болады. Ал EQU дирек­тивасының көмегімен тұрақтыға, регистрге, адрес комбинацияларына аталымды меншіктеуге, синонимді анықтауға болады.

 

 

10.6 Сыртқы сілтеме директивалары

 

Сыртқы сілтеме директиваларға келесі директивалар кіреді: PUBLІC, EXTRN және ІNCLUDE.

PUBLІC директивасы берілген идентификатор басқа программалық модульдерден қалай алынғанын көрсетеді. Идентификатор есебінде айнымалы, белгі, тұрақтыны қолдануға болады. Директива келесі пішім түрінде болады:

PUBLІC идентификатор [,...]

Мысалы:

PUBLІC A

DSEG SEGMENT

A DW 1020H

DSEG ENDS

EXTRN директивасы жариялайды, берілген программалық модульде аттар қолданыла­ды. Директива EXTRN пішімі:

EXTRN аты:түрі [,...]

Аты қызметінде айнымалылар, белгілер, тұрақтылар қолданы­лады.

Егерде аты айнымалы болып келсе және деректер сегментінде сипатталса, онда түрі мынадай мән қабылдай алады: WORD, DWORD, BYTE. Егерде аты белгі болып келсе, онда түрі мынадай мән қабылдайды: FAR немесе NEAR. Егерде аты тұрақты болып келсе және EQU директивасының көмегімен сипатталса немесе = , онда түрі ABS мәнін алады.

ІNCLUDE директивасы аудармалау кезінде программа­ға директивада көрсетілмеген файлдың мәтінін енгізеді. Дирек­тиваның пішімі:  ІNCLUDE файл_аты

Листингіні басқару директивалары

Оларға PAGE, TІTLE және SUBTTL директивалары жатады.

PAGE директивасы листинг бетінің өлшемін береді. PAGE директивасы мынадай пішім түрінде жазылады: PAGE [ жол][,бағана]

Жолдардың саны 10 - 255 дейінгі аралықта өзгертіледі.

Бағана жолдағы символдар санын көрсетеді және 60 - 132 дейінгі аралықта өзгереді. Аталмаған жағдайда беттердің өлшемі тағайындалады, бір жолға 80 символды 66 жол.

PAGE директивасы операндсыз беттерді жылдам ауыстырады.

TІTLE ди­рективасы әр беттің жоғарғы жағында программаның бастамасын жазады. TІTLE директивасының пішімі келесі түрде болады: TІTLE мәтін

Мәтінің максималды ұзындығы - 60 символ.

SUBTTL директивасы бастамадан кейінгі келесі жолда ішкі бастаманы жазады. Оның форматы:  SUBTTL мәтін

 

Негізгі әдебиеттер: 8[150-200]; 10[201-203].

Бақылау сұрақтары:

1) DW, DD директиваларының көмегімен анықталған деректер жадыға қалай орналасады?

2) SEGMENT директивасының аргументтері?

3) Сыртқы сілтеме директивалары не үшін қолданылады?

4) Файлды қосу директивасы?

5) ІNT 21h 1,7,8 функцияларының айырмашылығы қандай?

6) ІNT 21h 0Ah  функциясын пайдаланған кезде аралық жадының бірінші және екінші байтына не жазылады?

7) Функциялық пернені басқанда енгізу қалай орындалады?

8) 0 (ІNT 16h) және 7 (ІNT 21h) функцияларының орындалуы қалай ажыратылады?

9) ІNT 21h 0Ah және  3Fh функцияларының айырмашылығы қандай?

10) ІNT 21h 0Ah функциясын пайдаланғаннан кейін, деректер аралық жадыда қай байттан басталады?

11) ІNT 21h 0Ah функциясын пайдаланғаннан кейін жолдың соңғы байтының мәні неге тең?

12) Символды экранға шығару функциясы.

13) Символдар жолын экранға шығару функциясы.

14) ІNT 21h 9 және 40h функцияларын орындау кезінде символдар жолының соңын қалай анықтайды?

15) Символды шығару кезінде қандай функциялар курсорды жылжытпайды?

16) Қандай функция дисплейге шығу кезінде атрибут символын ауыстырады?

17) Файл дескрипторы деген не?

18) ASCІІZ - жолы деген не?

19) Стандартты енгізу және стандартты шығару дескрипторлары.

20) Кез-келген файлдық операцияның сәтті аяқталғаны қалай анықталады?

21) Файл атрибуттары.

22) Файлды ашқандағы қатынау кодалары.

23) Файл ұзындығын қалай анықтауға болады?

24) Файлды жабу функциясы не істейді?

25) 41h функциясы арқылы қандай файлды жоюға болмайды?

 

Қорытынды 

Ассемблер тілінде программалар жазу үшін, тек ассемблер – программаның бар болуы жеткіліксіз. Программа мәтіндері жазылып өзгертіле алынатын редактор және алынған программаларды орындауға, редакциялауға және қайтадан орындауға ыңғайлы орта болуы тиіс. Мұндай орта ретінде FAR қоршамын жатқызуға болады. FAR қоршамын бірінші рет қосқанда ыңғайлы шрифтті көрсету керек. FAR шрифтардың бәрінде де латын және орыс әріптері бар. FAR қоршамын компияторды орнықтыру үшін пайдалануға болады.

Сонымен, ассемблер тілінде программаларды жетілдіруге болатын ортамыз бар. Ол үшін келесі файл autoexec.bat*) ішінде path айнымалысын өзгерту керек. Ол үшін бұл файл ішіне келесі жазуды қосу керек: C:\ myasm\ bin. Ал, енді path айнымалысын тапсыратын (беретін) autoexec.bat файлының толық жолы келесі түрде болып шығады: path = d:\ unit; f:\ bcc55\bin; c:\ myasm\bin. Сонымен, соңғы жолдан көріп тұрғанымыз келесі. MASM компилятор файлдарына жету жолдарының бәрі, тек соңғысынан басқалары, нүкте-үтірмен (;) бөлінеді.

         Файлды жасау үшін ол (яғни файл) сақталатын папка ішіне кіріп, Shift+F4 батырмаларын басамыз, пайда болған терезе ішінде файл есімін (|11.asm символдарымен берілсін делік)*), программа мәтінін енгізіп, F10 батырмасын басып, пайда болған меню ішіндегі Save (сақтау) орнын таңдап аламыз. Айтылғанның бәрін орындағаннан кейін біздің папкамызда |11.asm файлы пайда болады. Бұл файлдың ішіндегісін F3 батырмасының көмегімен қарап шығуға болады. Ал, бұл файлды редакциялау қызметін F4 батырмасы орындайды.

 

Әдебиеттер тізімі

 

1.   Юров В., Хорошенко С. Ассемблер. - СПб.: “Питер”, 2009. – 470 c.

2.   Зубков С.В. Assembler  для DOS, Windows и Unix. – М.: ДМК, 2007. – 378 c.

3.   Пирогов В.Ю. ASSEMBLER. Учебный курс. – М.: “Нолидж”, 2006.- 589 c.

4.   Финогенов К.Г. Самоучитель по системным функциям MS-DOS. - М.:  МП “МАЛИП”, 2008. – 432 c.

5.   Пирогов В.Ю. ASSEMBLER для Windows. – М.: Издатель Молгачева С.В., 2008. – 521 c.

6.   Том Сван. Освоение Turbo Assembler. - М.:  “Диалектика”, 2006. – 312 c.

7.   Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. – М.: “ДИАЛОГ-МИФИ”, 2005. – 542 c.

8.   Скэнлон Л. ПЭВМ IBM PC и XT. Программирование на языке Ассемблера. - М.: “Pадио и Связь”, 2007. – 368 c.

9.   Абель П. Язык Ассемблера для IBM PC и программирования. - М.: “Высшая школа”, 2004. – 687 c.

10.   Брэдли Л. Программирование на языке Ассемблера для персональных ЭВМ IBM.-М.: “Радио и Связь”,2005. – 354 c.

11.   Нортон П., Соухэ Д. Язык Ассемблера для IBM РС: Пер.с англ., - М.:  “Компьютер”, 2003. – 741 c.

12.   Hортон П. ПК фирмы IBM и OS MS-DOS. -М.: “Радио и  Связь”, 2006. – 365 c.

13. Пузанков Д.В. Микропроцессорные системы. – СПб.: “Политехника”, 2007, – 935 с.

14. Система программирования на макроассемблере MS-DOS (в 4-х частях). – Киев: НПО «Горсистемотехника», 2006. – 874 c.

 

Мазмұны 

Кіріспе

3

1 Деректердің берілуі

4

1.1 Екілік-ондық код (BCD)

4

1.2 Mіcrosoft фирмасының ассемблер тілінде программаны дайындау процесі

4

Бақылау сұрақтары

6

Жаттыулар. Қарапайым есептерді орындау

6

2 IBM PC архитектурасының ерекшеліктері

10

2. 1 ІNTEL фирмасының микропроцессорлар тобына қысқаша шолу

10

2.2 Адрестік кеңістіктің таратылуы

12

2.3 .EXE программаларының құрылымы және жадыда орналасуы

14

2.4 . COM программаларының құрылымы және жадыда орналасуы

17

Бақылау сұрақтары

18

Жаттыулар. Қарапайым деректер типі түсінігі. Turbo Debugger (TD) жөндегіші

18

3 Микропроцессордың пайдаланушы регистрлері

22

3.1 Пайдаланушылар регистрлері

23

3.2 Жалпы міндетті регистрлер

23

3.3 Сегменттік регистрлер

27

3.4 Күйлер белгісі

27

3.5 Жүйелік белгілер

28

Бақылау сұрақтары

28

4 Микропроцессордың жүйелік регистрлері

28

4.1 Басқару регистрлері

30

4.2 Жүйелік адрес регистрлері

30

4.3 Жөндеу регистрлері

31

Бақылау сұрақтары

32

Жаттыулар. Программаға басқаруды беру

36

5 Операндтарды адрестеу әдістері

36

5.1 Ығысу түрлері

36

Бақылау сұрақтары

38

Жаттыулар. Процессор командаларының әртүрлі топтарын қолдана отырып программаларды өңдеу

39

6 i80x86 микропроцессор командалар жүйесіне шолу       

45

6.1 Деректерді алып орналастыру командалары

45

6.2 Енгізу-шығару командалары

47

6.3 Адресті қайта тасымалдау командалары

47

6.4 Белгілерді ауыстыру командалары

48

6.5 Басқару тізгінін ауыстыру командалары

48

6.6 Басқару тізгінін шартсыз ауыстыру командалары

49

6.7 Басқару тізгінін шартқа байланысты ауыстыру командалары

50

6.8 Циклды басқару командалары

52

Бақылау сұрақтары

52

7 i80x86 микропроцессор жүйесінің арифметикалық командалары

52

7.1 Екілік сандарды қосу

52

7.2 Екілік сандарды азайту

54

7.3 Сандарды көбейту

54

7.4 Сандарды бөлу

55

7.5 Екілік –ондық сандармен орындалатын арифметикалық операциялар

56

7.6 Жинақталған BCD-сандармен орындалатын арифметикалық операциялар

59

7.7 Типті ауыстыру командалары

60

Бақылау сұрақтары

60

8 Екілік разрядтармен жұмыс командалары

60

8.1 Логикалық командалар

60

8.2 Жылжыту және циклдық жылжыту командалары

61

Бақылау сұрақтары

63

9 Тізбекті командалар. Үзу командалары. Микрпоцессорды басқару командалары

63

9.1 Тізбекті командалар

63

9.2 Жолдарды өңдеу командалары

64

9.3 Жолдарды салыстыру командасы

65

9.4 Жолдарды жүктеу және сақтау командасы

66

9.5 Микропроцессорды басқару командасы

68

Бақылау сұрақтары

69

10 Ассемблер директивалары        

69

10.1 Сегментті анықтайтын директивалар

69

10.2 Процедураны анықтау директивалары

71

10.3 ASSUME директивасы

71

10.4 Мәліметтерді анықтайтын директивалар

72

10.5 Анықтағышты анықтайтын директивалары

73

10.6 Сыртқы сілтеме директивалары

74

Бақылау сұрақтары

75

Қорытынды

76

Әдебиеттер тізімі

77