Ассемблер тілінің негізгі компоненттері және нұсқау құрылымы. Деректер пішімі және ассемблер тілінің командаларының құрылымы. «Жүйелік бағдарламалау» пәні бойынша

Кіріспе.

Бастапқы программа жазылатын тіл деп аталады Кірутіл және оны процессор орындау үшін аударатын тіл демалыс күндеріндетіл. Енгізу тілін шығыс тіліне түрлендіру процесі деп аталады тарату.Процессорлар программалау үшін пайдаланылмайтын екілік машина тілінде бағдарламаларды орындауға қабілетті болғандықтан, барлық бастапқы бағдарламаларды аудару қажет. Белгілі екі жолхабарлар: жинақтау және түсіндіру.

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

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

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

Төменде талқыланған ассемблер тілі компиляция көмегімен жүзеге асырылады.

Тілдің ерекшеліктері.

Ассемблердің негізгі мүмкіндіктері:

● тілде екілік кодтардың орнына символдық атаулар қолданылады - мнемотехника.Мысалы, қосу пәрмені үшін (

) мнемотехника қолданылады

Шешімдер (

көбейту (

Бөлімшелер (

Символдық атаулар жад ұяшықтарын адрестеу үшін де қолданылады. Ассемблер тілінде программалау үшін екілік кодтар мен адрестердің орнына ассемблер екілік кодтарға аударатын символдық атауларды ғана білу керек;

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

● тіл қатынасты қамтамасыз етеді барлық объектілергежәне командалар. Жоғары деңгейлі тілдерде мұндай мүмкіндік жоқ. Мысалы, ассемблер тілі жалаулар регистрінің биттерін және жоғары деңгейлі тілді тексеруге мүмкіндік береді (мысалы,

) мұндай қабілет жоқ. Жүйелік бағдарламалау тілдері (мысалы, C) жиі аралық орынды алатынын ескеріңіз. Қол жетімділік жағынан олар ассемблер тіліне жақынырақ, бірақ жоғары деңгейлі тілдің синтаксисі бар;

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

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

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

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

Көптеген бағдарламаларда жалпы кодтың аз ғана пайызы бағдарламаның орындалу уақытының үлкен пайызына жауап береді. Әдетте, бағдарламаның 1%-ы орындалу уақытының 50%-ына, ал 10%-ы орындалу уақытының 90%-ына жауап береді. Сондықтан нақты жағдайда нақты бағдарламаны жазу үшін ассемблер де, жоғары деңгейлі тілдердің бірі де қолданылады.

Ассемблер тіліндегі оператор пішімі.

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

Белгі өрісі.

1-баған белгі өрісі үшін бөлінген. Белгі символдық атау немесе идентификатор, мекенжайларжады. Бұл сізге қажет:

● командаға шартты немесе шартсыз көшу;

● деректер сақталған орынға қол жеткізу.

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

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

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

Операциялық код өрісі.

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

регистрді жадтан жүктеу үшін мнемоника таңдалған

), ал регистрдің мазмұнын жадта сақтау үшін - мнемотехника

). Ассемблер тілдерінде

екі әрекет үшін де сәйкесінше бір атауды пайдалануға болады

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

Регистрлердің мнемотехникасы ассемблер нұсқасына да байланысты (5.2.1-кесте).

Операнд өрісі.

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

● сандық деректер,

әртүрлі санау жүйелерінде берілген. Қолданылатын санау жүйесін көрсету үшін тұрақтыдан кейін латын әріптерінің бірі жазылады: B,

Сәйкесінше екілік, сегіздік, он алтылық, ондық санау жүйелері (

Оны жазудың қажеті жоқ). Егер он алтылық санның бірінші цифры A, B, C болса,

Содан кейін алдына елеусіз 0 (нөл) қосылады;

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

A, B, C әріптері түріндегі M (ақпарат көздері немесе қабылдаушылары),

М немесе олардың кез келген санау жүйесіндегі адрестері (мысалы, 10В – регистрлік адрес

екілік жүйеде);

● идентификаторлар,

әуе кемелерін тіркеу жұптары үшін,

Бірінші әріптер В,

N; аккумулятор мен мүмкіндіктер регистрінің жұбы үшін -

; бағдарлама есептегіші үшін -

;стек көрсеткіші үшін -

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

(егер шарт орындалса) және шартсыз ауысулар.Мысалы, командадағы M1 операнды

адресі белгі өрісінде M1 идентификаторымен белгіленген командаға сөзсіз көшу қажеттілігін білдіреді;

● өрнектер,

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

Сөзді анықтаңыз), кейінірек енгізілді Балама опция.

басынан бастап процессорлар тілінде болған

Тілдік нұсқада

пайдаланылады

Тұрақтыны анықтаңыз).

Процессорлар әртүрлі ұзындықтағы операндтарды өңдейді. Оны анықтау үшін ассемблерді әзірлеушілер әртүрлі шешімдер қабылдады, мысалы:

Әртүрлі ұзындықтағы II регистрлердің әртүрлі атаулары бар: EAX - 32-разрядты операндтарды орналастыру үшін (түрі

); AX - 16-бит үшін (түр

және AN - 8-бит үшін (түр

● процессорларға арналған

Әр операциялық кодқа жұрнақтар қосылады: жұрнақ

Түрі үшін

; түрі үшін ".B" жұрнағы

әртүрлі ұзындықтағы операндтар үшін әртүрлі опкодтар пайдаланылады, мысалы, байт, жарты сөзді жүктеу үшін (

) және сөздерді операциялық кодтарды пайдаланып 64-биттік регистрге енгізіңіз

тиісінше.

Пікірлер өрісі.

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

● компанияның процессорлары үшін тілдерде нүктелі үтір (;).

леп белгісі(!) үшін тілдерде

Әрбір бөлек түсініктеме жолының алдында жетекші таңба болады.

Псевдокомандалар (директивалар).

Ассемблер тілінде командалардың екі негізгі түрі бар:

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

псевдокомандаларнемесе директивалар,бағдарламаны код комбинациясы тіліне аудару процесіне қызмет көрсетуге арналған. Кестеде мысал ретінде. 5.2.2 ассемблердің кейбір псевдокомандаларын көрсетеді

отбасы үшін

.

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

● орын алған кезде қажетті пәрмендер тізбегін жазыңыз. Бұл тәсіл бағдарлама көлемінің ұлғаюына әкеледі;

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

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

Макрос немесе макрокоманда үш аспектімен сипатталады: макроанықтау, макроинверсия және макрокеңейту.

Макро анықтамасы

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

Макрос анықтамасы келесі құрылымға ие:

Өрнектер тізімі; Макро анықтамасы

Берілген макроанықтама құрылымында үш бөлікті бөлуге болады:

● тақырып

макрос, соның ішінде атауы

Псевдокоманда

және параметрлер жиынтығы;

● нүктелермен белгіленген денемакро;

● команда

бітіру

макроанықтамалар.

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

Таңдалған командалар тобын қайта жинау үшін атаудан тұратын апелляция қолданылады

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

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

) макростың негізгі бөлігімен ассемблер оны ауыстырады.

Макрос атауын операциялық код ретінде пайдалану деп аталады макрореверс(макрос қоңырау) және оны макростың негізгі бөлігімен ауыстыру - макро кеңейту.

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

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

Құрастыру процесі жүзеге асырылады екі өтуде:

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

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

Параметрлері бар макростар.

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

● бірге нақтымакрос шақырудың операнд өрісіне орналастырылатын параметрлер;

● бірге формальдыпараметрлері. Макросты кеңейту кезінде макростың негізгі бөлігінде пайда болатын әрбір ресми параметр сәйкес нақты параметрмен ауыстырылады.

параметрлері бар макростарды пайдалану.

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

Ал екіншісі

2-бағдарлама екі формальды P1 және P2 параметрі бар макросты қамтиды. Макросты кеңейту кезінде макростың ішіндегі әрбір P1 таңбасы бірінші нақты параметрмен ауыстырылады (P,

), ал P2 символы екінші нақты параметрмен ауыстырылады (

) №1 бағдарламадан. Макрос шақыруда

2-бағдарлама белгіленеді: P,

Бірінші нақты параметр,

Екінші нақты параметр.

1-бағдарлама

2-бағдарлама

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Кеңейтілген мүмкіндіктер.

Кейбір кеңейтілген тіл мүмкіндіктерін қарастырайық

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

белгі жергілікті деп жарияланған (

) және кеңейтілген мүмкіндіктердің арқасында ассемблер макрос кеңейтілген сайын басқа белгіні автоматты түрде жасайды.

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

IF WORDSIZE GT 16 М2 МАКРО

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

Дегенмен, анықтама бағдарламаның қай процессорда жинақталғанына байланысты: 16-биттік немесе 32-биттік. Егер M1 шақырылмаса, M2 макросы мүлде анықталмайды.

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

Ассемблерде макроқұралдарды қолдану туралы.

Макростарды пайдаланған кезде ассемблер екі функцияны орындай алуы керек: макрос анықтамаларын сақтаңызЖәне макро қиындықтарды кеңейту.

Макрос анықтамаларын сақтау.

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

Құрастыру кезінде макросты кездестірген кезде құрылады:

кестенің жаңа элементімакростың атымен, параметрлер санымен және макростың негізгі бөлігі сақталатын басқа макросты анықтау кестесінің көрсеткішімен;

● тізім формальдыпараметрлері.

Жай таңбалар тізбегі болып табылатын макростың негізгі бөлігі макросты анықтау кестесінде оқылады және сақталады. Циклдің негізгі бөлігінде пайда болатын формальды параметрлер белгіленеді ерекше сипат.

Макростың ішкі көрінісі

2-бағдарламаға арналған жоғарыдағы мысалдан (244-бет) мынандай болады:

MOV EAX, MOV EBX, MOV MOV &

мұнда нүктелі үтір каретканы қайтару таңбасы ретінде, ал & амперсанды формальды параметр таңбасы ретінде пайдаланылады.

Макрос қоңырауларын кеңейту.

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

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

Екі жолақты ассемблер.

Бағдарлама бірнеше мәлімдемелерден тұрады. Сондықтан, құрастыру кезінде келесі әрекеттер тізбегін қолдануға болатын сияқты:

● оны машина тіліне аудару;

● алынған машина кодын файлға, ал листингтің сәйкес бөлігін басқа файлға тасымалдау;

● бүкіл бағдарлама аударылғанша аталған процедураларды қайталаңыз.

Алайда бұл әдіс тиімді емес. Мысал ретінде проблема деп аталады алға сілтеме.Егер бірінші оператор программаның ең соңында орналасқан P операторына көшу болса, онда ассемблер оны аудара алмайды. Ол алдымен Р операторының адресін анықтауы керек, ол үшін программаны толық оқып шығуы керек. Бастапқы бағдарламаның әрбір толық оқуы деп аталады өту.Келіңіздер, екі өту арқылы алдын ала сілтеме мәселесін қалай шешуге болатынын көрсетейік:

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

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

Бірінші өту.

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

;Мән – буфер өлшемі

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

) арнайы айнымалы ретінде. Бірінші өтудің басында арнайы айнымалының мәні 0-ге орнатылады және сол пәрмен ұзындығы бойынша өңделген әрбір пәрменнен кейін ұлғаяды. Кестеде мысал ретінде. 5.2.3 командалардың ұзындығын және санауыш мәндерін көрсететін бағдарлама фрагментін көрсетеді. Бірінші өтуде кестелер жасалады символдық атаулар, директиваларЖәне операциялық кодтар,және қажет болған жағдайда сөзбе-сөзкесте. Литерал – ассемблер жадты автоматты түрде сақтайтын тұрақты шама. Бірден атап өтейік, қазіргі процессорларда тікелей адрестері бар нұсқаулар бар, сондықтан олардың ассемблерлері литералдарға қолдау көрсетпейді.

Таңба атауы кестесі

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

● белгімен байланысты деректер өрісінің ұзындығы;

● жадты қайта бөлу биттері (бағдарлама ассемблер тағайындалған мекенжайдан басқа адресте жүктелсе, символдың мәні өзгеретінін немесе өзгермейтінін көрсетеді);

● таңбаға процедурадан тыс қол жеткізуге болатыны туралы ақпарат.

Символдық атаулар – белгілер. Оларды операторлар арқылы көрсетуге болады (мысалы,

Директивалық кесте.

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

Операциялық код кестесі.

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

Екінші өту.

Екінші пастың мақсаты- объектілік бағдарламаны құру және қажет болған жағдайда құрастыру хаттамасын басып шығару; бір орындалатын файлға әр түрлі уақытта жиналған процедураларды байланыстыру үшін сілтеме жасаушыға қажетті шығыс ақпараты.

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

Бастапқы бағдарламада қателер болуы мүмкін, мысалы:

берілген таңба анықталмаған немесе бірнеше рет анықталған;

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

● оператор жоқ

Кейбір ассемблер анықталмаған таңбаны тауып, оны ауыстыра алады. Дегенмен, көп жағдайда қате туралы мәлімдемеге тап болған кезде ассемблер экранда қате туралы хабарды көрсетеді және құрастыру процесін жалғастыруға әрекет жасайды.

Ассемблер тіліне арналған мақалалар.

МИРЗО ҰЛЫҒБЕК АТЫНДАҒЫ ӨЗБЕКСТАН ҰЛТТЫҚ УНИВЕРСИТЕТІ

КОМПЬЮТЕРЛІК ТЕХНОЛОГИЯ ФАКУЛЬТЕТІ

Тақырып бойынша: EXE файлының семантикалық талдауы.

Аяқталды:

Ташкент 2003 ж.

Алғы сөз.

Ассамблея тілі және командалық құрылым.

EXE файл құрылымы (семантикалық талдау).

COM файл құрылымы.

Вирустың әрекет ету және таралу принципі.

Бөлшектеуіш.

Бағдарламалар.

Алғы сөз

Бағдарламашы мамандығы таңқаларлық және ерекше. Қазіргі таңда ғылым мен өмірді жаңа технологиясыз елестету мүмкін емес. Адамның іс-әрекетіне қатысты барлық нәрсе онсыз мүмкін емес компьютерлік технология. Ал бұл оның жоғары дамуы мен жетілдірілуіне ықпал етеді. Дербес компьютерлердің дамуы жақында басталғанымен, осы уақыт ішінде бағдарламалық өнімдерде орасан зор қадамдар жасалды және бұл өнімдер ұзақ уақыт бойы кеңінен қолданылады. Компьютермен байланысты білім саласы, сәйкес технология сияқты жарылыс болды. Егер коммерциялық жағын есепке алмасақ, онда кәсіби қызметтің бұл саласында бейтаныс адамдар жоқ деп айта аламыз. Көптеген адамдар пайда немесе кіріс үшін емес, өз еркімен, құмарлығымен бағдарламалар жасайды. Әрине, бұл бағдарламаның сапасына әсер етпеуі керек және бұл бизнесте, былайша айтқанда, сапалы орындау, тұрақты жұмыс және барлық заманауи талаптарға сай бәсекелестік пен сұраныс бар. Мұнда сонымен қатар 60-шы жылдардағы микропроцессорлардың пайда болуын атап өткен жөн, олар көптеген шамдар жиынтығын ауыстыруға келді. Микропроцессорлардың бір-бірінен айтарлықтай айырмашылығы бар кейбір түрлері бар. Бұл микропроцессорлар бір-бірінен разрядтық тереңдікте және орнатылған жүйе командаларымен ерекшеленеді. Ең кең таралғандары: Intel, IBM, Celeron, AMD және т.б. Бұл процессорлардың барлығы Intel процессорларының жетілдірілген архитектурасына қатысты. Микрокомпьютерлердің таралуы екі негізгі себеп бойынша ассемблер тіліне деген көзқарасты қайта қарауды тудырды. Біріншіден, ассемблер тілінде жазылған бағдарламалар жады мен орындау уақытын айтарлықтай аз талап етеді. Екіншіден, ассемблер тілін және оның нәтижесінде алынған машиналық кодты білу машинаның архитектурасын түсінуді қамтамасыз етеді, оны жоғары деңгейлі тілде жұмыс істегенде қамтамасыз ету екіталай. Бағдарламалық жасақтама мамандарының көпшілігі Pascal, C немесе Delphi сияқты жоғары деңгейлі тілдерде әзірленсе де, бұл бағдарламаларды жазу кезінде оңайырақ, ең қуатты және тиімді бағдарламалық қамтамасыз етутолық немесе ішінара ассемблер тілінде жазылған. Жоғары деңгейлі тілдер ерекше болмау үшін жасалған техникалық ерекшеліктеріарнайы компьютерлер. Ал ассемблер тілі өз кезегінде процессордың нақты ерекшеліктеріне арналған. Сондықтан белгілі бір компьютерге ассемблер тілінде программа жазу үшін оның архитектурасын білу керек. Бұл күндері негізгі көрініс бағдарламалық өнім EXE файлы болып табылады. ескере отырып оң жақтарыБұл бағдарлама авторы оның тұтастығына сенімді бола алады дегенді білдіреді. Бірақ көбінесе бұл жағдайдан алыс. Бөлшектеуіш те бар. Бөлшектеуіштің көмегімен сіз үзілістер мен бағдарлама кодтарын біле аласыз. Ассемблерді жақсы білетін адамға бүкіл бағдарламаны өз талғамына қарай қайта жасау қиын болмайды. Мүмкін бұл жерде ең шешілмейтін мәселе туындайды - вирус. Неліктен адамдар вирус жазады? Кейбіреулер бұл сұрақты таңданыспен, кейбіреулер ашумен қояды, бірақ соған қарамастан бұл тапсырмаға қандай да бір зиян келтіру тұрғысынан емес, жүйелік бағдарламалауға қызығушылық ретінде қызығушылық танытатын адамдар әлі де бар. Вирустарды жазады әртүрлі себептер. Кейбіреулер жүйелік қоңырауларды ұнатады, басқалары ассемблер туралы білімін жетілдіреді. Мұның бәрін мен өзімнің мақаламда түсіндіруге тырысамын курстық жұмыс. Ол сонымен қатар EXE файлының құрылымы туралы ғана емес, сонымен қатар ассемблер тілі туралы да айтады.

^ Ассамблея тілі.

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

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

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

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

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

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

Әдеттегі заманауи компьютер (i486 немесе Pentium негізіндегі) келесі компоненттерден тұрады (1-сурет).

Күріш. 1. Компьютер және перифериялық құрылғылар

Күріш. 2. Блок-схема Дербес компьютер

Суреттен (1-сурет) компьютердің әрқайсысы жүйелік блок деп аталатын бір блокқа қосылған бірнеше физикалық құрылғылардан тұратыны анық көрінеді. Егер логикалық тұрғыдан ойласақ, оның қандай да бір үйлестіру құрылғысының рөлін атқаратыны анық. Жүйелік блоктың ішіне қарайық (монитордың ішіне кіруге тырысудың қажеті жоқ - онда қызықты ештеңе жоқ, сонымен қатар қауіпті): корпусты ашып, кейбір тақталарды, блоктарды, жалғау сымдарын қараңыз. Олардың функционалдық мақсатын түсіну үшін типтік компьютердің блок-схемасын қарастырайық (2-сурет). Ол абсолютті дәлдікті талап етпейді және тек қазіргі дербес компьютер элементтерінің мақсатын, өзара байланысын және типтік құрамын көрсетуге арналған.

Суреттегі диаграмманы талқылайық. 2 біршама дәстүрлі емес стильде.
Адам жаңа нәрсеге тап болған кезде белгісіз нәрсені түсінуге көмектесетін кейбір ассоциацияларды іздеуі әдеттегідей. Компьютер қандай ассоциацияларды тудырады? Мысалы, мен компьютерді адамның өзімен жиі байланыстырамын. Неліктен?

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

Қазіргі компьютерлер, әрине, адамнан алыс. Оларды шартсыз рефлекстердің үлкен, бірақ шектеулі жиынтығы деңгейінде сыртқы әлеммен әрекеттесетін тіршілік иелерімен салыстыруға болады.
Бұл рефлекстер жиынтығы машиналық командалар жүйесін құрайды. Компьютермен қаншалықты жоғары деңгейде байланыста болсаңыз да, ол ақыр соңында машина командаларының скучно және монотонды тізбегіне түседі.
Әрбір машина командасы бір немесе басқа шартсыз рефлексті қоздыратын түрткі болып табылады. Бұл тітіркендіргішке реакция әрқашан бір мәнді және микробағдарлама түрінде микрокомандалық блокта «тұйықталған». Бұл микробағдарлама машина командасын орындау үшін әрекеттерді жүзеге асырады, бірақ белгілі бір сигналдар деңгейінде логикакомпьютер, осылайша компьютердің әртүрлі ішкі жүйелерін басқарады. Бұл микропрограммалық басқару принципі деп аталады.

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

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

Жоғарыда айтылғандардың барлығынан қорытынды жасауға болады, ассемблер тілі компьютер үшін «ана» болғандықтан, ең тиімді бағдарламаны тек оған жазуға болады (егер оны білікті бағдарламашы жазған болса). Мұнда бір кішкентай «бірақ» бар: бұл көп көңіл бөлуді және практикалық тәжірибені қажет ететін өте еңбекті қажет ететін процесс. Сондықтан, шын мәнінде, олар негізінен ассемблерде қамтамасыз ететін бағдарламаларды жазады тиімді жұмысаппараттық құралмен. Кейде орындалу уақыты немесе жадты тұтыну тұрғысынан маңызды болып табылатын бағдарлама бөлімдері ассемблерде жазылады. Кейіннен олар ішкі бағдарламалар түрінде ресімделеді және жоғары деңгейлі тілдегі кодпен біріктіріледі.

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

Бұл регистрлерді екі үлкен топқа бөлуге болады:

^ 16 пайдаланушы тіркелімі;

16 жүйелік регистрлер.

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

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

Деректер мен мекенжайларды сақтау үшін бағдарламашылар пайдалана алатын сегіз 32 разрядты регистрлер (жалпы мақсаттағы регистрлер (GPR) деп те аталады):

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

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

Жалаулар туларды/жалауларды тіркейді;

Командалық көрсеткіш регистрі eip/ip.

Күріш. 3. i486 және Pentium микропроцессорларының пайдаланушы регистрлері

Неліктен бұл регистрлердің көпшілігі қиғаш сызықтармен көрсетілген? Жоқ, бұл әртүрлі регистрлер емес – олар бір үлкен 32-разрядты регистрдің бөліктері. Оларды бағдарламада жеке объектілер ретінде пайдалануға болады. Бұл i8086 бастап Intel микропроцессорларының 16-биттік жас үлгілері үшін жазылған бағдарламалардың функционалдығын қамтамасыз ету үшін жасалды. i486 және Pentium микропроцессорларында негізінен 32 разрядты регистрлер бар. Олардың саны, сегменттік регистрлерді қоспағанда, i8086 санымен бірдей, бірақ өлшемі үлкенірек, бұл олардың белгілеулерінде көрінеді - оларда бар
e префиксі (Кеңейтілген).

^ Жалпы мақсаттағы регистрлер
Осы топтағы барлық регистрлер олардың «төменгі» бөліктеріне қол жеткізуге мүмкіндік береді (3-суретті қараңыз). Бұл суретке қарап, бұл регистрлердің тек төменгі 16 және 8 разрядты бөліктерін өздігінен адрестеу үшін пайдалануға болатынын ескеріңіз. Бұл регистрлердің жоғарғы 16 биттері тәуелсіз нысандар ретінде қол жетімді емес. Бұл, жоғарыда атап өткеніміздей, Intel микропроцессорларының жас 16-биттік үлгілерімен үйлесімділік үшін жасалды.

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

eax/ax/ah/al (Аккумулятор регистрі) - батарея.
Аралық деректерді сақтау үшін қолданылады. Кейбір командалар осы регистрді пайдалануды талап етеді;

ebx/bx/bh/bl (Базалық регистр) - негізгі регистр.
Кейбір объектінің негізгі адресін жадта сақтау үшін қолданылады;

ecx/cx/ch/cl (Санау регистрі) - санауыш регистр.
Кейбір қайталанатын әрекеттерді орындайтын командаларда қолданылады. Оны қолдану көбінесе жасырын және сәйкес команданың алгоритмінде жасырын болады.
Мысалы, циклдік циклды ұйымдастыру командасы басқаруды белгілі бір адресте орналасқан командаға берумен қатар, ecx/cx регистрінің мәнін бір-біріне талдайды және азайтады;

edx/dx/dh/dl (Мәліметтер регистрі) – деректер регистрі.
eax/ax/ah/al регистрі сияқты ол аралық деректерді сақтайды. Кейбір командаларда оны пайдалану міндетті болып табылады; Кейбір командалар үшін бұл жанама түрде орын алады.

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

esi/si (Source Index регистрі) - бастапқы индекс.
Тізбектелген операциялардағы бұл регистр бастапқы тізбектегі элементтің ағымдағы мекенжайын қамтиды;

edi/di (Destination Index register) – қабылдаушының (алушының) индексі.
Тізбектелген операциялардағы бұл регистр тағайындау тізбегіндегі ағымдағы мекенжайды қамтиды.

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

esp/sp (Stack Pointer регистрі) – стек көрсеткішінің регистрі.
Ағымдағы стек сегментіндегі стектің жоғарғы жағына көрсеткішті қамтиды.

ebp/bp (Негізгі көрсеткіш регистрі) – стек фреймінің негізгі көрсеткіш регистрі.
Стек ішіндегі деректерге кездейсоқ қол жеткізуді ұйымдастыруға арналған.

Стек - бұл еркін деректерді уақытша сақтауға арналған бағдарлама аймағы. Әрине, мәліметтерді деректер сегментінде де сақтауға болады, бірақ бұл жағдайда уақытша сақталған әрбір деректер үшін бағдарламаның өлшемін және пайдаланылатын атаулардың санын ұлғайта алатын жеке аталған жад ұяшығы жасалуы керек. Стектің ыңғайлылығы оның аумағын қайта пайдалануға болатындығында, ал стекке деректерді сақтау және оны сол жерден алу ешбір атауды көрсетпей, тиімді push және pop пәрмендерін қолдану арқылы жүзеге асырылады.
Стек дәстүрлі түрде, мысалы, ішкі бағдарламаны шақыру алдында бағдарлама пайдаланатын регистрлердің мазмұнын сақтау үшін пайдаланылады, ол өз кезегінде процессор регистрлерін «өз мақсаттары үшін» пайдаланады. Регистрлердің бастапқы мазмұны ішкі бағдарлама қайтарылғаннан кейін стектен шығарылады. Тағы бір кең таралған әдіс - қажетті параметрлерді стек арқылы ішкі бағдарламаға беру. Ішкі бағдарлама параметрлердің стекке қандай ретпен орналастырылғанын біле отырып, оларды сол жерден алып, оны орындау кезінде пайдалана алады. Айырықша ерекшелігіСтек - ондағы деректер шығарылатын бірегей тәртіп: кез келген уақытта стекте тек жоғарғы элемент қол жетімді болады, яғни. ең соңғы стекке итерілген элемент. Стектен жоғарғы элементті шығару келесі элементті қолжетімді етеді. Стек элементтері стекке бөлінген жад аймағында стектің төменгі жағынан (яғни оның максималды мекенжайынан) бастап ретті түрде төмендейтін адрестерде орналасады. Жоғарғы, қолжетімді элементтің мекенжайы SP стектің көрсеткіш регистрінде сақталады. Бағдарлама жадының кез келген басқа аймағы сияқты, стек қандай да бір сегменттің бөлігі болуы немесе бөлек сегментті құруы керек. Кез келген жағдайда осы сегменттің сегменттік адресі SS сегменттік стек регистріне орналастырылады. Осылайша, SS:SP регистрлерінің жұбы қолжетімді стек ұяшығының адресін сипаттайды: SS стектің сегменттік мекенжайын сақтайды, ал SP стекте сақталған соңғы деректердің ығысуын сақтайды (4, а-сурет). Бастапқы күйде SP стектің көрсеткіші стектің астыңғы жағында жатқан және оған қосылмаған ұяшықты көрсететінін ескеріңіз.

4-сурет. Стекті ұйымдастыру: а - бастапқы күй, b - бір элементті жүктегеннен кейін (бұл мысалда AX регистрінің мазмұны), в - екінші элементті жүктегеннен кейін (DS регистрінің мазмұны), d - біреуін түсіргеннен кейін. элемент, e - екі элементті түсіріп, бастапқы күйіне оралғаннан кейін.

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

Стек суретте көрсетілген күйге өтеді. 1.10, б. Стек көрсеткішінің екі байт жоғары (төменгі адрестерге қарай) жылжытылғанын және push пәрменінде көрсетілген операндтың осы адреске жазылғанын көруге болады. Келесі стек жүктеу пәрмені, мысалы:

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

pop DS
pop AX

Стек қаншалықты үлкен болуы керек? Бұл бағдарламада қаншалықты қарқынды қолданылатынына байланысты. Мысалы, стекке 10 000 байт массивін сақтауды жоспарласаңыз, онда стек кемінде осы өлшем болуы керек. Кейбір жағдайларда стек жүйемен автоматты түрде пайдаланылатынын, атап айтқанда, int 21h үзу командасын орындау кезінде ескеру қажет. Бұл команда арқылы процессор алдымен қайтару адресін стекке итереді, содан кейін DOS регистрлердің мазмұнын және үзілген бағдарламаға қатысты басқа ақпаратты стекке итереді. Сондықтан, бағдарлама стекті мүлде қолданбаса да, ол бағдарламада болуы керек және көлемі кемінде бірнеше ондаған сөз болуы керек. Бірінші мысалда біз стекке 128 сөз бөлдік, бұл әрине жеткілікті.

^ Ассемблер бағдарламасының құрылымы

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

Ассемблер мәлімдемелерінің төрт түрі бар:

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

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

директивалар, олар ассемблер аудармашысына белгілі бір әрекеттерді орындауға арналған нұсқаулар. Директивалар машинаны көрсетуде ұқсастықтары жоқ;

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

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

Бағдарламаны құрайтын сөйлемдер командаға, макросқа, директиваға немесе түсініктемеге сәйкес келетін синтаксистік құрылым болуы мүмкін. Ассемблер аудармашы оларды тану үшін олар белгілі бір синтаксистік ережелерге сәйкес құрылуы керек. Ол үшін грамматика ережелері сияқты тіл синтаксисінің формальды сипаттамасын қолданған дұрыс. Программалау тілін осылайша сипаттаудың ең көп тараған тәсілдері синтаксистік диаграммалар және кеңейтілген Backus-Naur формалары болып табылады. Үшін практикалық қолданусинтаксистік диаграммалар ыңғайлырақ. Мысалы, ассемблер тілі мәлімдемелерінің синтаксисін келесі суреттерде көрсетілген синтаксистік диаграммалар арқылы сипаттауға болады.

Күріш. 5. Құрамалы сөйлем пішімі

Күріш. 6. Директивалық пішім

Күріш. 7. Командалар мен макростар форматы

Мына суреттерде:

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

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

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

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

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

Бағдарлама мәтінін жазу кезінде рұқсат етілген таңбалар:

Барлық әріптер: A-Z, a-z. Бұл жағдайда бас және кіші әріптер баламалы болып саналады;

0-ден 9-ға дейінгі сандар;

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

Бөлгіштер, . ()< > { } + / * % ! " " ? \ = # ^.

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

Лексемалар мыналар:

идентификаторлар - операциялық кодтар, айнымалы атаулар және белгі атаулары сияқты бағдарлама нысандарын белгілеу үшін қолданылатын жарамды таңбалар тізбегі. Идентификаторларды жазу ережесі келесідей: идентификатор бір немесе бірнеше таңбадан тұруы мүмкін. Таңбалар ретінде латын әліпбиінің әріптерін, сандарды және кейбір арнайы таңбаларды – _, ?, $, @ пайдалануға болады. Идентификатор цифрлық таңбадан басталуы мүмкін емес. Идентификатордың ұзындығы 255 таңбаға дейін болуы мүмкін, дегенмен аудармашы тек алғашқы 32 таңбаны қабылдап, қалғанын елемейді. Опцияны пайдаланып ықтимал идентификаторлардың ұзындығын реттеуге болады пәрмен жолы mv. Сонымен қатар, аудармашыға үлкен және кіші әріптерді ажыратуға немесе олардың айырмашылығын елемеуге нұсқау беруге болады (бұл әдепкі бойынша орындалады).

^Ассемблер командалары.

Ассемблер командалары сіздің талаптарыңызды компьютерге тасымалдау мүмкіндігін, логикалық салыстыру және бағдарламаны ұйымдастыру үшін бағдарламадағы басқаруды беру механизмін (циклдар мен ауысулар) ашады. Дегенмен, бағдарламаланатын тапсырмалар соншалықты қарапайым емес. Көптеген бағдарламалар белгілі бір талапқа қол жеткізгенше бірнеше командалар қайталанатын циклдар сериясын және бірнеше әрекеттердің қайсысын орындау керектігін анықтайтын әртүрлі тексерулерді қамтиды. Кейбір нұсқаулар нұсқаулық көрсеткішіндегі ығысу мәнін тікелей өзгерту арқылы қадамдардың қалыпты ретін өзгерту арқылы басқаруды тасымалдай алады. Жоғарыда айтылғандай, әртүрлі процессорлар үшін әртүрлі пәрмендер бар, бірақ біз 80186, 80286 және 80386 процессорларына арналған кейбір командалардың бірқатарын қарастырамыз.

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

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

1 - команда орындалғаннан кейін жалауша қойылады (1-ге тең);

0 - команда орындалғаннан кейін жалауша қалпына келтіріледі (0-ге тең);

r – жалаушаның мәні команданың нәтижесіне байланысты;

Команда орындалғаннан кейін жалауша анықталмайды;

бос орын – команда орындалғаннан кейін жалауша өзгермейді;

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

r8, r16, r32 – байт өлшемі, сөз немесе қос сөз регистрлерінің біріндегі операнд;

m8, m16, m32, m48 - жад операндының өлшемі байт, сөз, қос сөз немесе 48 бит;

i8, i16, i32 – жедел операнд өлшемі байт, сөз немесе қос сөз;

a8, a16, a32 - код сегментіндегі салыстырмалы адрес (офсет).

Командалар (алфавиттік ретпен):

*Бұл командалар егжей-тегжейлі сипатталған.

ҚОСУ
(Қосу)

Қосу

^ Командалық диаграмма:

тағайындалған жерді, көзді қосыңыз

Мақсаты: байт, сөз немесе қос сөздің екі бастапқы және тағайындалған операндтарын қосу.

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

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

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

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

Команданы орындағаннан кейінгі жалаушалардың күйі:

Қолдану:
Қосу пәрмені екі бүтін операндты қосу үшін қолданылады. Қосудың нәтижесі бірінші операндтың адресіне қойылады. Егер қосудың нәтижесі қабылдағыш операндының шекарасынан асып кетсе (толып кету орын алса), онда бұл жағдайды cf жалауын талдау және adc командасын кейіннен ықтимал пайдалану арқылы ескеру керек. Мысалы, ax регистріне және ch жады аймағына мәндерді қосайық. Қосу кезінде толып кету мүмкіндігін ескеріңіз.

Тіркелу плюс регистр немесе жад:

|000000dw|modregr/rm|

AX тіркелімі (AL) плюс жедел мән:

|0000010w|--деректер--|дерек, егер w=1|

Тіркеу немесе жад плюс жедел мән:

|100000sw|mod000r/m|--деректер--|деректер, егер BW=01|

ҚОҢЫРАУ
(ҚОҢЫРАУ)

Процедураны немесе тапсырманы шақыру

^ Командалық диаграмма:

Мақсаты:

стекте қайтару нүктесінің адресін сақтай отырып басқаруды жақын немесе алыс процедураға ауыстыру;

тапсырмаларды ауыстыру.

Жұмыс алгоритмі:
операнд түрімен анықталады:

Жақын белгі - eip/ip пәрмен көрсеткішінің мазмұны стекке итеріледі және белгіге сәйкес жаңа мекенжай мәні сол регистрге жүктеледі;

Far label - eip/ip және cs пәрмен көрсеткішінің мазмұны стекке итеріледі. Содан кейін алыс белгіге сәйкес келетін жаңа мекенжай мәндері бірдей регистрлерге жүктеледі;

R16, 32 немесе m16, 32 - басқару тасымалданатын ағымдағы нұсқау сегментіндегі ығысуларды қамтитын регистрді немесе жад ұяшығын анықтау. Басқару тасымалданған кезде eip/ip пәрмен көрсеткішінің мазмұны стекке итеріледі;

Жад көрсеткіші – шақырылатын процедураға 4 немесе 6 байт көрсеткіші бар жад орнын анықтайды. Мұндай көрсеткіштің құрылымы 2+2 немесе 2+4 байт. Мұндай көрсеткішті түсіндіру микропроцессордың жұмыс режиміне байланысты:

^ Пәрменді орындағаннан кейінгі жалаулардың күйі (тапсырманы ауыстырудан басқа):

команданы орындау жалаушаларға әсер етпейді

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

Нысан коды (төрт пішім):

Сегментте тікелей адрестеу:

|11101000|дисп-төмен|дип-жоғары|

Сегменттегі жанама адрестеу:

|11111111|мод010р/м|

Сегменттер арасындағы жанама адрестеу:

|11111111|мод011р/м|

Сегменттер арасындағы тікелей адрестеу:

|10011010|офсет-төмен|офсет-жоғары|сег-төмен|сег-жоғары|

CMP
(Операндтарды салыстыру)

Операндтарды салыстыру

^ Командалық диаграмма:

cmp операнд1, операнд2

Мақсаты: екі операндты салыстыру.

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

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

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

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

Нысан коды (үш формат):

Тіркелу немесе регистрі бар жад:

|001110dw|modregr/m|

AX (AL) регистрімен жедел мән:

|0011110w|--деректер--|дерек, егер w=1|

Регистр немесе жады бар жедел мән:

|100000sw|mod111r/m|--деректер--|деректер, егер sw=0|

ДЕК
(1 операндты азайту)

Операндты бір кеміту

^ Командалық диаграмма:

дек операнд

Мақсаты: Жадтағы операндтың немесе регистрдің мәнін 1-ге азайту.

Жұмыс алгоритмі:
пәрмен операндтан 1-ді шығарады. Команданы орындағаннан кейінгі жалаушалардың күйі:

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

Тіркелу: |01001reg|

^ Регистр немесе жад: |1111111w|mod001r/m|

DIV
(Бөлу қолтаңбасы жоқ)

Қол қойылмаған бөлім

Команданың құрылымы:

div бөлгіш

Мақсаты: Екі белгісі жоқ екілік мәндер арасында бөлу операциясын орындау.

^ Жұмыс алгоритмі:
Команда екі операндты қажет етеді - дивиденд және бөлгіш. Дивиденд жанама түрде көрсетіледі және оның мөлшері бөлгіштің өлшеміне байланысты болады, ол командада көрсетілген:

егер бөлгіш өлшемі байт болса, онда дивиденд балта регистрінде орналасуы керек. Операциядан кейін үлес ал-ға, ал қалғаны ah-ға қойылады;

егер бөлгіш көлемі бойынша сөз болса, онда дивидендтің төменгі ретті бөлігі ax-та орналасқан dx:ax регистр жұбында орналасуы керек. Операциядан кейін бөлінді ax-ке, ал қалғаны dx-ке қойылады;

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

^ Команданы орындағаннан кейінгі жалаушалардың күйі:

Қолдану:
Пәрмен операндтардың бүтін бөлінуін орындайды, бөлу нәтижесін бөлім ретінде және бөлімнің қалған бөлігін шығарады. Бөлу операциясын орындау кезінде ерекше жағдай орын алуы мүмкін: 0 - бөлу қатесі. Бұл жағдай екі жағдайдың бірінде орын алады: бөлгіш 0 немесе бөлгіш eax/ax/al регистріне сыймас үшін тым үлкен.

Нысан коды:

|1111011w|mod110r/m|

INT
(Үзу)

Үзіліс қызметінің тәртібін шақыру

^ Командалық диаграмма:

int үзу_саны

Мақсаты: пәрмен операндында көрсетілген үзу нөмірімен үзу қызметінің ретін шақыру.

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

жалаушаларды тіркеу жалаушаларды/жалаушаларды және қайтару мекенжайын стекке итеріңіз. Қайтару адресін жазғанда алдымен cs сегменттік регистрінің мазмұны жазылады, содан кейін eip/ip командасының көрсеткішінің мазмұны жазылады;

if және tf жалауларын нөлге қайтару;

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

^ Команданы орындағаннан кейінгі жалаушалардың күйі:

Қолдану:
Синтаксистен көріп отырғаныңыздай, бұл команданың екі түрі бар:

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

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

Нысан коды (екі формат):

Тіркелу: |01000reg|

^ Регистр немесе жад: |1111111w|mod000r/m|

J.C.C.
JCXZ/JECXZ
(Егер шарт болса секіру)

(CX=Нөл болса секіріңіз/ ECX=Нөл болса секіріңіз)

Шарт орындалса секіріңіз

CX/ECX нөлге тең болса, секіріңіз

^ Командалық диаграмма:

jcc белгісі
jcxz белгісі
jecxz белгісі

Мақсаты: қандай да бір жағдайға байланысты ағымдағы пәрмен сегменті ішінде өту.

^ Команда алгоритмі (jcxz/jecxz қоспағанда):
Операциялық кодқа байланысты жалаушалардың күйін тексеру (ол тексерілетін шартты көрсетеді):

егер тексерілетін шарт ақиқат болса, онда операндпен көрсетілген ұяшыққа өтіңіз;

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

jcxz/jecxz пәрменінің алгоритмі:
ecx/cx регистрінің мазмұны нөлге тең болу шартын тексеру:

егер жағдай тексерілсе

Ассемблер тіліндегі командалар құрылымы Машиналық командалар деңгейіндегі бағдарламалау - компьютерлік бағдарламалау мүмкін болатын ең төменгі деңгей. Машинаның командалық жүйесі машина жабдықтарына нұсқаулар беру арқылы қажетті әрекеттерді орындау үшін жеткілікті болуы керек. Әрбір машиналық нұсқау екі бөліктен тұрады: «не істеу керектігін» анықтайтын операциялық және өңдеу объектілерін анықтайтын операнд, яғни «не істеу керек». Ассемблер тілінде жазылған микропроцессорлық машинаның нұсқауы келесі пішінге ие бір жол болып табылады: белгі командасы/директивалық операнд(лар); түсініктемелер Белгі, пәрмен/директива және операнд кемінде бір бос орын немесе қойынды таңбасымен бөлінген. Команданың операндтары үтірмен бөлінген.

Ассемблер тілінің пәрмен құрылымы Ассемблер командасы трансляторға микропроцессор қандай әрекетті орындау керектігін айтады. Ассемблер директивалары – жинақтау процесіне немесе шығыс файлының қасиеттеріне әсер ететін бағдарлама мәтінінде көрсетілген параметрлер. Операнд деректердің бастапқы мәнін (деректер сегментінде) немесе команда әрекеті орындалатын элементтерді (код сегментінде) көрсетеді. Нұсқау бір немесе екі операндты болуы мүмкін немесе операндсыз болуы мүмкін. Операндтардың саны нұсқау коды арқылы жасырын түрде көрсетіледі. Егер пәрменді немесе директиваны келесі жолда жалғастыру қажет болса, кері қиғаш сызық таңбасы пайдаланылады: "" . Әдепкі бойынша, ассемблер командалар мен директиваларды жазу кезінде бас және кіші әріптерді ажыратпайды. Директивалар мен командалардың мысалдары Count db 1 ; Атауы, директивасы, бір операнд mov eax, 0 ; Команда, екі операнд

Идентификаторлар - айнымалы атаулар мен белгі атауларын белгілеу үшін қолданылатын жарамды таңбалар тізбегі. Идентификатор келесі таңбалардың біреуінен немесе бірнешеуінен тұруы мүмкін: латын әліпбиінің барлық әріптері; 0-ден 9-ға дейінгі сандар; арнайы таңбалар: _, @, $, ? . Белгінің бірінші таңбасы ретінде нүктені пайдалануға болады. Сақталған ассемблер атауларын (директивалар, операторлар, пәрмен атаулары) идентификаторлар ретінде пайдалану мүмкін емес. Идентификатордың бірінші таңбасы әріп немесе арнайы таңба болуы керек. Максималды ұзындықИдентификаторда 255 таңба бар, бірақ аудармашы алғашқы 32 таңбаны қабылдап, қалғанын елемейді. Ассемблер директивасы жоқ жолда жазылған барлық белгілер қос нүктемен аяқталуы керек «:». Белгі, пәрмен (директива) және операнд жолдың кез келген нақты орнында басталуы қажет емес. Бағдарламаның оқуға ыңғайлы болуы үшін оларды бағанға жазу ұсынылады.

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

Түсініктемелер Бағдарламада түсініктемелерді пайдалану оның анықтығын жақсартады, әсіресе командалар жиынының мақсаты түсініксіз болған жағдайда. Түсініктемелер бастапқы модульдегі кез келген жолдан нүктелі үтірмен (;) басталады. "Оң жағындағы барлық таңбалар"; " жолдың соңына түсініктеме беріледі. Түсінікте бос орынды қоса кез келген басып шығаруға болатын таңбалар болуы мүмкін. Түсініктеме бүкіл жолды қамтуы немесе бір жолдағы пәрменді орындауы мүмкін.

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

Жад үлгілері Сегменттерді жарияламас бұрын директива арқылы жад үлгісін көрсету керек. MODEL модификаторы memory_model, calling_convention, OS_type, stack_parameter Ассемблер тілінің негізгі жады үлгілері: жад үлгісі Код адрестеу Деректерді адрестеу Операциялық жүйеАралас кодтар мен деректер MS-DOS ЖАҒЫНДА КІШКЕН ЖАҢЫНДА Қабылданатын КІШІК MS-DOS ЖАҢЫНДА, Windows жоқ MS-DOS ЖАҢЫНДА ОРТА ҚЫЗЫҚ, Windows ЖАҚЫНДА ОРТА ҚЫЗЫҚ MS-DOS жоқ, Windows ЖАҢЫНДА ҚЫСҚАҢЫЗ FAR MS-DOS жоқ, Windows ҮЛКЕН FAR MS-DOS жоқ, Windows ҮЛКЕН FAR MS-DOS жоқ, Windows NEAR Windows 2000, Windows XP, Windows Acceptable FLAT NEAR NT,

Жад үлгілері Шағын үлгі тек 16-биттік MS-DOS қолданбаларында жұмыс істейді. Бұл модельде барлық деректер мен код бір физикалық сегментте орналасқан. Бұл жағдайда бағдарлама файлының өлшемі 64 КБ аспайды. Шағын үлгі бір код сегментін және бір деректер сегментін қолдайды. Бұл үлгіні пайдаланған кезде деректер мен код жақын жерде орналасқан. Орташа үлгі бірнеше код сегменттерін және бір деректер сегментін қолдайды, код сегменттеріндегі барлық сілтемелер әдепкі бойынша алыс деп саналады және деректер сегментіндегі сілтемелер жақын деп саналады. Ықшам модель алыстағы деректерді (алыс) адрестеуді пайдаланатын бірнеше деректер сегменттерін және жақын адрестеуді (жақын) пайдаланатын бір код сегментін қолдайды. Үлкен үлгі бірнеше код сегменттерін және бірнеше деректер сегменттерін қолдайды. Әдепкі бойынша, код пен деректерге барлық сілтемелер алыс деп саналады. Үлкен модель үлкен жады үлгісіне дерлік тең.

Жад үлгілері Жалпақ үлгі сегменттелмеген бағдарлама конфигурациясын болжайды және тек 32 биттік операциялық жүйелерде қолданылады. Бұл модель деректер мен код бір сегментте орналасқанымен шағын үлгіге ұқсас, бірақ ол 32 бит. Директиваға дейін жазық модельге арналған бағдарламаны әзірлеу. пәтер үлгісі директивалардың бірін орналастыруы керек: . 386, . 486, . 586 немесе. 686. Процессорды таңдау директивасын таңдау бағдарламаларды жазу кезінде қолжетімді нұсқаулар жинағын анықтайды. Процессорды таңдау директивасынан кейінгі p әрпі қорғалған жұмыс режимін білдіреді. Деректер мен кодты адрестеу жақын, барлық мекенжайлар мен көрсеткіштер 32 биттік.

Жад үлгілері. MODEL модификаторы жад_моделі, шақыру_конвенциясы, OS_түрі, стек_параметрі Модификатор параметрі сегмент түрлерін анықтау үшін пайдаланылады және келесі мәндерді қабылдай алады: 16 пайдалану (таңдалған үлгінің сегменттері 16 разряд ретінде пайдаланылады) 32 (таңдалған үлгінің сегменттері пайдаланылады) 32-бит ретінде). Calling_convention параметрі процедураны басқа тілдерден, соның ішінде жоғары деңгейлі тілдерден (C++, Pascal) шақыру кезінде параметрлерді беру әдісін анықтау үшін қолданылады. Параметр келесі мәндерді қабылдай алады: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Жад үлгілері. MODEL модификаторы жад_моделі, шақыру_конвенциясы, OS_түрі, стек_параметрі OS_type параметрі әдепкі бойынша OS_DOS болып табылады және қосулы осы сәтбұл осы параметр үшін қолдау көрсетілетін жалғыз мән. Стек_параметрі параметрі келесіге орнатылады: NEARSTACK (SS регистрі DS-ке тең, деректер мен стек аймақтары бір физикалық сегментте орналасқан) FARSTACK (SS регистрі DS-ке тең емес, деректер мен стек аймақтары әртүрлі физикалық сегменттерде орналасқан). Әдепкі мән - NEARSTACK.

Ештеңе жасамайтын бағдарламаның мысалы. 686 P. МҮЛГІЛІК ТЕГІН, STDCALL. ДЕРЕКТЕР. CODE START: RET END START RET – микропроцессор командасы. Ол бағдарламаның дұрыс аяқталуын қамтамасыз етеді. Бағдарламаның қалған бөлігі аудармашының жұмысына қатысты. . 686 P - Pentium 6 (Pentium II) қорғалған режим командаларына рұқсат етілген. Бұл директива процессор үлгісін көрсете отырып, ассемблер нұсқауларының қолдау көрсетілетін жинағын таңдайды. . MODEL FLAT, stdcall – жадының жалпақ моделі. Бұл жад үлгісі Windows операциялық жүйесінде қолданылады. stdcall - процедураны шақыру шарты қолданылады.

Ештеңе жасамайтын бағдарламаның мысалы. 686 P. МҮЛГІЛІК ТЕГІН, STDCALL. ДЕРЕКТЕР. КОД БАСТАУ: ҚАЙТА БАСТАУ. DATA – мәліметтерді қамтитын бағдарлама сегменті. Бұл бағдарламастек пайдаланбайды, сондықтан сегмент. STACK жоқ. . CODE — кодты қамтитын бағдарлама сегменті. START - белгі. END БАСТАУ – программаның соңы және компиляторға бағдарламаның орындалуы START белгісінен басталуы керектігі туралы хабарлама. Әрбір бағдарламаның соңын белгілеу үшін END директивасы болуы керек бастапқы кодбағдарламалар. END директивасына сәйкес келетін барлық жолдар еленбейді.END директивасынан кейін көрсетілген белгі аудармашыға бағдарламаның орындалуы басталатын негізгі модульдің атын айтады. Егер бағдарламада бір модуль болса, END директивасына кейінгі белгіні алып тастауға болады.

Ассемблер тілінің аудармашылары Translator – бағдарлама немесе техникалық құралдар, ол бағдарламалау тілдерінің бірінде ұсынылған бағдарламаны нысандық код деп аталатын мақсатты тілдегі бағдарламаға түрлендіреді. Машина нұсқаулығының мнемотехникасын қолдаудан басқа, әрбір аудармашыда көбінесе басқа ештеңемен үйлеспейтін өз директивалары мен макроқұралдары бар. Ассемблер тілінің аудармашыларының негізгі түрлері: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - Томаш Гриштар (поляк) жазған еркін таратылатын көпжылдық ассемблер, NASM (Netwide Assembler) - тегін Intel x архитектурасына арналған ассемблер 86, оны Саймон Тэтхэм Джулиан Холлмен бірге жасаған және оны қазір Source сайтындағы әзірлеушілердің шағын тобы әзірлеуде. Forge. тор.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Microsoft Visual Studio 2005 бағдарламасында бағдарламаны аудару 1) File->New- тармағын таңдау арқылы жоба жасаңыз. >Жоба мәзірі Және"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Microsoft Visual Studio 2005 бағдарламасында бағдарламаны аудару 2) Жоба ағашында (Көру->Шешім Explorer) қосу"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Бағдарламаны Microsoft Visual Studio 2005 бағдарламасына аудару 3) Code C++ файл түрін таңдаңыз, бірақ кеңейтімі бар атауды көрсетіңіз. asm:

Бағдарламаны Microsoft Visual Studio 2005 бағдарламасына аудару 5) Компилятор параметрлерін орнату. Жоба файлындағы Теңшелетін құрастыру ережелері мәзірін тінтуірдің оң жақ түймешігімен басыңыз...

Бағдарламаны Microsoft Visual Studio 2005 бағдарламасына аударыңыз және пайда болған терезеде Microsoft Macro Assembler таңдаңыз.

Microsoft Visual Studio 2005 бағдарламасындағы бағдарламаның аудармасы hello файлындағы оң жақ түймені басу арқылы тексеріңіз. Сипаттар мәзірінің asm жоба ағашын орнатыңыз және General->Tool: Microsoft Macro Assembler орнатыңыз.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Microsoft Visual Studio 2005 бағдарламасында бағдарламаны аудару 6) Build->Build hello таңдау арқылы файлды құрастырыңыз. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Windows ОЖ-де бағдарламалау Windows ОЖ-де бағдарламалау API функцияларын (Application Program Interface, яғни бағдарламалық қосымша интерфейсі) пайдалануға негізделген. Олардың саны 2000-ға жетеді. Windows бағдарламасы негізінен осындай қоңыраулардан тұрады. Барлық өзара әрекеттесу сыртқы құрылғыларжәне операциялық жүйе ресурстары, әдетте, осындай функциялар арқылы орын алады. операция бөлмесі Windows жүйесітегіс жады үлгісін пайдаланады. Кез келген жад ұяшығының мекенжайы бір 32-биттік регистрдің мазмұнымен анықталады. Windows үшін программалық құрылымдардың 3 түрі бар: диалогтық терезе (негізгі терезе диалог), консольдық немесе терезесіз құрылым, классикалық құрылым (терезелі, жақтау).

Қоңырау Windows функциялары API Анықтама файлында кез келген API функциясы function_name түрі ретінде ұсынылады (FA 1, FA 2, FA 3) Түр – қайтарылатын мән түрі; FAx – ресми аргументтер тізімі олардың пайда болу реті бойынша.Мысалы, int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Бұл функцияхабары және шығу түймесі (немесе түймелері) бар терезені көрсетеді. Параметрлердің мағынасы: h. Wnd – хабарлама терезесі пайда болатын терезенің дескрипторы, lp. Мәтін – терезеде пайда болатын мәтін, лп. Жазба – терезе тақырыбындағы мәтін, u. Түр - терезе түрі, атап айтқанда, шығу түймелерінің санын анықтауға болады.

Windows API int Message функцияларын шақыру. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); API функциясының барлық дерлік параметрлері іс жүзінде 32 биттік бүтін сандар: HWND - 32 биттік бүтін сан, LPCTSTR - жолға 32 биттік көрсеткіш, UINT - 32 биттік бүтін сан. Функцияның жаңа нұсқаларына өту үшін функция атына «A» жұрнағы жиі қосылады.

Windows API int Message функцияларын шақыру. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); MASM пайдаланған кезде аттың соңына @N N қосу керек - берілген аргументтер стекте алатын байт саны. Win 32 API функциялары үшін бұл санды n аргументтерінің 4-ке көбейтілген саны ретінде анықтауға болады (әр аргументтегі байт): N=4*n. Функцияны шақыру үшін ассемблердің CALL нұсқаулығын пайдаланыңыз. Бұл жағдайда барлық функция аргументтері оған стек (PUSH командасы) арқылы беріледі. Аргументтерді беру бағыты: СОЛДАН ОҢҒА - ТӨМЕН ЖОҒАРҒА. Алдымен u аргументі стекке шығарылады. Түр. Көрсетілген функцияға шақыру келесідей болады: CALL Message. Қорап. A@16

Windows API int Message функцияларын шақыру. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Кез келген API функциясын орындау нәтижесі әдетте EAX регистрінде қайтарылатын бүтін сан болып табылады. OFFSET директивасы «сегменттегі ығысуды» немесе жоғары деңгейлі тіл терминдеріне аударғанда жолдың басына «көрсеткішті» білдіреді. SI жүйесіндегі #define сияқты EQU директивасы тұрақты мәнді анықтайды. EXTERN директивасы аудармашыға функция немесе идентификатор осы модульге сыртқы екенін айтады.

«Бәріне сәлем!» бағдарламасының мысалы . 686 P. МҮЛГІЛІК ТЕГІН, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 ДБ «Менің бірінші бағдарламам», 0 STR 2 ДБ «Бәріне сәлем!», 0 HW DD ? EXTERN Хабар. Қорап. A@16: ЖАҚЫНДА. КОД БАСТАУ: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL хабарламасы. Қорап. A@16 ҚАЙТА АЯҚТАУ БАСТАУ

INVOKE директивасы MASM тілінің трансляторы сонымен қатар макроқұралдың көмегімен функция шақыруларын жеңілдетуге мүмкіндік береді - INVOKE директивасы: INVOKE функциясы, параметр1, параметр2, ... Функция шақыруына @16 қосудың қажеті жоқ; параметрлер функция сипаттамасында берілген ретпен дәл жазылады. Транслятордың макросы арқылы параметрлер стекке орналастырылады. INVOKE директивасын пайдалану үшін сізде PROTO директивасын пайдалана отырып функция прототипінің сипаттамасы болуы керек: Хабарлама. Қорап. PROTO: DWORD, : DWORD Егер бағдарлама көптеген Win 32 API функцияларын пайдаланса, C: masm 32includeuser 32 қосу директивасын қолданған жөн. inc

Тақырып 2.5 Процессорларды программалау негіздері

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

Символдық командалық кодтау тілі деп аталады құрастырушы.

Ассамблея тіліәрбір айтылым дәл бір машина командасына сәйкес келетін тіл болып табылады.

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

Ассемблер тілінің оны жоғары деңгейлі тілдерден ерекшелейтін бірнеше ерекшеліктері бар:

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

2. Ассемблер тіліндегі бағдарламашы мақсатты машинада бар барлық нысандар мен нұсқауларға қол жеткізе алады.

Машинаға бағытталған тілдерде бағдарламалау негіздерін түсіну мыналар үшін пайдалы:



ДК архитектурасын жақсырақ түсіну және компьютерлерді сауатты пайдалану;

Қолданбалы есептерді шешуге арналған бағдарламалардың алгоритмдерінің неғұрлым ұтымды құрылымдарын жасау;

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

ең маңызды есептерді шешуге арналған бағдарламаларды құрастыру (машиналық-бағытталған тілде жазылған программа әдетте тиімдірек – жоғары деңгейлі тілдерден аудару нәтижесінде алынған бағдарламалардың 30-60 пайызына қысқарақ және жылдамырақ)

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

Ассемблер тіліндегі бағдарлама компьютерлердің бір тобында ғана жұмыс істей алады, ал жоғары деңгейлі тілде жазылған бағдарлама әртүрлі машиналарда жұмыс істей алады.

Ассемблер тілінің алфавиті ASCII таңбаларынан тұрады.

Сандар тек бүтін сандар. Сонда бар:

Екілік сандар В әрпімен аяқталады;

D әрпімен аяқталатын ондық сандар;

Он алтылық сандар Н әрпімен аяқталады.

Жедел жад, регистрлер, мәліметтерді ұсыну

МП-ның белгілі бір қатары үшін жеке программалау тілі – ассемблер тілі қолданылады.

Ассемблер тілі машиналық кодтар мен жоғары деңгейлі тілдер арасында аралық орынды алады. Бұл тілде бағдарламалау оңайырақ. Ассемблер тіліндегі бағдарлама жоғары деңгейлі тілдегі (программист үшін ассемблерге қарағанда қарапайым) программаға қарағанда белгілі бір машинаның мүмкіндіктерін (дәлірек айтқанда МП) тиімдірек пайдаланады. MP KR580VM80 үшін ассемблер тілінің мысалын қолдана отырып, машинаға бағытталған тілдерде бағдарламалаудың негізгі принциптерін қарастырайық. Тілде бағдарламалау үшін жалпы әдістеме қолданылады. Бағдарламаларды жазудың арнайы техникалық әдістері мақсатты МП архитектурасы мен командалық жүйесінің ерекшеліктерімен байланысты.

Бағдарламалық қамтамасыз ету моделі MP KR580VM80 негізіндегі микропроцессорлық жүйе

1-суретке сәйкес MPS бағдарламалық моделі

MP порттар жады

С З А.С. П C

1-сурет

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

А– 8 разрядты аккумулятор регистрі. Ол депутаттың негізгі тізілімі болып табылады. ALU-де орындалатын кез келген операция аккумуляторға өңделетін операндтардың бірін орналастыруды қамтиды. ALU-дағы операцияның нәтижесі де әдетте А-да сақталады.

B, C, D, E, H, L– 8-биттік жалпы мақсаттағы регистрлер (GPR). Ішкі жадыдепутат. Өңделген ақпаратты, сондай-ақ операция нәтижелерін сақтауға арналған. 16-разрядты сөздерді өңдеу кезінде регистрлер BC, DE, HL жұптарын құрайды, ал қос регистр бірінші әріп – B, D, H деп аталады. Регистрлер жұбында ең жоғарғысы бірінші регистр болып табылады. H және L регистрлері деректерді сақтау үшін де, жедел жады ұяшықтарының 16 разрядтық мекенжайларын сақтау үшін де қолданылатын арнайы қасиетке ие.

FL– жалау регистрі (таңбалық регистр) МП-да арифметикалық және логикалық амалдарды орындау нәтижесінің бес белгісі сақталатын 8-разрядты регистр. Суретке сәйкес FL пішімі

Бит C (CY - тасымалдау) - тасымалдау, арифметикалық амалдарды орындау кезінде байттың жоғары ретінен тасымалдау болған жағдайда 1-ге орнатылады.

P бит (паритет) – паритет, нәтиженің биттеріндегі бірліктердің саны жұп болса, 1-ге орнатылады.

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

Z биті (нөл) – операцияның нәтижесі 0 болса, 1 мәніне орнатылады.

S бит (белгі) – нәтиже теріс болса 1-ге, ал нәтиже оң болса 0-ге орнатылады.

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

Р.С– келесі орындалатын команданың адресін сақтауға арналған 16 разрядты регистр (программалық есептегіш). Бағдарлама есептегішінің мазмұны келесі нұсқау байты алынғаннан кейін автоматты түрде 1-ге артады.

0000Н – 07FF мекенжайының бастапқы жады аймағында бар бақылау бағдарламасыжәне демонстрациялық бағдарламалар. Бұл ROM аймағы.

0800 – 0AFF – зерттелетін бағдарламаларды жазуға арналған мекенжай аймағы. (ЖЕДЕЛ ЖАДТАУ ҚҰРЫЛҒЫСЫ).

0В00 – 0ВВ0 - деректерді жазуға арналған адрес аймағы. (ЖЕДЕЛ ЖАДТАУ ҚҰРЫЛҒЫСЫ).

0ВВ0 – стектің бастапқы мекенжайы. (ЖЕДЕЛ ЖАДТАУ ҚҰРЫЛҒЫСЫ).

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

Мәліметтер форматы және ассемблер тілінің командалық құрылымы

MP KR580VM80 жады байт деп аталатын 8 разрядты сөздердің массиві болып табылады.Әр байттың жад ұяшықтарының тізбегіндегі орнын анықтайтын өзінің 16 разрядты адресі бар. МП ROM және жедел жадта болуы мүмкін 65536 байт жадты адрестей алады.

Деректер пішімі

Деректер жадта 8 разрядты сөздер түрінде сақталады:

D7 D6 D5 D4 D3 D2 D1 D0

Ең аз маңызды бит 0 бит, ең маңызды бит 7 бит.

Пәрмен оның пішімімен, яғни оған бөлінген биттердің санымен сипатталады, олар байт-байт бойынша белгілі бір функционалды өрістерге бөлінеді.

Пәрмен пішімі

MP KR580VM80 пәрмендері бір, екі немесе үш байт пішіміне ие. Көпбайтты командалар көрші тілдерде орналастырылуы керек. Пәрмен пішімі орындалатын операцияның ерекшеліктеріне байланысты.

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

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

Екінші және үшінші байттарда операциялар орындалатын деректер немесе деректердің орнын көрсететін мекенжайлар болуы мүмкін. Әрекеттер орындалатын мәліметтер операндтар деп аталады.

2-суретке сәйкес бір байт команда пішімі

4-сурет

Ассемблер тілінің командаларында операциялық код ағылшын сөздерін жазудың қысқартылған түрі – мнемоникалық белгіге ие. Мнемотехника (грек тілінен mnemonic – есте сақтау өнері) командаларды функционалдық мақсаты бойынша есте сақтауды жеңілдетеді.

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


Адресті анықтау әдістері

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

MP KR580VM80 үшін келесі адрестеу әдістері бар:

Тікелей;

Тіркелу;

Жанама;

Қапталған.

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

Түзу (абсолюттік) адрестеу операндтың (енгізу немесе шығыс) адрес бойынша жадта орналасуын болжайды, оның коды нұсқау кодынан кейін бірден программаның ішінде орналасады. Үш байтты командаларда қолданылады.

Тіркелу адрестеу операндтың (кіріс немесе шығыс) МП ішкі регистрінде болуын болжайды. Бір байтты командаларда қолданылады

Жанама (имплицитті) адрестеу МП ішкі регистрінде операндтың өзі емес, оның жадыдағы адресі болады деп болжайды.

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

Командалық жүйе

МП командалық жүйесі МП орындай алатын қарапайым әрекеттердің толық тізімі болып табылады. Осы командалармен басқарылатын МП қарапайым арифметикалық және логикалық операциялар, мәліметтерді беру, екі мәнді салыстыру және т.б. сияқты қарапайым әрекеттерді орындайды. KR580VM80 МП командаларының саны 78 (244 өзгертулерді ескере отырып).

Келесі командалар топтары бөлінеді:

Мәліметтерді тасымалдау;

Арифметика;

Ой қозғау;

Секіру командалары;

Енгізу/шығару, басқару және стек командалары.


Командаларды сипаттау және программаларды құру кезінде қолданылатын белгілер мен аббревиатуралар

Таңба Қысқарту
ADDR 16-биттік мекенжай
ДЕРЕКТЕР 8-биттік деректер
ДЕРЕКТЕР 16 16-биттік деректер
ПОРТ 8-биттік енгізу/шығару құрылғысының мекенжайы
БАЙТ 2 Пәрменнің екінші байты
БАЙТ 3 Команданың үшінші байты
R, R1, R2 Регистрлердің бірі: A, B, C, D, E, H, L
Р.П. Регистрлік жұптардың бірі: В – ВС жұбын анықтайды; D - DE жұбын анықтайды; H – HL жұбын көрсетеді
RH Жұптың бірінші тіркелімі
Р.Л. Жұптың екінші реестрі
Λ Логикалық көбейту
В Логикалық қосу
Екінші модульді қосу
М Мекенжайы HL регистр жұбының мазмұнын көрсететін жад ұяшығы, яғни M = (HL)



Жоғарғы