№6-7 дәріс тақырыбы: Ассемблер тілінің негіздері
Оқу нәтижелері:
Ассемблер тілі туралы түсінік алады.
Ассемблер тілінің құрылымымен танысады.
Тілдің командаларын үйренеді.
Жоспар:
Ассемблер тілі туралы түсінік.
Ассемблер тілінің құрылымы.
Тілдің командалары.
Компьютерлік архитектурамен толық танысқанда төмен деңгейлі бағдарламалау сәтті, бұл сайып келгенде оны түсінуге әкеледі. Бағдарламалау принциптері мен тәсілдері жалпы тілге байланысты емес. Негізгі талап-логикалық ойлау қабілеті.
Ассемблер компилятордан машина тіліне "бір-бір"аудармасын орындауға болатын бастапқы тілдің аз күрделілігімен ерекшеленеді. Ассемблер жиі дизассемблирлеу мүмкіндігімен бірге жүреді, бұл оны көптеген басқа бағдарламалау тілдерінен айырады. Ассемблер тілін үйрену жоғары деңгейдегі кез келген тілге қарағанда оңайырақ. Ассемблерді білу басқа тілдерде дайындалған бағдарлама кодын түсінуге көмектеседі.
Компьютер архитектурасы жиі пайдаланушыға қол жетімді көптеген ресурстар ретінде анықталады. Бұл командалар жүйесі, Жалпы регистрлер, CPU күйі сөзі және мекенжай кеңістігі. Бағдарламаны ассемблер тілінен машина командаларының тіліне аудару процесі ассемблирлеу деп аталады.
Ассемблирлеу процесі келесідей:
Ассембляцияланатын бағдарламаны құрайтын командалардың реттілігі үшін жадты резервтеу.
Пайдаланылатын сәйкестендіргіштерді жадыдағы мекенжайлармен салыстыру.
Ассемблерлік командаларды және идентификаторларды олардың машиналық баламаларына көрсету.
Мұндай процесті жүзеге асыру үшін мекенжай есептегіші және идентификаторлар кестесі қажет.
Программист константаларды, командаларды және аралық есептеу нәтижелерін сақтау үшін бос емес, бірақ әдетте жүйелі жазылған командалар жүйелі жад ұяшықтарында орналасады деп болжанады.
Сонымен қатар, басқару және басқару жүйелері, басқару және басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері, басқару жүйелері. Әдетте операциялық жүйеден бағдарламаға кіру нүктесі белгіленген.
Ассемблерде бағдарламалау процессор командалар жүйесінің ерекшелігін, құрылғыларға қызмет көрсету және үзулерді өңдеу әдістерін білуді білдіреді. Күйе командаларды жабдық пен операциялық жүйенің жиынтығына байланысты микробағдарламалармен және жүйелік шақырулармен кеңейтуге болады. Бұл жадты адрестеу және қол жетімді құрылғылар жиынтығын коммутациялау шешімдеріне әсер етеді. Бірақ машина коды деңгейінде ақпаратты өңдеу құралдарын ұсыну және сату туралы жеткілікті жалпы келісімдер бар [ [ 1 ] , [ 20 ] , [ 36 ] , [ 55 ] , [ 56 ] , [ 71 ] , [ 72 ] ].
Бағдарлама кодының құрылымы және оның қасиеттері:
Қатысушылық. Бағдарлама коды кез-келген абсолютті мекен-жайға орналастырылуы ыңғайлы.
Жад беттерін парақтау. Мекен-жайы мен нақты қол жетімді жады арасындағы арақатынас бағдарламаны орындау процесінде қайта қарауды талап ете алады.
Деректерге тәуелділік. Бағдарлама, әсіресе, құрылғылардың порттары немесе буферлері арқылы ақпарат алмасу кезінде деректердің дайындығы мен жаңартылуын ескеруі тиіс.
Орналастыру динамикасы. Бағдарлама жадында қадамдық түрде, айналдыру әдісімен, оның құрауыштарын нақты пайдалану статистикасын ескеретін динамикалық оңтайландыруды қолдана отырып орналастырылуы мүмкін.
Әдетте, ассемблер командалар жүйесіне қарамастан, жадты бөлуді басқару және Код компиляциясын басқару құралдарын қамтамасыз етеді, бұл программистке машиналық тіл деңгейінде нақты шешімдер қабылдауға мүмкіндік береді. Парақтарды жөндеу және басып шығару құралдары бар. Қажет болса, тіл деңгейін макростар арқылы арттыруға болады.
Ассемблер тілі мекен-жай және мәндер сияқты деректермен жұмыс істейді. Әдетте, командалардың операндтарының жазбаларында көрнекілік үшін префиксті таңбалардың көмегімен адрестердің @және #мәндерінің сыртқы айырмашылығы енгізіледі. Деректер блоктары мен литералдарға арналған арнайы жазу формалары мүмкін.
Ассемблерде командаларды жазу кезінде жолды белгіні, команда кодын, операндтарды және түсініктемелерді бірізді орналастыруға арналған өрістерге құрылымдау қабылданды. Мүмкін болатын шешімдердің ең көп түрлілігі машиналық тіл деңгейінде операндтарды адрестеу формаларымен байланысты, олар туралы бұдан әрі сөз болады.
Бір символдық командаға ассемблермен бөлінген сөздер саны тек команда кодына ғана емес, сонымен қатар операндтарды адрестеу әдісіне де байланысты болады, мүмкін бұл жерде талқылануы қарастырылмаған бағдарламалар мен деректерді кодтаудың басқа аспектілеріне де байланысты. Ассемблирлеу кезінде бағдарлама K1 командаларының соңғы ретімен ыдырайды деп айтуға жеткілікті ... W1 машина сөздерінің соңғы интервалдары салыстырылатын Kn... Wm (a) А - кодтау аспектілерінің жүйесіне байланысты.
[K1 ... Kn] -> [W1 ... Wm(a)]
Команданың операндалық бөлігі - мекен-жайлар, арнайы регистрлер, сумматорлар, жалпы жадтағы мәндер, үзулер мен жағдайлар шкаласы немесе нақты архитектураға Тән басқа нәрсе.
Командаға байланысты операндтарды адрестеудің әртүрлі әдістері қолданылады:
белгісіз-команда өзі "біледі", қайда және не өңдейді, деректерді қайда алады және нәтижені қайда орналастырады;
тікелей-операнд тікелей командада орналасқан;
тікелей мекенжайлар-мекенжай коды операндта орналасқан;
индекстелетін мекен-жайлар-операндтардың бірі басқа операндтардың мекен-жайын есептеу кезінде индекс ретінде пайдаланылады;
базаланатын (тіркелім бойынша) - операндтардың мекен-жайларын қайта есептеу үшін базалық тіркелім көрсетілген;
салыстырмалы (ағымдағы позиция бойынша) - адресация команданың орналасу мекенжайын ескереді;
жанама (аралық сөз арқылы) - операнд мәннің мекенжайын сақтайтын сөзді көрсетеді;
өзгертілетін (мән-Регистр бойынша) - бір операнд басқа операндтың мекенжайын өзгертетін мәнді сақтайтын сөзді көрсетеді;
стек-операнд, оған қол жеткізу стек тәртібіне бағынады - "бірінші келді-соңғы кетті".
Ассемблирлеуді басқару әдетте авторландыру құралдарын, жөндегішпен өзара әрекеттесуді, листинг беруді, мәтіндік редакторды, операциялық жүйені және BIOS арқылы қол жетімді аппараттық деңгейдегі құралдарды қамтамасыз етеді.
START-операциялық жүйеден бағдарламаға кірудің типтік белгісі, бағдарлама кодының орындалуының бастапқы мекен-жайын бейнелейтін ассемблердің көптеген тілдерінде.
Код дайындалған объектілермен бірге модуль ретінде бағдарламаны қолдануды қамтамасыз ететін "жүктеуші" арнайы бағдарламасын пайдалануға есепте қалыптастырылуы мүмкін.
Әдетте, арифметикалық есептеулер мен басқару берілістерінің командаларынан басқа командалар деректерді манипуляциялау командаларын қамтиды, оларды алмасу буфері арқылы енгізу-шығару, мүмкін үзіліс механизмі арқылы қол жетімді. Бұл ретте нөлдік немесе нольдік емес кодты, теріс немесе оң санды өңдеу, разрядты машиналық сөздің шегінен тыс ауыстыру және т.б. сияқты ағымдағы орындалатын команданың қасиеттерін көрсететін процестің жай-күйінің коды пайдаланылады.
2.6-к е с т е.бір фазалы және екі фазалы қысқа тұйықталу тоқтарын есептеу бір фазалы және екі фазалы қысқа тұйықталу тоқтарын есептеу. Басқа командалар да кездеседі, олардың әртүрлілігі ассемблирлеу мен ассемблерлерді бағдарламалау жүйкесінде қолдану ерекшеліктеріне әсер етпейді. Бұл ассемблер тілі бағдарламаларды компиляциялау кезінде нақты машина (КМ) рөлінде бағдарламалаудың жүйкесі.
Интерпретатордың ядросына Орнатылатын операциялар параметрлерге қол жеткізудің және жасалған нәтижені орналастырудың стандартты ережелеріне сәйкес келеді. Сол ережелерге компиляцияланатын код бағынуы керек. Бұл ресми түрде енгізілген және бағдарламаланатын функцияларды тең құқылы деп санауға мүмкіндік береді. Бағдарламаның бастапқы мәтіні бойынша Компилятор оған балама бағдарлама кодын жасайды. Компиляция процесінің ерекшеліктері қарапайым тілдер үшін өте күрделі, сондықтан компиляция нәтижесінің сипаттамасы тілдік-бағытталған абстрактілі машиналар терминдерінде жиі беріледі. Мұндай тәсіл бағдарламалық жүйелерді әзірлеудің бірқатар технологиялық проблемаларын шешу үшін пайдалы (ұтқырлық, сенімділік, архитектурадан тәуелсіздік және т. б.).)
Бағдарламалауға императивті және функционалдық тәсілдерді салыстыру кезінде, П.Лэндин (P. J. Landin) Лиспа семантикасының машиналық-тәуелді аспектілерінің ерекшеліктері үшін абстрактілі SECD машинасын ұсынды. Бұл машинаның толық сипаттамасын функционалдық бағдарламалау кітаптарынан табуға болады [ [ 23 ] , [ 64 ] ]. Sect машинасы - бағдарламалау тілінің операциялық семантикасын анықтау үшін ыңғайлы абстрактілі машинаға (АМ) арналған бағдарламалар мысалында ассемблерлік бағдарламалау техникасын қарастырайық. Бұл төрт құрылымдық тіркеумен жұмыс істейтін автомат: аралық нәтижелер үшін стек, атаулы мәндерді орналастыру үшін контекст, бағдарламаларды басқару, резервтік жад (Stack, Environment, Control list, dump). Регистрлер атомдар немесе тізімдер нысанында өрнектерді сақтауға бейімделген. Машинаның жай-күйі осы регистрлердің мазмұнымен толық анықталады. Сондықтан машинаның жұмыс істеуі мынадай түрде көрінетін командаларды орындау кезінде регистрлердің мазмұнын өзгерту терминдерінде жеткілікті дәл сипаттауға болады:
s e c d - > s 'e' c' d' - ескі күйден жаңасына ауысу.
Lysp-интепретатордың кірістірілген командаларын және базалық Түлкі бағдарламаларын компиляциялау нәтижелерін сипаттау үшін келесі командалар қажет:
LD - мәтінмәннен стекке осы енгізу;
LDC-бағдарламадан стекқа константаны енгізу;
LDF-стек функциясының анықтауын енгізу;
AP-шыныда анықтау функциясын қолдану;
RTN-функцияны анықтаудан оны тудыратын бағдарламаға қайтару;
SEL-стектің белсенді (жоғарғы) мәніне байланысты тармақ;
JOIN-тармақтаудан кейін жалпы нүктеге көшу;
CAR - белсенді стек мәнінен бірінші элемент;
CDR-бірінші элемент жоқ Белсенді стек мәні;
CONS-стектің екі жоғарғы мәні бойынша торапты қалыптастыру;
ATOM-стек жоғарғы элементінің бөлінбеуі (атомдық);
EQ-стек екі жоғарғы мәнінің теңдігі;
SUB1-стектің жоғарғы элементінен 1-ді алу;
ADD1 - стектің жоғарғы элементіне 1 қосу;
STOP-тоқтату.
Стек дәстүрлі түрде "бірінші келді, соңғысы кетті". Абстрактілі машинаның әрбір командасы стектің жұмыс істеу кезінде пайдаланылатын элементтерінің санын" біледі", ол стектен алып тастайды және олардың орнына жасалған нәтижені орналастырады. Басқарушы бағдарламаның тіркелімінде бірінші болып бастап кезек бойынша командалар орындалады. Машина "тоқтату" командасын орындау кезінде жұмысын тоқтатады, ол машинаның жай-күйіндегі өзгерістердің болмауымен формальды түрде сипатталады:
s e (STOP ) d -> s e (STOP ) d
Henderson кейін, өңделетін элементтерді тізімнің қалған бөлігінен нақты бөлу үшін келесі белгілерді қолданамыз: (x. l) - тізімнің бірінші элементі-x, қалғандары l тізімінде. (x y. l) - тізімнің бірінші элементі - x, тізімнің екінші элементі-y, l тізімінде қалғандары және т.б. енді біз жоғарыда аталған барлық командалардың әсерін әдістемелік сипаттай аламыз.
s e (LDC q . c) d -> (q . s) e c d
(a . s) e (ADD1 . c) d -> (a+1 . s) e c d
(a . s) e (SUB1 . c) d -> (a-1 . s) e c d
(a b . s) e (CONS . c) d -> ((a . b) . s) e c d
((a . b) . s) e (CAR . c) d -> (a . s) e c d
((a . b) . s) e (CDR . c) d -> (b . s) e c d
(a . s) e (ATOM . c) d -> (t . s) e c d
(a b . s) e (EQ . c) d -> (t . s) e c d
мұнда t - логикалық мән.
Контексте орналасқан мәндерге қол жеткізу үшін, тізімнің ұзындығы берілген мекен-жайдан асып түсетін жорамалда берілген N нөмірі бар элементті тізімнен ерекшелейтін арнайы N-th функциясын анықтауға болады.
(DEFUN N-th (n list )
(IF (EQ n 0 )(CAR list )
(N-th (SUB1 n ) (CDR list ) )) )
Біз Лисп-машина командаларының сипаттамасын жалғастырамыз.
s e (LD n . c) d -> (x . s ) e c d, мұнда x-бұл мән (N-th n e )
Тармақтарды іске асыру кезінде басқарушы бағдарлама келесі үлгіге сәйкес келеді:
( ... SEL ( ... JOIN ) ( ... JOIN ) ... )
Бұл дипломдық жобаның мақсаты-электр стансасының электр стансасының электр стансасының электр стансасының электр стансасының электр стансасының электр стансасының электр стансасының трансформаторларын таңдау. Үшін үлкен сенімділік орындау кезінде бұтақтары жалпы бөлім сақталады дампе - резервтік жад, ал соңында бұтағы - қалпына тіркелімінде басқарушы жад.
(t . s) e (SEL c1 c0 . c) d -> s e ct (c . d)
s e (JOIN ) (c . d) -> s e c d
мұнда ct-t шын мәніне байланысты C1 немесе C0.
Процедураларды шақыруды ұйымдастыру контексті анықтаудың денесін түсіндіру кезінде болатын жергілікті өзгерістерден қорғауды талап етеді. Ол үшін стек функциясының анықтамасын енгізгенде функцияның анықтау коды мен ағымдағы контекстің көшірмесі бар арнайы құрылым жасалады. Бұған дейін стекте процедураның нақты параметрлері орналастырылуы тиіс. Процедура RTN командасымен аяқталады, регистрлерді қалпына келтіреді және процедураның нәтижесін стекте орналастырады.
s e (LDF f . c) d > ((f . e) . s) e c d
((f . ef) vf . s) e (AP . c) d > NIL (vf . ef) f (s e c . d)
(x) e (RTN ) (s e c . d) > (x . s) e c d
мұнда F - анықтама денесі, EF - функцияны шақыру кезінде контекст, VF - функцияны шақыру үшін нақты параметрлер, x-функция нәтижесі.
3.1 жаттығу. Бағдарлама c түрі бар:
c = (LD 3 ADD1 LDC 128 EQ STOP)
E = (101 102 103 104 105) болсын. Бағдарламаның жұмыс істеу кезінде s стек күй тізбегін жазыңыз және не істеп жатқанын тұжырымдаңыз.
Жауап: бұл бағдарлама 3 мекен-жайы бойынша e контекстінде сақталған 1 мәннен аз екендігін тексереді. Оның жұмыс істеу кезінде s стек келесі жай-күйден өтеді:
NIL
(104 )
(105 )
(128 105 )
(NIL )
3.2 жаттығу. Келесі өрнектерге баламалы нәтиже беретін басқару бағдарламасын жазыңыз:
(CADR e )
(EQ (CAR e) 'QUOTE )
(COND ((EQ n 0 )(CAR l )) (T (CONS (SUB1 n ) (CDR l ) )) ))
(E, n, l мәндерінің адрестерін сәйкесінше @e, @n, @l деп белгілеуге болады.)
Жауабы бар:
( LD @e CDR CAR )
( LD @e CAR LDC QUOTE EQ )
( LD @n LDc 0 EQ SEL (LD @l CAR JOIN ) (LD @n SUB1 LD @l CDR CONS JOIN ))
3.3 жаттығу. Тізімнің ұзындығы берілген мекен-жайдан асып түсетінін болжауда бағдарламада берілген мекен-жай бойынша стектің белсенді мәнін сақтайтын SET командасының спецификациясын жазыңыз.
Орындау 3.3-жаттығу: тізімдегі ескі элементті жаңа элементті ауыстыратын функция қажет.
(DEFUN ASS (e n list )
(IF (EQ n 0 )(CONS e (CDR l ))
(CONS (CAR l )(ASS e (SUB1 n ) (CDR l ) ))) )
Содан кейін SET командасын келесідей сипаттауға болады:
(x . s) e (SET n . c) d -> s xne c d
мұнда xne = (ASS x n e) - контексттің жаңа күйі.
Қаралған жаттығуларда Ассемблерде жұмыс істеу кезінде программист шешетін мәселелердің деңгейі көрінеді. SSD абстрактілі машинаның көмегімен төмен деңгейлі бағдарламалау мысалдарымен танысып, машина тілінің операциялық семантикасын көрсететін бірқатар техникалық аспектілерді егжей-тегжейлі анықтауға болады ("функционалдық бағдарламалау негіздері. Дәріс 7.").
Дәстүрлі түрде ассемблер жеңілдетілген компилятор ретінде іске асырылады. Ескере отырып, жоғары жүктемені низкоуровневого бағдарламалау келтіруді бағдарламалар кейде қамтиды жүйесіне программалау ойлап ассемблер қамтамасыз ететін басқа қолайлы ауытқу кең ауқымды түрлендіру бағдарламалар ассемблерде, оларды оңтайландыру, бейімделу және дамыту аппаратура. Ассемблер үшін интерпретациялаушы автомат олардың әрекет ету салаларымен атауларды оқшаулаудың жоқтығынан және нақты машинаның тілі командаларды - кірістірілген іске асырудың арқасында абстрактілі SECD машинасына арналған автоматқа қарағанда іске асыру оңайырақ жасалған.
Ассемблердің нақты машинаға немесе архитектураға тәуелділігі бағдарламаларды жаңа компьютерлік жүйелерге көшіруде айтарлықтай қиындықтар туғызады. Бұдан кейінгі дәрістер осындай тәуелділікті жеңу әдістеріне, Тәуелсіздік бағасы жадтың немесе уақыттың артық шығыны және бағдарламалаудың жоғары өнімділігіне қол жеткізу құралдары болған жағдайда бағдарламалардың тиімділігін арттыру тәсілдеріне арналған.
Достарыңызбен бөлісу: |