Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование ассемблер(лекция).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
798.72 Кб
Скачать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

MOV CX,100

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

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

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

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

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

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

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

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

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

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

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

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

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

PUSH DS

POP ES

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . .

Аты ENDS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

near типіндегі деректерді анықтау үшін қолданылады.

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

жалғасы

.DATA? Инициализацияланбаған деректер сегментінің басы немесе жалғасы. Сондай-

ақ near типіндегі деректерді анықтау үшін қолданылады.

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

өлшемін береді

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

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

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

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

...

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

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

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

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

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

ASSUME нұсқауы шартбелгілер сегментінде келесі түрде сипатталады ASSUME SS:стек_аты,DS:деректер_аты,CS:шартбегілер_аты,ES:қосымша_аты Егер программа қайсыбір сегментті қолданбаса, онда оны көрсет­пей кетуге болады немесе NOTHІNG көрсету қажет.

Мысалы :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • тұрақты;

  • таблица, массив немесе жол;

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

Тұрақты

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

A DB 10,

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

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

MOV AL,byte ptr A ; AL=40H

MOV AL,byte ptr A+2 ;AL=20H Нақты бір сөзге жүгіну үшін :

MOV AX,WORD PTR A ; AX=3040H

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

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

ADR_NEAR DW MAІN

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

ADR_FAR DD MAІN

Таблица

Таблицаны жазу кезінде, таблицадағы элементтер үтір арқылы жазылады

TAB DB 10,20,30,40,50

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

TAB DB 5 DUP (?)

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

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

Мысалы:

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

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

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

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

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

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

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

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

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

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

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

EQU және =

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

аты EQU өрнек

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

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

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

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

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

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

мысалы

PUBLІC A

DSEG SEGMENT

A DW 1020H

DSEG ENDS

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

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

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

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

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

Листингіні басқару директивалары

Оларға PAGE, TІTLE жҒне SUBTTL директивалары жатады.

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

Жолдардың саны 10 - 255 дейінгі аралықта өзгертіледі.

Бағана жолдағы символдар санын көрсетеді және 60 - 132 дейінгі аралықта өзгереді. Аталынбаған жағдайда беттердің өлшемі тағайындалады, бір жолға 80 символды 66 жол.

PAGE директивасы операндсыз беттерді жылдам ауыстырады.

TІTLE ди­рективасы әр беттің жоғарғы жағында программаның бастамасын жазады. TІTLE директивасының пішімі келесі түрде болады: TІTLE текст

Текстің максималды Ұзындығы - 60 символ.

SUBTTL директивасы, бастамадан кейінгі келесі жолда ішкі бастаманы жазады. Оның форматы: SUBTTL текст.

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

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

  1. DW, DD директиваларының көмегімен анықталған деректер жадыға қалай орналасады?

  2. SEGMENT директивасының аргументтері

  3. Сыртқы сілтеме директивалары не үшін қолданылады?

  4. Файлды қосу директивасы

Дәріс №11. Программаларды ұйымдастыру. Макроанықтағыштар