Кіріспе

Төмен деңгейлі бағдарламалау тілі

Компьютерлік бағдарламалауда, ассемблерлік тіл (немесе құрастыру тілі, көбінесе ассемблер деп аталады және әдетте ASM немесе asm деп қысқартылады) – бұл тілдегі нұсқаулар мен архитектураның машиналық код нұсқаулары арасында өте күшті сәйкестікке ие кез келген төмен деңгейлі бағдарламалау тілі. Ассемблерлік кодты орындалатын машиналық кодқа құрастырушы бағдарламасы арқылы түрлендіреді. "Құрастырушы" терминін алғаш рет Уилкс, Уилер және Гилл 1951 жылғы "Электрондық цифрлық компьютер үшін бағдарламаларды дайындау" кітабында қолданған, және ол белгілі бір компьютерлік архитектураға тән. Кейде бір архитектура үшін бірнеше құрастырушы болуы мүмкін, ал кейде құрастырушы операциялық жүйеге немесе нақты операциялық жүйелерге тән болады. Көптеген ассемблерлік тілдер операциялық жүйе шақырулары үшін арнайы синтаксис ұсынбайды, және көптеген ассемблерлік тілдерді кез келген операциялық жүйемен әмбебап түрде қолдануға болады, себебі тіл процессордың барлық мүмкіндіктеріне қол жеткізуді қамтамасыз етеді, ал барлық жүйелік шақыру механизмдері осы мүмкіндіктерге негізделген. Ассемблерлік тілдерден айырмашылығы, көптеген жоғары деңгейлі бағдарламалау тілдері әдетте бірнеше архитектураларға тасымалданады, бірақ интерпретациялау немесе компиляциялау қажет, бұл құрастыруға қарағанда әлдеқайда күрделі тапсырмалар. Компьютерлік технологияның алғашқы онжылдықтарында жүйелік және қолданбалық бағдарламалаудың барлығы ассемблерлік тілде жасалған. Белгілі бір мақсаттар үшін әлі де алмастырылмайтын болса да, қазіргі уақытта бағдарламалаудың көп бөлігі жоғары деңгейлі интерпретацияланатын және компиляцияланатын тілдерде жүргізіледі. "Күміс оқ жоқ" еңбегінде Фред Брукс ассемблерлік тілден бас тартудың әсерін былай қорытындылады: "Әрине, бағдарламалық қамтамасыз етудің өнімділігін, сенімділігін және қарапайымдылығын арттырған ең күшті қадам – бағдарламалау үшін жоғары деңгейлі тілдерді прогрессивті пайдалану болды. Көптеген сарапшылар бұл жетістіктің өнімділікті кем дегенде бес есе арттырғанын, сондай-ақ сенімділік, қарапайымдық және түсініктілікте де пайда әкелгенін айтады."

Ассемблерлік тілдің синтаксисі

Ассемблерлік тіл әрбір төменгі деңгейдегі машиналық нұсқауды немесе опкодты, әрбір директиваны, әдетте әрбір архитектуралық регистрді, флагты және т.б. көрсету үшін мнемониканы пайдаланады. Кейбір мнемоникалар алдын ала құрастырылған, ал кейбіреулерін пайдаланушы өздігінен анықтай алады. Көптеген операциялар толыққанды нұсқауды құру үшін бір немесе бірнеше операндты қажет етеді. Көптеген ассемблерлер бағдарлама мен жад мекенжайлары үшін атаулы тұрақтыларға, регистрлерге және белгілерге рұқсат береді, сондай-ақ операндтар үшін өрнектерді есептей алады. Осылайша, бағдарламашылар еңбек сілтеуге келмейтін қайталанатын есептеулерден босатылады және ассемблерлік бағдарламаларды машиналық кодтан әлдеқайда оқу оңай. Архитектураға байланысты, бұл элементтер нақты нұсқаулар немесе адрестеу режимдерін құру үшін офсеттер немесе басқа да деректермен, сондай-ақ белгілі бір адрестермен біріктірілуі мүмкін. Көптеген ассемблерлер бағдарламаны әзірлеуді жеңілдету, құрастыру процесін басқару және қателерді жоюға көмектесу үшін қосымша механизмдер ұсынады. Кейбіреулері бағанға бағдарланған, яғни нақты өрістер белгілі бір бағандарда орналасқан; мұндай тәсіл 1950-ші және 1960-шы жылдардың басында перфокарталарды қолданған машиналарда кең таралған. Кейбір ассемблерлерде еркін пішіндегі синтаксис қолданылады, онда өрістер үтір сияқты разделительдермен немесе бос орынмен бөлінеді. Ал кейбіреулері гибридті болып келеді, мысалы, белгілер белгілі бір бағанда орналасса, ал қалған өрістер разделительдермен бөлінеді; мұндай тәсіл 1960-шы жылдары бағанға бағдарланған синтаксистен гөрі жиі қолданылды.

Терминология

Макро-ассемблер — макро-нұсқау құралы бар ассемблер, онда (параметрленген) ассемблер тіліндегі мәтінді атаумен белгілеуге болады, ал осы атау басқа кодқа кеңейтілген мәтінді енгізу үшін қолданылады. Ашық код — макро-анықтамадан тыс ассемблерге берілетін кез келген мәлімет. Кросс-ассемблер (сондай-ақ кросс-компилятор) — алынған кодты орындайтын жүйеден (мақсатты жүйе) өзге типтегі компьютерде немесе операциялық жүйеде (хост-жүйе) жұмыс істейтін ассемблер. Кросс-ассемблинг, бағдарламалық қамтамасыз етуді қолдауға қажетті ресурстары жоқ жүйелер үшін, мысалы, кіріктірілген жүйе немесе микробасқарушы үшін бағдарламаларды жасауды жеңілдетеді. Мұндай жағдайда, алынған объектілік код мақсатты жүйеге тек оқуға арналған жад арқылы (ROM, EPROM және т.б.), бағдарламалаушы (егер микробасқарушыда тек оқуға арналған жад құрылғыға енгізілген болса) немесе объектілік кодтың нақты бит-бит көшірмесін немесе осы кодтың мәтіндік өрнегін (мысалы, Intel hex немесе Motorola S жазбасын) пайдаланатын деректер байланысы арқылы жіберілуі керек. Жоғары деңгейлі ассемблер — жоғары деңгейлі тілдермен көбінесе байланысты тілдік абстракцияларды, мысалы, кеңейтілген басқару құрылымдарын (IF/THEN/ELSE, DO CASE және т.б.) және жоғары деңгейлі абстрактілі дерек түрлерін, соның ішінде құрылымдар/жазбаларды, біріктірулерді, сыныптарды және жиынтықтарды қамтамасыз ететін бағдарлама. Микроассемблер — компьютердің төменгі деңгейдегі жұмысын басқаруға арналған микропрограмманы, яғни фирмалық бағдарламаны дайындауға көмектесетін бағдарлама. Мета-ассемблер — «ассемблер тілінің синтаксикалық және семантикалық сипаттамасын қабылдап, сол тіл үшін ассемблер жасайтын бағдарлама». Sperry Univac UNIVAC 1100/2200 сериясы үшін Meta Assembler-ді ұсынды. Inline assembler (немесе кіріктірілген ассемблер) — жоғары деңгейлі тіл бағдарламасының ішінде орналасқан ассемблер коды. Бұл көбінесе аппараттық құралға тікелей қол жеткізуді қажет ететін жүйелік бағдарламаларда қолданылады.

Құрастырушы

Ассемблерлік бағдарлама операциялар мен адрестеу режимдері үшін мнемоника мен синтаксис комбинацияларын олардың сандық эквиваленттеріне аудару арқылы объектілік кодты жасайды. Бұл көрсету әдетте операция кодын ("опкод"), сондай-ақ басқа басқару биттері мен деректерді қамтиды. Ассемблер тұрақты өрнектерді есептейді және жад орындары мен басқа да объектілердің символдық атауларын анықтайды. Ассемблерлер 1950 жылдардан бері қолжетімді, машина тілінен жоғары деңгейдегі бағдарламалау тілдерінен, мысалы Fortran, Algol, COBOL және Lisp-тен бұрын пайда болды. Сондай-ақ, ассемблерге де, жоғары деңгейдегі тілдерге де ұқсас қасиеттері бар бірнеше аудармашылар мен жартылай автоматты код генераторлары болды, Speedcode, бәлкім, ең танымал мысалдардың бірі. Белгілі бір процессор немесе нұсқаулар жиынтығы архитектурасы үшін әртүрлі синтаксисы бар бірнеше ассемблерлер болуы мүмкін. Мысалы, x86 процессорлар отбасындағы регистрге жад деректерін қосу нұсқаулы Intel синтаксисінде add eax, [ebx] түрінде, ал GNU Assembler қолданатын AT&T синтаксисінде addl (%ebx), %eax деп жазылуы мүмкін. Көрнекі айырмашылықтарға қарамастан, әртүрлі синтаксистік формалар көбінесе бірдей сандық машиналық кодты жасайды. Бір ассемблерде синтаксистік формалардың вариацияларын, сондай-ақ олардың нақты семантикалық интерпретацияларын қолдау үшін әртүрлі режимдер болуы мүмкін (мысалы, FASM синтаксисі, TASM синтаксисі, идеалды режим және т.б., x86 ассемблерлік бағдарламалаудың ерекше жағдайында).