Assembler proqramlaşdırma dili

Yazılar ilə işin təşkili

Yazılar ilə işin təşkili

Yuxarda qeyd etdik ki, yazının elementinə bilavasitə müraciət etmək mümkün deyil. Digər tərəfdən adı ünvan-laşdırma mexanizmi yaddaş səviyyəsinə (yəni baytlar səviyyəsinə) əsaslandığına görə burada tətbiq oluna bilməz. Belə olduğu halda yazının ayrı-ayrı elementləri ilə işi necə təşkil etmək olar? Yazının elementləri bitlər yığımından təşkil olunduğunu nəzərə alaraq onlarla işləmək üçün aşağıdakıları bilmək lazımdır:

1) Yazıların hər bir elementinin adına Assebler sağa sürüşmələrin sayına bərabər, ədədi qiymət verir (bu elementin xananın başlanğıcına doğru “sıxışdırılmasını” müəyyən edir). Bu yazını lokallaşdırmağa və onlarla işləmə-yə imkan yaradır. Bunun üçün elementin bitlərlə uzunlu-ğunu bilmək lazımdır.

2) Sağa sürüşdürmə shr əmrinin köməyi ilə aparılır.

3) Assemblerdə width operatoru mövdudur ki, bu da yazıların elementinin bitlərlə ölçüsünü və ya bütövlükdə yazıların tam ölçüsünü müəyyən etməyə imkan verir. width operatorunun tətbiq variantları:

width yazı_erementinin_adı

Operatorun qiyməti, elementin bitlərlə ölçüsü olacaq;

width yazı_nüsğəsinin _adı

və ya

width yazı_tipin_adı

Operatorun qiyməti, bütün yazırarın bitlər ilə ölçüsü olacaq.

Məsələn:
a) MOV AL,WIDTH i2
b) MOV AX,WIDTH iotest

4) Assemblerin mask operatoru mövduddur ki, bunun köməyi ilə yazıların lazımı elementinin bitlərini lokalaşdırmağa imkan verir. Lokalaşdırma, ölçüsü yazıların ölçüsünə uyğun gələn maska yaratmaq yolu ilə yerinə yetirilir. Bu maskada yazıdakı elementin yerləşdəyi mövqedəki bitlərindən başqa qalan bütün bitlər sıfırlaşdırılır.

5) Yazının elementlərinin çevirilməsi əməliyyatları mən-tiq əmrlərinin köməyi ilə aparılır.

Beləliklə, yazılarla işləmək üçün assemblerin vasitələrinin olduğunu müəyyənləşdirdik. Bizi maraqlandıran elementi emal emək üçün əvvəlcə onu seçmək, lazım gəldikdə onu kiçik mərtəbəyə doğru sürüdürərək, lazımi əməlliyatı aparıb və onu əks istiqamətdə yazıda yenidən öz yerində yerləşdirmək lazımdır. Yazıların elementləri ilə bu əməliyyatları aparan tipik alqoritmi yazaq.

Yazının elementini qeyd etmək (seçmək) üçün:

– yazını müvvəqəti registr–yaddaşda (8,16 və ya 32 – bitlik yazının ölçüsündən asılı olaraq) yerləşdirmək;

-mask operatorunun köməyi ilə yazının elementinə uyğun bit maskasını yaratmaq;

– bitləri registdə maskanın və and əmrinin köməyi ilə lokallaşdırmaq;

-elementin bitlərini registrin kiçik mərtəbəsinə doğru shr əmrinin köməyi ilə sürüşdürmək. Yazı elementinin adından istifadə etməklə sürüşdürmə mərtəbələrinin sayını almaq olar.

Bu əməliyyatlar nəticəsində yazı elementi işçi registrin başlağıcında lokallaşacaq və sonra onlarla istənilən əməliy-yatı aparmaq mümkündür.

Yazının elementləri üzərində adı ikilik informasiyada olduğu kimi istənilən əməliyyatı aparmaq olar. Bunun üçün təkcə bit sahəsinin ölçüsünə nəzarət etmək lazımdır. Məsələn, əgər sahəsinin ölçüsü böyüyərsə, onda bu səbəbdən təsadüfi olaraq qonşu bitlər sahəsinin dəyişməsi baş verə bilər. Bunun üçün də sahənin ölçüsünün dəyiş-məsinə imkan verməmək məsləhətdir.

Dəyişmiş elementi yazıda əvvəlki yerinə yazmaq üçün:

–yazının elementinin adından sürüşmələr sayğacı kimi istifadə edərək yazının element bitlərini sola sürüşdürmək;

–əgər çevirmənin nəticənin yerləşdiyi mərtəbələrin sayı ilkin vəziyyətdəkindən böyük olarsa, onda artıq bitləri “kəsmək” üçün AND və maska elementdən istifadə etmək lazımdır;

İndi isə iotest yazısında i2 sahəsini sıfırlaşdıran məsələnin proqramına baxaq:

MASM
MODEL SMALL
.STACK 256
iotest RECORD i1:1,i2:2=11, i3:1,i4:2=11,i5:2=00
; 01101100B  və ya 6Ch
.DATA
flag  iotest <>
.CODE
main:
MOV  AX,@DATA
MOV  DS,AX
MOV  AL,MASK i2    ;Nəticədə AL- də 60h  
                                  ; (0110000b)  yazılacaq
 SHR   AL,i2              ; i2 bitlərini  AL başlanğıcına 
                                  ; sürüşdürmək (03h)
 AND   AL,0FCh        ; i2 sıfırlaşdırıb (AL=0) və
                                  ;i2 əvəlki yerində yerləşdirək 
  SHL   AL,i2
  MOV   BL,[flag]       ; BL registrinə →6Ch
  XOR   BL,MASK i2  ; i2:  BL → 0Ch atır
  OR  BL,AL               ; BL registrində → 00001100b: i2 
                                   ; sahəsi sıfırlaşır
exit:
  MOV  AX,4C00h
  INT 21h
END  main

Əgər elementin ölçüçünü və ya onun başlanğıc qiymətini dəyişdirmək lazım gələrsə, yazının nüsğüsində və ya onun tipinin təsvirində dəyişiklik etmək kifayətdir.

TASM translyator yaradıcıları 3.0 versiyasından başlayaraq, onun əmrlər sisteminə direktiv səviyyəsində iki əmr daxil etmişlər. Bu əmrlər xarici görünüşünə görə adı Assembler əmrləri formatında olsalarda onlar trans-lyasiyadan sonra bir və ya bir neçə maşın əmrinə çevrilirlər. Bu əmrləri Assembler dilinə daxil etməklə TASM yazılarla işin əyaniliyini artırmağa, kodları optimallaşdırmağa və proqramın həcmini azaltmağa imkan yaratdı. Bu əmrlər yazı üçün sahələrin ayırılmasını ayrı-ayrı sahələrin tənzimlənməsini təmin edir.

Hər hansı yazı sahəsinin qiymətini tənzimləmək üçün yazılışı aşağıdakı kimi olan SETFIELD əmrindən istifadə olunur:

SETFIELD yazı_elementi_adı təyinat_registri, mənbə_registr

SETFIELD əmri aşağıdakı kimi işləyir. Yazının yeri registrin adı və ya yaddaş ünvanı kimi götürülə bilən təyinat operandı ilə təyin olunur. Yazı_elementinin_adı operandı, üzərində əməliyyat aparılacaq yazı elementini təyin edir (əslində o yazıda elementin kiçik mərtəbəyə doğru sürüşməsini təyin edir). Mənbə_registr operandında tənzim-lənəcəyi tələb olunan yazı elementinin yeni qiyməti yerləş-məlidir. Bu əmri emal edərək, translyator aşağıdakı əməliy-yatları aparan əmrlər ardıcıllığını hasil edir:

1) Mənbə_reqistr-in məzmununu yazıda elementin yerinə uyğun olan mətrəbərin sayı qədər sola sürüşdürür;

2) Təyinat və mənbə_reqistr üzərində məntiqi or əməliyyatını aparır və əməliyyatın nəticəsi təyinat (qəbuledici) operanda yerləşdirir.

SETFIELD əmri əvəlcədən elementlərin təmizlənməsi əməliyyatənı aparmır. Nəticəsində OR əmri ilə məntiqi toplamadan sonra elementin köhnə qiyməti ilə yeni tənzimlənən qiymətin üst üstə düşməsi ola bilər. Bunu üçün əmrinin icrasından əvvəl yazı sahəsini hazırlamaq məqsədi ilə onu sıfırlaşdırır.

GETFIELD əmri SETFIELD əmrinin əksinə işləyir. GETFIELDəmrində mənbə_ operand kimi ya istənilən registr ya da yaddaş ünvanı götürülə bilər. Təyinat_registr operandı ilə göstərilən registrə əmrin icrasının nəticəsi, yəni yazı_elementinin_qiyməti yerləşir. GETFIELD əmrində 8-bitlik registr göstərilsə, belə, o həmişə 16 –bitlik registrlə işləyir.

SETFIELD və GETFIELD əmrlərinin tətbiqini göstərən aşağıdakı proqrama baxaq:

MASM
MODEL  SMALL
.STACK  256
iotest  RECORD i1:1,i2:2=11, i3:1,i4:2=11,i5:2=00
; 01101100B və ya 6Ch
.DATA
flag  iotest <>
.CODE
main:
	MOV AX,@DATA
	MOV DS,AX
	MOV AL,flag
	MOV BL,3
	SETFIELD  i5  AL,BL
	XOR BL,BL
	GETFIELD i5  BL,AL
	MOV  BL,1
	SETFIELD  i4  AL,BL
	SETFIELD  i5  AL,BL
exit:
	MOV  AX,4C00h
	INT  21h
END main

Yazılardan istifadəyə aid daha bir misala baxaq. Bu eflags registrinin təsviridir. Sadəlik üçün bu təsviri üç hissəyə ayıraq:

1) ef1ags_1_7 – eflags/flags- registrinin kiçik baytı;

2) ef1ags_8_15 – eflags/flags- registrinin ikinci baytı;

3) eflags_h – eflags registrinin böyük yarısı.

eflags_1_7 RECORD sf7:l=0, zf6:1=0, c5:1=0, af4:1=0, c3:1=0, pf2:1=0, c1:1=1, cf0:1=0

eflags_8_15 RECORD c15:1=0, nt14:1=0, iop1:2=0, of11:1=0, df11:1=0, df10:1=0, if9:1=1, tf8:1=0

ef1ags_h RECORD c:13=0, ac18:1=0, vm17:1=0, rf16:1=0