Assembler proqramlaşdırma dili

Dövlərin idarəsi əmrləri

Dövlərin idarəsi əmrləri

Proqramın hər hansı hissəsinin dövri olaraq təkrar icra­sını şərti və şərtsiz keçid əmrlərinin köməyi ilə yerinə yetir­mək mümkündür. Ancaq dövri proseslərin proqramlaşdır­ması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. Bildi­yimiz kimi MP-nin ECX/CX registrindən dövlərin təş­ki­lində sayğac kimi istifadə edir.Yəni, dövrün təkrarlanma sa­yı bu registrə yüklənir. Dövrün gövdəsindəki əmrlərin ic­ra­sından sonra ECX/CX registrinin qiyməti bir vahid aza­lır və ECX/CX registrinin qiymətinin sıfra çatması şərti yox­la­nı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 so­nuna kimi təkrarla), LOOPE (LOOP if Equal –əgər bə­ra­bə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ək­rar­lamaq )

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