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.