Mühazirə 15.
Maşınyönümlü dillər. Assembler dilində proqramlaşdırma.
Hesablama texnikasının inkişafı müxtəlif proqramlaşdırma dillərinin meydana gəlməsinə səbəb oldu. Proqramlaşdırma dili dedikdə, EHM-də hər hansı bir məsələnin həlli zamanı proqram və başlangıc şərtlərini təsvir etmək üçün nəzərdə tutulmuş, insanla maşın arasında əlaqə yaradan formal dil başa düşülür. Proqramlaşdırma dilləri öz xüsusiyyətlərinə görə aşağıdakı qruplara bölünürlər:
1) maşınyönümlü, yəni maşın tiplərindən asılı olan dillər;
2) üsulyönümlü, yəni həll üsullarından asılı olan dillər və ya alqoritmik dillər;
3) problemyönümlü, yəni məsələlərin həlli üçün deyil təsviri üçün nəzərdə tutulmuş dillər;
4) universal dillər.
Birinci nəsil EHM-də proqramlaşdırma tamamilə maşın dilində aparılırdı. Maşın dili müəyyən əməllərin, əsasən hesab əməllərinin ədədi işarələrlə kodlaşdırılmış əmrlər sistemidir. Deməli, maşın dilində yazılmış bir əmr hansı əməlin yerinə yetiriləcəyini bildirən kodun, üzərində aparılacaq ədədlərin və nəticənin əməli yaddaşda yerləri hökmən göstərilməlidir. Proqramçı hər sonrakı əmri əməli yaddaşda boş olan yerə yazmalıdır. Sonrakı əmrlərdə proqramçıya aralıq nəticələrindən bir ədəd lazım olarsa, əmrdə həmin ədədin yerləşdiyi oyuğun nömrəsi göstərilməlidir. Əməllərin maşın dilində belə yazılması çətin, qarışıq və ona görə də çox zəhmət tələb edən bir prosesdir. Onu hökmən təkmilləşdirmək tələb olunurdu. Belə təkmilləşdirmənin zərurliyi tezliklə simvolik və ya Avtokod proqramlaşdırma dillərinin yaranmasına səbəb oldu. Simvolik proqramlaşdırma dilləri maşın dilindən onunla fərqlənir ki, burada əməliyyat kodları, yəni rəqəmlər ilə təsvir olunan əmrlər hərfi işarələrlə təsvir olunan kodlarla əvəz olunur. Həm də ilk avtokodlardakı maşın dilinin əmrləri arasında qarşılıqlı birqiymətli uyğunluq var idi ki, onu da 1:1 kimi göstərdilər. Bu nisbət proqramlaşdırma dilindən sonra yazılırdı, məsələn, Avtokod 1:1. Avtokod sözü Avtomatik kodlaşdırma sözlərinin qısa yazılışı nəticəsində əmələ gəlmişdir. EHM-in hər tipinin öz proqramlaşdırma dili vardır. Bu proqramlaşdırma (maşın) dillərini, bəzi, məsələn, “Minsk” tipli maşınlarda Avtokod, bəzilərində, məsələn ASVT tipli maşınlarda Mnemokod, bəzi məsələn ES və SM tipli maşınlarda isə Assembler adlandırırlar. Bütün bu dillər maşınyönümlü dillər adlanır. Beləliklə, maşınyönümlü dil dedikdə, proqramlaşdırma dilinin hər hansı konkret maşın üçün nəzərdə tutulduğu üç dil başa düşülür.
Hesablama texnikasının sonrakı inkişafı nəticəsində maşın yönümlü dillər də təkmilləşdi və maşınların imkanları çoxaldıqca onun əmrlərinin sayı da artmağa başladı. Bununla da maşınlarda olan bir çox altproqramları işlətmək üçün makroəmrlər yarandı. Makroassembler və Almo belə genişləndirilmiş maşınyönümlü dillərdir. Belə proqramlaşdırma dillərində proqram yazarkən, o proqramların istifadə olunacağı maşının xüsusiyyətləri nəzərə alınmalıdır.
Maşınyönümlü dillərin çatışmayan cəhətlərindən biri ondan ibarətdir ki, onların bəzilərində hesablama ardıcıllığının təsviri əsl yəni adi yazılış formasından uzaqlaşır, bəziləri isə yalnız məhdud dairədə olan məsələləri təsvir edə bilir. Bu dillərin çatışmayan cəhətlərindən biri də onlardan müxtəlif tipli maşınlarda istifadə etməyin mümkün olmamasıdır.
Maşınyönümlü dillərdə kompüterin strukturu, onun ayrı-ayrı qurğularının, bəzən hətta elementlərinin imkanları nəzərə alındığından bu dillər məsələnin yüksək sürətlə həllini təmin edir. Həmin dillərin əsas çatışmazlığı isə proqramın əyani olmamasından, proqramın yazılması zamanı səhvlərin labüdlüyündən, kompüterin strukturunu bilmək zərurətindən ibarətdir.
Maşınyönümlü dillərdə proqramlaşdırma ilə bir qayda olaraq peşəkar proqramçılar məşğul olur. Burada təkcə proqramlı mikrokalkulyator dili istisna olunur.
Bu dil simvolik kodlaşdırma dilləri qrupuna aid edilsədə çox sadələşdirilmişdir və asanöyrənilir.Maşın dillərinə yaxın olan dilləri iki qrupa bölünür: aşağı səviyyəli və yuxarı səviyyəli. Aşağı səviyyəli dillərə mnemokodlar (yunanca "mnemonikon" "yaddasaxlama bacarığı"deməkdir) və makrodillər aid edilir.
Mnemokodda rəqəm kodları mnemik işarələrlə əvəz olunub. Makrodillərə bunula yanaşı bir qrup maşın əmrlərə uyğun makroəmrlər daxildir.
Maşınyönümlü dillər real vaxt rejimində və dialoq rejimində işləyən sistemlər üçün nəzərdə tutulub. Sadə maşınyönümlü dil Assemblerdir. Assembler maşın proqramının strukturunu tamamilə saxlayır, əmrlər və yaddaş ünvanı üçün simvolik işarələrdən istifadəsinə imkan verir və proqramın ayrı-ayrı hissələrini bir yerə toplayır.
Hər hansı bir proqramlaşdırma dilində tərtib edilmiş maşin koduna çevrilməsi tələb olunan proqram nəticə moduludur. Bu proses translyasiya adlanır, proqram isə translyator. Assembler translyatordur və maşınyönümlü dildir, yəni əgər müxtəlif MP müxtəlif arxitekturaya malikdirsə, onda proqram cəhətdən uyğunsuzdur.
Assembler dilində tərtib edilmiş proqramlar assembler adlanan proqram vasitəsilə bilavasitə maşın koduna çevrilir. Assemblerə makrovasitələr daxilidir, əməliyyat əmrləri mnemonik və ünvanlar simvolik yazılır. 1952-ci ildə Qreys Hopper [Grace Murray Hopper] (ABŞ) dünyada ilk mnemonik proq ramlaşdırma dili olan assembler dilini [assembly language] yaratdı. Assemblerə mnemonik komandalar sistemi, prosedurlar kitabxanası və proqramın mətnini maşın koduna çevirən xüsusi proqram daxil idi. Proqramın maşın dilinə çevrilməsi proseduruna kompilyasiya, onu gerçəkləşdirən proqrama isə kompilyator deyilir (bu termin də Qreys M.Hopperindir).
Assembler dilinin əlifbası
İstənilən proqramlaşdırma dilində olduğu kimi Assembler dilinin əlifbasına, translyator tərəfindən qəbul oluna bilən, xüsusi simvollar yığımı daxildir. Bu simvollar yığımı aşağıdakılardır:
1. Latın əlifbasının böyük ( A- Z) və kiçik (a-z) hərfləri.
2. 0-dan 9 –a qədər ərəb rəqəmləri.
3. Xüsusi işarələr ? @ $ &
4. Boşluq işarəsi və alt xətt ( _ ).
5. Ayırıcı işarələr ; : , . [ ] ( ) < > { } + – / * % ! ” ' \ = # ^
Bunlardan başqa Assembler dilinə müəyyən açar sözləri daxildir ki, onlar da proqramda olduğu kimi işlədilirlər.
Assembler dilinin konstantları
Assembler dilində müxtəlif tip konstantalardan (sabitlərdən) istifadə olunur:
1. Üç say sistemindən birində verilmiş tam ədədlər:
- İkilik konstantalar- bunlar B və b hərfləri ilə qurtaran 0 və ya 1 ikilik ədədlər ardıcıllığıdır. Məsələn, 11000111b və ya 0001000B (ikilik sabitin təsviri).
- Onluq konstantalar-bunlar D və ya d hərfləri ilə qurtaran 0- dan 9–a qədər onluq rəqəmlər ardıcıllığıdır. Məsələn: 234, 234D, 546d. Sadəlik üçün D və ya d simvollarından istifadə etməmək də olar.
- Onaltılıq konstantalar-bunlar H və ya h hərfləri ilə qurtaran 0-dan F–ə qədər onaltılıq rəqəmlər ardıcıllığıdır (0123456789ABCDEF). Məsələn: 0BAH, 06AEh. Birinci simvol mütləq 0-dan 9–a qədər olan rəqəmlərdən birisi olmalıdır ki, o identifikatordan fərqlənsin. Məsələn: 0BAH, 0A6AEh yazılışındakı birinci 0 simvolu verilənlərin identifikotor deyil, onaltılıq ədəd olduğunu göstərir.
Qeyd edək ki, mənfi onluq ədədlər proqramda adi qaydada (məsələn –56), mənfi ikilik və onaltılıq ədədlər isə tamamlayıcı kodda göstərilir. Məsələn: - 89 ədədi tamalayıcı kodda 10100111b və 0A7h kimi yazılır.
2. Simvol və ya sətr (literal və ya sətr) konstantları - apostrof və ya dırnaq işarələri arasında yazılan istənilən simvollar ardıcıllığıdır.
3. Sürüşən nöqtəli ədədlər. Intel prosessorlarında Sürüşən nöqtəli bütün əməliyyatlar, özünün məxsusi registrləri və əmrləri olan xüsusi FPU (Floating Point Unit) qurğusunun köməyi ilə aparılır. Bu qurğu əsas prosessor ilə aftonom işləyə bilir və sistemə (8087,80287,80387,80487) əlavə prosessor kimi qoşulur. 80486DX – dən başlayaraq bütün modellərdə əlavə prosessorlar əsas prosessorla birlikdə bir kristalda yerləşdirilir.
İdentifikatorlar – proqramın müəyyən obyektlərini, məsələn, əmrin kodunu, dəyişənin və nişanın adını işarə etmək üçün istifadə olunan simvollar ardıcıllığıdır. İdentifikatorlar bir və ya bir neçə simvoldan ibarət ola bilər. İdentifikatorlarda latın əlifbasının hərflərindən, rəqəmlərdən və _, ?, $, @ xüsusi işarələrindən istifadə oluna bilər. İdentifikatorlar rəqəmlə başlaya bilməz. İdentifikatorun maksimal uzunluğu 255 simvoldan çox ola bilməz, ancaq, translyator onların yalnız birinci 32 simvolunu qəbul edir və qalanları inkar olunur. İdentifikatorun uzunluğunu əmrlər sətrində /mv parametrindən istifadə etməklə tənzimləmək olar. Bundan başqa translyatora böyük və kiçik hərflərlə yazılmış identifikatorları fərqləndirmək və ya onu inkar etməyə imkan verən vasitələr də mövcuddur (susmaya görə onlar arasında fərq yoxdur). Bunun üçün əmrlər sətrində /mu, /ml, /mx parametrərindən istifadə etmək olar. Assembler cümləsi. Assembler dilində yazılmış proqram mikroprosessorun bütün arxitektur xüsusiyyətlərini (məsələn, yaddaşın təşkili, operandların ünvanlaşdırılması üsullarını, regstrlərdən düzgün istifadə olunması və s.) özündə əks etdirməlidir. Mikroprosessorların hər bir tipi üçün bu xüsusiyyətlər unikaldır.
Assembler proqramına yaddaş seqmentləri toplusu kimi baxmaq olar. Proqram bir və ya bir neçə belə seqmentlərdən ibarət ola bilər. Hər bir seqment dilin cümlələr yığımından ibarət olur və hər bir cümlə proqram kodunun sətri kimi yerləşdirilir.
Dörd tip Assembler cümləsi olur:
1. Əmrlər və ya təlimatlar–maşın əmrlərinin simvolik analoqudur. Translyasiya prosesində assemblerintəlimatları mikroprosessorun əmrlər sisteminin uyğun əmrinə çevrilir;
2. Makroəmrlər – müəyyən qaydalar əsasında proqram mətni kimi tərtib olunaraq translyasiya zamanı Asseblerin başqa cümləsi ilə əvəz olunur;
3. Direktivlər (psevdooperatorlar və ya bildiricilər) - hər hansı əməliyyatı aparmaq üçün assembler translyatoruna yalnız göstəriş verir. Heç bir əməliyyat aparmadığından ona psevdooperator deyilir. Translyasiyadan sonra direktivlər maşın əmrləri kimi saxlanılmır. Direktivlər Assebler dilində proqramın tərkib hissəsidir;
4. Şərhlər sətri– proqramın əmrləri haqqında izahat verən istənilən simvollar ardıcıllığından (azərbaycan və rus əlifbasının simvollarından da təşkil oluna bilər) ibarət olan cümlədir. Şərhlər translyator tərəfindən nəzərə alınmır. Şərhlər nöqtəli vergüllə (;) başlayır. Şərhləri əmrlərin, makroəmrlərin, təlimatların sonunda və ya ayrıca cümlə kimi yazmaq olar.
Assembler dilinin əmrləri ümumi şəkildə aşağıdakı kimi yazılır:
[nişan:] mnemokod [operand_1] [,operand_2] [,operand_3] [;şərh].
Kvadrat mötərizə içrisində göstərilən paramettlər məcburi parametrlər deyil. Onlar göstərilməyə də bilər. Parametrlər ən azı, bir boşluq işarəsi ilə ayrılmalıdırlar.
Nişan – identifikator olub, cümlənin birinci baytından yazılmalıdır. Nişan iki nöqtə (:) ilə qurtarmalıdır. Əmrin və regstrlərin adından nişan kimi istifadə etmək olmaz. Əgər əmrə proqramın digər hissəsindən müraciət varsa o, nişan ilə təmin olunmalıdır.
Misal:
AV: MOV CX, 5 ; yazılış döğrudur.
ADC: ADC AX, BX ; yazılış döğru deyil (nişan kimi əmrin adından istifadə olunub). Çünki açar sözlərdən nişan kimi istifadə etmək olmaz.
Mnemokod (maşınyönlü dillərdə maşın əmrinin simvollarla yazılışı. Assembler dilində sadələşmiş forma)- məcburi parametr olub, maşın əmrinə uygun mnemokodun işarəsidir. Başqa sözlə , mikroprosessor əmrinin adıdır.
Operandlar – əmrin, makroəmrin və ya Assemblerin direktivlərinin hissəsi olub, üzərində əməliyyatlar aparılacaq obyektlərlərdir. Əmrlər operandsız (susmaya görə), bir operandlı, iki və üç operandlı ola bilər və operandlar bir-birindən vergüllə ayrılır. İki operandlı əmrdə birinci operand qəbuledici, ikinci isə mənbə adlanır və əməliyyatın icrasının nəticəsi birinci operandda yerləşdirilir, ikinci operandın məzmunu isə dəyişməz qalır.
Direktivlər
Direktivlər Assembler translyatorunun işini idarə edən vasitələrdən biridir. Onların köməyi ilə seqmentlər və prosedurlar təyin olunur, əmr və verilənlərə ad verilir, ehtiyyat yaddaş sahəsi ayrılır və s.
Direktivin yazılışı assembler əmrinin yazılışına uyğundur:
[ad] direktiv [operand] [,operand] ... [;şərh]
Ad–identifikator olub, bu direktivi başqa eyni adlı direktivdən fərqləndirir. Nöqtələr göstərilən elementlərin bir neçə dəfə təkrarlana bilməsini göstərir.
İdentifikatorları, verilənlərı, seqmentləri təyin edən və translyasiyanı idarə edən direktivlər əsas direktivlər sayılır.
Dostları ilə paylaş: |