Assembler proqramlaşdırma dili

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

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 translya­torunun 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 ya­zı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 para­metrdir. 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 para­metrdir. 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 is­tifadə 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 proqramm­xana_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