Assembler dilində yazılmış proqramların translyasiyası və yükləyici modula çevrilməsi
Assembler dilində yazılmış proqramların translyasiyası və yükləyici modula çevrilməsi üçün MS DOS əməliyyat sistemi mühitində bir neçə proqram paketlərindən istifadə edə bilərik. Bunlardan daha çox yayılmışları Microsof firmasının MASM paketi və Borland İnternational firmasının TASM paketləridir.
Hər iki paket kompillyator olub nəticədə *.asm genişlənməsi olan istifadəçinin assembler proqramını (ilkin modulu) maşın kodlarında olan və icra oluna bilən *.com və ya *.exe genişlənməli yükləyici modula çevriir.
TASM paketinin işini nəzərdən keçirək. Bu paketin assembler proqramının mətnin yazılması üçün özünün redaktoru yoxdur. Ona görə də proqramın mətnini ixtiyari mətn redaktorunda yığmaq olar.
*.asm genişlənməsi olan istifadəçinin ilkin modulunun hazır yükləmə moduluna çevirilməsi iki mərhələdə aparılır:
1) TASM.EXE proqramının köməyi ilə ilkin moduldan OBJ genişlənməsi olan obyekt modulunun yaradılması;
2) TLINK.EXE proqramının köməyi ilə obyekt modulundan yükləmə modulun yaradılması.
Bir daha qeyd edək ki, TASM.EXE proqramı üçün ilkin modul asm genişlənməsi olan Assembler dilində yazılmış mətn faylı (DOS mətn faylı) olmalıdır. O istənilən mətn redaktorunda (əsasən EDİT mətn redaktorunda) yığıla bilər.
TASM.EXE proqramını işə salmaq üçün əmrlər sətrində onun ümumi yazılışı aşağıdakı kimidir:
TASM [opsiya] ilkin_faylın_adı [, obyekt_faylın_adı]
[, listing_faylın_adı] [,kəsişən_istinadlar_faylının_adı]
Göründüyü kimi yazılışda məcburi parametr ancaq ilkin_faylın_adı – dır. Yuxarıda dediyimiz kimi bu faylın genişlənməsi *.asm olmalıdır. İlkin modulun adının ardınca məcburi olmayan parametrlər obyekt faylın (*.obj genişlənməsi ilə) və kəsişən istinadlar faylının (*.crf genişlənməsi ilə) adları gələ bilər. Əgər listing və kəsişən istinadlar fayllarının adlarını verməsək sadəcə olaraq onlar yaradılmırlar. Əgər onları yaratmaq lazımdırsa, onda aşağıdakı qaydalardan istifadə edə bilərik:
1) obyekt, listing və kəsişən istinad fayllarının adlarını ilkin modulun adına uyğun vermək olar. Əgər belə tələb yaranarsa istəyiriksə, onda uyğun parametrlərin yerinə vergül simvolu yazmaqla ilkin modulun adı ilə eyni adlı obyekt, listing və kəsişən istinad faylları yaradılır. Məsələn:
TASM TEST1 , , ,
Nəticədə obj, lst və crf genişlənməli Test1 adlı fayllar yaradılacaq.
2) Əgər hər hansı faylın adını ilkin modulun adından fərqləndirmək istəyiriksə, onda uyğun mövqeyətələb olunan yeni adı yazmalıdır. Məsələn:
TASM TEST1 , , LİST1 ,
Nəticədə TEST1.obj, LİST1.lst və TEST1.crf faylları yaradılacaqdır.
3) Əgər hər hansı faylları yaratmaq istəmiriksə, onda uyğun mövqelərə NUL parametrini yazmalıyıq. Məsələn:
TASM TEST1 , , NUL ,
Nəticədə TEST1.obj və TEST1.crf faylları yaradılacaq. NUL parametri yazılmış mövqeyə uyğun TEST1.lst faylı yaradılmayacaq.
Məcburi olmayan opsiya parametri TASM translyatorunun iş rejimlərini təyin edir. TASM- ın opsiyaları çoxdur. Manitorun ekranında TASM.EXE proqramı haqqında tam məlumatı almaq üçün onu arqumenlərsiz icra etmək lazımdır. Hər bir opsiyadan əvvəl “/” simvolu yazılmalıdır. Bu opsiyalardan ən lazımlı olanı /zi opsiyasıdır. Bu opsiya translyatora proqramdakı simvolik ad ilə onun kod seqmentindəki sürüşməsi arasındakı əlaqəni saxlamağa imkan verir. Bu da istifadəçiyə proqramın sazlanması zamanı orqinal adlardan istifadə etməyə imkan verir.
CRF genişlənməli fayllarda təyinatların və ilkin proqramdakı dəyişənlərə müraciətlərin kompakt təsvirləri olur. MASM paketinə daxil olan CREF.EXE bu faylı emal edərək simvolik adların əlifba siyahısını yaradır.
İlkin faylın translasiyasına və komponovka edilməsinə başlamamışdan əvvəl hər hansı bir kataloq yaradıb, TASM.EXE, TLINK.EXE,RTM.EXE və həmçinin ilkin faylın özünü orada yerləşdirmək məqsədə uyğundur. Bundan sonra bu kataloqu cari kataloq qəbul edib ilkin faylı oradan translyasiya etmək lazımdır.
Məsələn, TEST1.asm ilkin modulunu translyasıya etmək üçün əmr sətrini
TASM /zi TEST1 , , , ↵ kimi yazmaq olar.
Nəticədə ekranda müəyyən sətrlər ardıcıllığı əks olunacaq. Birinci sətrdə istifadə edilən TASM paketinin versiyaının nömrəsi haqqında informasiy əks olunacaq. Sonrakı sətrdə translyasiya olunan faylın adı göstərilir. Əgər Sizin proqramın yazılışı zamanı səhvlərə yol verilibsə, onda ekranda “Error” və ya “warning” sözləri ilə başlayan xəbərlər əks olunur. Burada mötərizə içərisində səhv buraxılan sətrlərin nömrəsi göstərilir. Xəbərdə səhvin tipi də verilir. Səhv sətrlərin nömrələrini yadda saxlyaraq ilkin proqramda həmin səhvlərə düzəlişlər verə bilərik.
Səhvlər haqqında daha dolğun məlumatı translyator vasitəsilə yaradılan *.lst genişlənməli listing fayldan ala bilərik. Ona görə də onu yaratmaq məsləhətdir. Çünki listinq modulunda ilkin proqram mətini ünvanlar və əmrlərin kodları, yaddaş dəyişənin ünvanı, nişan və prosedurlar göstərilməklə əks olunur.
Aydındır ki, səhvlər aradan qaldırıldıqdan sonra TEST1.obj obyekt faylı yaradılır.
Bu mərhələdən sonra icra (yükləyici və ya bəzən bu proses proqramın kompanovkası adlandırılır) modulun yaradılması mərhələsinə keçə bilərik. İcra modulun yaradılması translyasiya və komponovka kimi iki mərhələdən ibarətdir. Bu isə bir və bir neçə proqramlaşdırma dilində yazılmış bir neçə modulu birləşdirməyə imkan yaradır. Obyekt modulunun formatı müəyyən şərt daxilində ayrı-ayrılıqda translyasiya olunmuş ilkin modulları birləşdirməyə imkan verir. Kompone edici isə bu modulda xarici (prosedur və ya dəyişənlərə müraciətləri) müraciətləri təşkil edir. Kompone edici işinin nəticəsi EXE genişlənməli icra modulunu yaratmaqdır. Bundan sonra əməliyyat sistemi bu faylı yaddaşa yükləyib və onu icra edə bilər. Yükləyici modulun alınması üçün TLİNK.EXE proqramından istifadə edilir. Onun ümumi formatı aşağıdakı kimidir:
TLİNK [opsiya] obyekt_fayllar_siyahısı
[, yükləyici_modulun_adı]
[,kartlar_faylının_adı]
[, proqramxana_faylının_adı]
[, təyinatlar_faylının_adı]
[, ehtiyat_faylının_adı]
Burada opsiya – məcburi olmayan parametr olub, əlaqələr Kompone edicinin işini idarə edir. Hər bir opsiya “_” və ya “/” simvolları ilə başlaya bilər. TLİNK.EXE proqramını da parametrsiz buraxmaqla onun haqqında tam məlumatı (eyni zamanda opsiyaları haqqında) ala bilərik.
Bu opsiyalardan ən lazım olanı /v opsiyasıdır. O, sazlama informasiyasının saxlamasının vacibliyi haqqında göstəriş verir. Obyekt_fayllar_siyahısı – məcburi parametrdir. O, bir-birindən boşluq və ya “+” simvolları ilə ayrılan bir yerə yığılacaq *.obj genişlənməli obyekt fayllar siyahısıdır. Məsələn:
TLİNK /v TEST1 + TEST2 + TEST3 ↵
Lazım gəldikdə faylları tam marşurutları (yolları) ilə göstərə bilərsiniz.
Yükləyici_modulun_adı – məcburi olmayan parametr olub, formalaşdırılan yükləyici modulun adının olmasını bildirir. Əgər o verilməzsə, onda yükləyici modulun adı obyekt modullar siyahısındakı birinci ada uyğun verilir.
Kart _faylının_adı –məcburi olmayan parametrdir. O, verilərsə əlaqələr redaktoru yükləmənin xüsusi xəritə faylını yaradır. Burada proqrama daxil olan yükləmə ünvanlarının adları və seqmentlərin ölçüləri sadalanır.
Proqraamxana_faylının_adı – məcburi olmayan parametrdir. O, əvvəlcədən yaradılan *.lib genişlənməli faylın yolunu göstərir. Bu fayl TASM paketinin TLİB.EXE xüsusi utiliti ilə yaradılır və xidmət edilir. Bu utilit tez-tez istifadə edilən obyekt modullarını bir fayl şəkilində birləşdirməyə imkan verir. Belə əməliyyatdan sonra TLİNK.EXE–in əmr sətrində verilən obyekt faylları bu proqramxanalarda axtarılacaq. Əgər Windows–əlavələri ilə əlaqəli kompone edici iş aparılarsa, onda proqrammxana_faylı_adı–nın yerində import olunan proqramxananın adı yazılır.
Təyinatlar_faylının_adı –məcburi olmayan parametrdir. O, *.def genişlənməli təyinatlar faylının yolununu göstərir. Bu fayldan Windows –əlavələrin yığılması zamanı istifadə edilir.
Ehtiyatlar_faylının_adı –məcburi olmayan parametrdir. O, *.res genişlənməli Windows – ehtiyatlarının yolunu təyin edir. Bu fayldan da Windows –əlavələrin yığılması zamanı istifadə edilir.
Yuxarıda verdiyimiz misalın yığılması üçün TLİNK.EXE əmr sətri aşağıdakı kimi olar.
TLİNK.EXE /v TEST1.OBJ ↵ olar.
Nəticədə TEST1.EXE icra modulu alınacaq.
Əgər
TASM /Zİ %1.ASM
TLİNK /V %1.OBJ
sətrlərindən ibarət, məsələn, TRAN.BAT adlı*.BAT genişlənməli əmrlər faylı yaratmaq lazımdırsa bu faylı TASM.EXE, TLİNK.EXE və RTM.EXE faylları yerləşən kataloqa yazmaqla assembler dilindəki ilkin modulun translyasiya və kompone edici işi kifayət qədər asanlaşdırmaq olar. Çünki bu faylı
TRAN TEST1 ↵
göstərişi ilə icra etmək olar.
İndi isə MASM.EXE və LINK.EXE paket proqramlarının köməyi ilə konkret ilkin modulun *.EXE genişlənməli icra moduluna çevirilməsi prosesini izah edək.
İlkin modul MASM.EXE translyatoru (kompilyatoru) vasitəsilə obyekt moduluna çevirilir. Əgər translyasiyanın nəticəsi müsbət isə alınan obyekt modul LINK.EXE vasitəsilə mütləq modula (yükləyici modula) çevirilir. Əgər bu mərhələ müsbət nəticələnibsə, alınmış EXE genişlənməli faylı icrə etmək olar.
Əgər biz NC örtük proqramı ilə işləyiriksə, SHIFT+F4 düymələrini birgə basmaqla quraşdırılmış redaktor rejiminə keçə bilərik. Bu zaman yaradılacaq faylın adı tələb olunur. Proqramın adını CALLER.ASM verək. Alınan pəncərədə proqramın mətnini daxil edə bilərik. Daxil etmə zamanı hər 5 əmrdən sonra F2 düyməsini basmaqla proqramın mətnini yaddaşa yazmaq məsləhətdir. Daxil edilmə qurtardıqda redaktordan çıxmaq üçün ESC və ya F10 düymələri basılmalıdır.
Proqramın translyasiyası üçün MASM.EXE –dən aşağıdakı kimi istifadə edək.
MASM.EXE CALLER.ASM daxil edərək ENTER düyməsini basmaq lazımdır. MASM icra olunarkən ekranda aşağıdakı sorğu əks olunur:
Object file [caller.obj]:
Bu obyekt faylın adını caller.obj kimi götürmək və ya yeni ad daxil etmək təklifidir. Əgər istifadəçi adı olduğu kimi saxlamaq istəyirsə, ENTER ilə təsdiq etməlidir. Əks halda yeni adı daxil edib ENTER düyməsini basmalıdır. Sonra MASM digər sorğu ilə müraciət edir.
SOURCE Listing [NUL.LST]:
Bu translyasiyanın nəticələrinin (listing) fayl kimi saxlanmayacağı təklifidir. Əgər istifadəçi listinqi fayl kimi saxlamırsa, enter ilə təsdiqləməlidir. Ümumiyyətlə, listinq Assembler proqram mətni ilə uyğun maşın əmrləri proqramının birgə mətnidir. Əgər istifadəçi belə listinqi saxlamaq istəyirsə (ilkin sazlama zamanı saxlamaq məsləhətdir), adı daxil edib ENTER ilə təsdiq etməlidir. Bu zaman MASM.EXE digər sorğu göndərəcək.
Cross –reference [NUL.CRF]:
Bu çarpaz kəsişmələr faylının yaradılmayacağına göstərişdir. Əgər istəmiriksə, ENTER –i basmaqla təsdiq etməliyik. Əks halda isə fayla ad verib ENTER ilə təsdiq etməliyik. Bu sorğuya cavabdan sonra əgər translyasiya zamanı səhvlər yoxdursa,
WARNINGS EROR =0 və ERROR –0 xəbərdarlığı alınır. Bu da obyekt modulun yarandığını göstərir. Əks halda səhvlər siyahısı və sayı istifadəçiyə çatdırılır. Səhvləri listinqə görə tapıb aradan qaldırmaq və bu mərhələni təkrar etmək lazımdır.
Alınmış obyekt modulu LİNK.EXE ilə mütləq modula çevirmək üçün aşağıdakı əmrdən istifadə edilir.
LİNK.EXE CALLER.OBJ daxil edərək ENTER düyməsi basılır. Bu zaman aşağıdakı sorğu ekranda əks olunur:
RUN file [caller.exe]:
Bu mütləq modulun adını caller.exe kimi saxlanacağı xəbərdarlığıdır. Əgər istəyiriksə, ENTER ilə təsdiq etməliyik, əks halda yeni ad daxil edib ENTER ilə təsdiqləməliyik. Bu zaman aşağıdakı sorğu ekranda əks olunur:
List file [NUL.MAP]:
Bu xəbərdarlıq yükləyici modulun listinqinin fayl şəklində yaradılmayacağını bildirir. Əgər istəyiriksə, ENTER ilə təsdiqləyirik. Əks halda faylın adını daxil etmək ENTER ilə təsdiqləmək lazımdır. Ekranda əks olunan
Libraries [.LIB]:
sorğusuna proqram üçün istifadə ediləcək proqramxanaların adların daxil etmək lazımdır. Əgər ENTER ilə təsdiq etsək onda proqramxana translyator tərəfindən təyin edilən standart proqramxana götürülür. İstifadəçi bu sorğuya 8 –ə qədər proqramxana adı daxil edə bilər (“+” simvolu ilə birləşdirərək). Bu mərhələ müvəffəqiyyətlə qurtarıbsa, yükləyici modul caller.exe adı altında yaradılacaq. Əks halda səhvin kodu veriləcək. Yükləyici modulu caller.exe daxil edərək ENTER düyməsini basmaqla icrə etmək olar.
Bu əməliyyatları aşağıdakı proqramlar üzərində aparaq.
steck segment stack top db 256 dup(?) steck ends data segment public timer db 2 dup(?),':',2 dup(?),':' db 2 dup(?),'$' data ends code segment public extrn proc_calle:near;,bin_asc:near assume cs:code,ds:data,ss:steck start proc far push ds push ax mov ax,data mov ds,ax mov ax,steck mov ss,ax call proc_timer ret start endp proc_timer proc near call proc_calle mov ah,2ch int 21h ;read timer mov ax,0 mov al,ch ;put hour lea bx,timer call bin_ascii mov ah,2ch int 21h mov ax,0 mov al,cl ;put minute lea bx,timer+3 call bin_ascii mov ah,2ch int 21h mov ax,0 mov al,dh lea bx,timer+6 call bin_ascii lea dx,timer mov ah,9 int 21h mov ah,4ch int 21h ret proc_timer endp bin_ascii proc push dx push si push ax mov cx,2 full_buff: mov byte ptr[bx],' ' inc bx loop full_buff mov si,10 clr_dvd: sub dx,dx div si add dl,'0' dec bx mov [bx],dl or ax,ax jnz clr_dvd pop ax pop si pop dx ret bin_ascii endp code ends end start 2-ci proqramın mətni aşağıdakı kimidir. code segment public public proc_calle assume cs:code proc_calle proc near mov dh,10 ;10-st string mov dl,60 ;60-st colom mov ah,2 int 10h ;cursor position ret proc_calle endp code ends end proc_calle