Assembler proqramlaşdırma dili

Sətrlərin müqayisəsi əmrləri

Sətrlərin müqayisəsi əmrləri

Sətrlərin müqayisəsi əmrləri, sətr_mənbə elementləri ilə sətr_qəbuledici elementlərini müqayisə edir. Burada əmrlər yığımı və onlarla işləmə metodları əvvəldəki mövzudakı sətr elementlərin göndərilməsi əmrlərində olduğu kimidir. Sətrlərin elemetlərini müqayisə etmək üçün dörd CMPS (CoMPare String) müqayisə əmrindən istifadə olunur və onlar aşağıdakı kimi yazılır:

CMPS sətr_qəbuledici , sətr_mənbə ;

CMPSB (CoMPare Strig Byte) - bitlər sətrlərinin müqayisəsi;

CMPSW (CoMPare String Word) - sözlər sətrlərinin müqayisəsi;

CMPSD (CoMPare String Double Word) - ikiqat söz sətrlərinin müqayisəsi.

Burada

-sətr_qəbuledici, əlavə seqmentdə və onun ünvanı isə ES:EDI/DI registrlər cütlüyündə;

-sətr_mənbə, verilənlər seqmentində və onun ünvanı isə əvəlcədən DS:ESI/SI registrlər cütlüyündə yerləşdirilir.

Əmrin işləmə alqoritmi hər iki sətrin elementlərinin ardıcıl çıxılması əməliyyatına əsaslanır. CMPS əmri prinsipcə CMP əmri kimi işləyir. Yəni, hər iki əmirdə operandların (sətr elementlərinin) çıxılmasının nəticəsi heç bir yerdə qeyd olunmur. Ancaq, bu nəticə əsasında ZF, SF və OF bayraqlarının qiyməti tənzimlənir.

CMPS əmri sətrlərin növbəti elementlərini çıxdıqdan sonra DF bayrağının qiymətinə uyğun olaraq ESI/SI və EDI/DI indeks registrlərinin qiyməti avtomatik dəyişir.

Proqramda CMPS əmrindən sonra gələn şərti keçid əmrləri analoji halda CMP əmrindən sonra gələn şərti keçid əmrləridən fərqlənmir. CMPS əmri ilə əlaqədar olan və bu əmrdən sonra gələn, şərti keçidləri idarə edən əmrlər aşağıdakı cədvəldə göstərilmişdir:

CMPS əmrində təkrarlama prefiksindən istifadə etməklə dövrü olaraq sətr elementlərini müqayisə etmək olar. Bu məqsədlə CMPS əmrində REPE/REPZ və ya REPNE/REPNZ təkrarlama prefikslərindən istifadə etmək olar. Prefiksinlərin seçilməsi isə dövrdən çıxmanın səbəblərinə görə təyin olunur.

Aydındır ki, hər prefiks üçün dövrdən çıxma iki səbəbdən baş verə bilər:

REPE/REPZ təkrarlama prefiksi üçün bu səbəblər;

1) ECX/CX registrinin qiyməti sıfıra bərabər olduqda;

2) Uyuşmayan (üst-üstə düşməyən) elementlər cütlüyü tapıldıqda (ZF=0);

REPNE/REPNZ təkrarlama prefiksi üçün isə:

1) ECX/CX registrinin qiyməti sıfıra bərabər olduqda;

2) Uyuşan (üst-üstə düşən) elementlər cütlüyü tapıldıqda (ZF=1) ola bilər.

Məsələn, aşağıdakı əmrlər ardıcıllığı:

           CLD
           MOV  CX,20
    REPE     CMPS a1,a2

a1 və a2 sətrlərinin 20 elementlər cütlüyünü müqayisə edərək, iki uyuşmayan (üst-üstə düşməyən) elementi tapmasına cəhd göstərir.

           CLD
           MOV    CX,20
    REPNE  CMPS   a1,a2 

əmirlər ardıcıllığı isə a1 və a2 sətrlərinin 20 elementlər cütlüyünu müqayisə edərək, iki uyuşan (üst-üstə düşən) elementin tapmasına cəhd göstərir.

Müqayisə prosesinin kəsilməsi səbəbini aydınlaşdırmaq üçün ZF bayrağının qiymətini yoxlayan JE (JZ) və ya JNE (JNZ) şərti keçidləri idarə edən əmrlərindən istifadə etmək olar.

Məsələn:

         CLD
         MOV CX,20
   REPNE  CMPS a1,a2
         JE found
   no_found:
        ...
    found:    ...
       ... 

proqram fraqmentində əgər uyuşan element aşkar olunarsa, onda proqram öz işini found nişanından davam etdirəcək, əks halda isə a1 və a2 sətrlərinin bütün 20 elementləri cütlüyü müqayisə olunacaq.

Sonuncu halda proqram öz işini no_found nişanından davam etdirir. Müqayisənin dayandırılmasının başqa üsulu, JCXZ şərti keçid əmrindən istifadə etməklə CX registrinin məzmunun sıfır olması şərtinin yoxlanmasıdır. Beləki, istənilən halda təkrarlanmanın sayı eCx/Cx registrində yerləşdirildiyindən eCx/Cx məzmununu analiz etməklə qərar qəbul etmək mümkündür.

Doğurdan da əgər eCx/Cx registrinin qiyməti sıfır deyilsə, məsələnin şərtinə uyğun olaraq uyuşan və ya uyuşmayan elementlərin tapılıb-tapılmaması səbəbindən də dövrdən çıxma prosesi baş verə bilər.

Bir seqmentdə yerləşən sətr_1 və sətr_2 kimi iki sətrlərin müqayisəsi məsələsinin proqramına baxaq:

MODEL SMALL
.STACK 256
.DATA
uyushan       DB 0Ah,0Dh, ”uyuşan sətrlər $”
uyushmayan DB 0Ah,0Dh, ” uyuşmayan sətrlər $”
sətr_1        DB ”0123456789”,0Ah,0Dh,'$'
sərt_2       DB ”0123406789”,0Ah,0Dh,'$'
.CODE
	ASSUME DS:@data,ES:@DATA
main:
	MOV AX,@DATA
	MOV DS,AX
	MOV ES,AX
	MOV AH,09h        ; sətr_1
	LEA DX, sətr_1     ; sətrinin
	INT 21h                  ; və
	LEA DX, sətr_2     ; sətr_2   sətrlərinin
	INT 21h	         ; ekrana çıxarılması
	CLD
	LEA SI, sətr_1
	LEA DI, sətr_2
	MOV CX,11
REPE       CMPS sətr_1,sətr_2  ;sətrlər müqayisə olunur
	JCXZ equal ;əgər sətrlər uyuşan olarsa, yəni 
                              ;(CX)=0 olduqda, equal nişanına keçid 
	JNE not_match         ; əgər nöbəti müqayisə
                                       ; olunan  elementlər bərabər olsa , 
                                       ;onda not_match nişanına keçid
equal:
	MOV AH,09h     ;sətrlərin uyuşan olması 
	LEA DX,uyushan ; haqqında məlumatı
	INT 21h              ; ekrana çıxarmaq
	JMP exit
not_match:
	MOV AH,09h     ; sətrlərin uyuşmayan 
                                                  ;olduğu haqqında
	LEA DX,uyushmayan ; məlumatı
	INT 21h              ; ekrana çıxarmaq
exit:
	MOV AX,4C00h
	INT   21h
END	main

Elementlərin tipindən asılı olaraq CMPS əmri CMPSB, CMPSW, CMPSD əmrlərindən birinə translyasiya olunur.