Dövlərin idarəsi əmrləri
Proqramın hər hansı hissəsinin dövri olaraq təkrar icrasını şərti və şərtsiz keçid əmrlərinin köməyi ilə yerinə yetirmək mümkündür. Ancaq dövri proseslərin proqramlaşdırmasını aşanlaşdırmaq məqsədi ilə mikroprosessorun əmrlər sisteminə dövrləri idarə edən bir sıra əmrlər daxil edilmişdir.
Bu əmrlər dövrlərin təşkilində keçidləri idarə edir. Bildiyimiz kimi MP-nin ECX/CX registrindən dövlərin təşkilində sayğac kimi istifadə edir.Yəni, dövrün təkrarlanma sayı bu registrə yüklənir. Dövrün gövdəsindəki əmrlərin icrasından sonra ECX/CX registrinin qiyməti bir vahid azalır və ECX/CX registrinin qiymətinin sıfra çatması şərti yoxlanılır. Əgər ECX/CX registrinin qiyməti sıfırdan fərqli isə dövr təkrar opunur, əks halda (ECX/CX=0 isə) dövrdən çıxış baş verir.
Mikroprosessorun əmrlər sistemində dövrlərin təşkilini asanlaşdıran əmrlər qrupuna aşağıdakı əmrlər daxildir: LOOP (LOOP untiL cOunt cOomPlete –dövrü sayğacın sonuna kimi təkrarla), LOOPE (LOOP if Equal –əgər bərabərdirsə, dövrü təkrarlamaq), LOOPZ (LOOP if Zero –əgər sıfırdırsa dövrü təkrarlamaq ), LOOPNE (LOOP if Not Equal –bərabər deyilsə dövrü təkrarlamaq)və LOOPNZ (LOOP if Not Zero – sıfır deyilsə dövrü təkrarlamaq )
LOOP dövr əmrinin yazılışı aşağıdakı kimidir:
LOOP <yaxın nişan>
Burada da <yaxın nişan> -128 127 bayt uzaqlıqda dayanır. Aydındır ki, bu əmrə qədər ECX/CX registrinə dövrlərin sayı yüklənməlidir. Məsələn:
MOV CX , 50 AA: ... ... LOOP AA ;əgər (CX) sıfra bərabər deyilsə, ;AA nişanına keçmək
Bu əmrlərdən sonra AA nişanı və LOOP əmri arasındakı əmrləri 50 dəfə təkrar yerinə yetriləcək.
Misal:
massivi verilmişdir. A massivindəki ən böyük elementi tapıb ekranda əks etdirməli.
MASM MODEL SMALL .STACK 256 .DATA MAX DB ? AA DB 'MAX= ',0AH,0DH,'$' a db 2,3,1,4,2,-2,4,3,2,1 .CODE MAIN: EXTRN CON2:FAR MOV AX,@DATA MOV DS,AX SUB SI,SI XOR AX,AX MOV CX,10 MOV AL,A[SI] MOV MAX,AL DOV: INC SI MOV AL,A[SI] CMP MAX,AL JG C MOV MAX,AL C: LOOP DOV MOV AL,MAX LEA BX,AA+4 CALL CON2 LEA DX,AA MOV AH,9 INT 21H MOV AH,4CH INT 21H END MAIN
Yuxarıda dediyimiz kimi dövrü əməliyyatları yerinə yetirmək üçün LOOP əmrinin bir sıra modifikasiyaları var. Onlar aşağıdakı kimi yazılırlar:
LOOPZ <yaxın nişan>
LOOPE <yaxın nişan>
Bu əmrlər CX ≠ 0 və ZF=1 şərtlərində dövrdəki əmrləri təkrar icra edir.. CX=0 və ya ZF=0 şərtlərində isə dövrdən çıxış baş verir. Bu əmrlərdən sıfırdan fərqli birinci nəticənin alınması üçün istifadə elirlər.
LOOPNZ <yaxın nişan>
LOOPNE <yaxın nişan>
Bu əmrlər CX ≠ 0 və ZF=0 şərtlərində dövrdəki əmrləri təkrar icra edir. CX=0 və ya ZF=1 şərtlərində isə dövrdən çıxış baş verir. Bu əmrlərdən sıfra bərabər birinci nəticənin alınması üçün istifadə elirlər. Məsələn:
A vektorunun sıfra bərabər birinci elmentindən əvvəlki elementlərinin hesabi ortasını taparaq ekranda əks etdirməli.
MASM MODEL SMALL .STACK 256 .DATA K DW ? GIS DB 'GIS= ',0AH,0DH GAL DB 'GAL= $' a dW 2,3,22,0,2,-2,4,3,2,1 SUM DW 0 .CODE MAIN: EXTRN CON2:FAR MOV AX,@DATA MOV DS,AX SUB SI,SI XOR AX,AX MOV K,0 MOV CX,10 DOV: MOV AX,A[SI] ADD SUM,AX INC K ADD SI,2 CMP AX,0 LOOPNZ DOV JNZ A1 DEC K A1: MOV AX,SUM CWD IDIV K LEA BX,GIS+4 CALL CON2 MOV AX,DX LEA BX,GAL+4 CALL CON2 LEA DX,GIS MOV AH,9 INT 21H MOV AX,4C00H INT 21H END MAIN
Qeyd edək ki, dövrləri təşkil edən LOOP, LOOPE/LOOPNZ və LOOPNE/LOOPNZ əmrləri yalnız yaxın keçidlərin (-128-dən +127 bayt diapoznunda ) ünvanlaşdırma sərhəddində realizə oluna bilirlər ki, bu da onların mühüm çatışmayan cəhəti sayılır. Odur ki, uzun dövrləri təşkil etmək üçün şərti keçid əmrlərindən və JMP əmrindən istifadə etmək zəruriyyəti yaranır.
Dövrlərin təkilinə aid bir neçə misalın proqramını nəzərdən keçirək.
Misal 1. mas yaddaş sahəsindəki sıfır baytların sayını hesablayan proqram. Dövr JMP əmrindən istifadə etməklə təşkil olunub:
MODEL SMALL .STACK 100h .DATA len EQU 10 ; mas-dakı baytların sayı mas DB 3,5,-9,2,0,5,0,0,-4,0 .CODE start: MOV AX,@DATA MOV DS,AX MOV CX,len XOR AX,AX XOR SI,SI cycl: JCXZ exit ; (CX)- nu 0 ilə müqayisə etmək, ;əgər CX= 0, dövrdən çıxış CMP mas[SI],0 ; növbəti baytın sıfırla müqayisəsi JNE m1 ;əgər o, sıfır deyilsə onda m1 ; nişanına keçid INC AL ; əks halda AL registrindəki sıfır ; baytlar (elementlər) sayğacının ; qiymətini artırmaq m1: INC SI ;növbəti elementə keçid DEC CX JMP cycl exit: MOV AX,4C00h INT 21h END start
Misal 2. LOOP əmrindən istifadə etməklə mas yaddaş sahəsindəki sıfır baytların sayını hesablayan proqram
MODEL SMALL .STACK 100h .DATA len EQU 10 ; mas-dakı baytların sayı mas DB 8,–4,11,0,0,37,5,0,–3,0 .CODE start: MOV AX,@DATA MOV DS,AX MOV CX, len XOR AX,AX XOR SI,SI cycl: CMP mas[SI],0 ;növbəti baytın sıfırla müqayisəsi JNE m1 ; əgər o, sıfır deyilsə onda m1 ; nişanına keçid INC AL ; əks halda AL registrindəki sıfır ; baytlar(elementlər) sayğacının ; qiymətini artırmaq m1: INC SI ;növbəti elementə keçid LOOP cycl MOV AX,4C00h INT 21h END start