Assembler proqramlaşdırma dili

Şərti keçid əmrləri

Şərti keçid əmrləri

Şərti keçid əmrləri özündən əvvəlki əmrin yerinə yetirilməsinin nəticəsindən asılı olaraq təşkil olunur. Assemblerdə 30-dan çox şərti keçid əmrlərindən istifadə olunur. Əmrin yazılışı aşağıdakı kimidir:

JX < yaxın nişan >

Burada X – 3 simvola qədər olub, şərti keçidin növünü göstərir.

< yaxın nişan > - bir baytlıq sahə olub idarənin ötürüləcəyi əmrin, şərti keçid əmrindən -128 127 baytlıq məsafədə yerləşdiyini göstərir. Burada « - » işarəsi idarənin ötürüləcəyi əmrin şərti keçid əmrindən əvvəl, « + » işarəsi isə əksinə sonra gəldiyini təyin edir. Əgər idarənin ötürüləcəyi əmr bu məsafədən kənarda yerləşərsə, onda şərtsiz keçid əmri vasitəsilə idarənin istənilən yerə keçidini təşkil etmək olar. İ80386 modifikasiyasından sonra gələn modifikasiyasıyalarda bu məhdudiyyət aradan götürülüb. Bayraqların qiymətindən asılı olaraq şərti keçidlərin təşkiliində istifadə olunan əmrlərin bir qrupu aşağıdakı cədvəldə verilmişdir:

MODEL SMALL
.STACK 100h
.DATA
n EQU  50
mem   DB  n DUP(?)
.CODE
start:
: ...
        XOR BX,BX
m1:     MOV mem[BX],0
        INC BX
        CMP BX,n
        JNE m1
exit:
       MOV AX,4C00h
       INT 21h
end start

Şərti keçid əmrləri bayraqların qiymətini dəyişmədiyinə görə bir CMP əmrindən sonra bir neçə şərti keçid əmri gələ bilər. Məsələn:

.DATA
 mas DB   15 DUP (?)
.CODE
           ...
CMP mas[SI], 9    ; massivin növbəti elementinin 
                                    ; 9 ilə müqayisəsi
          JE  bərabər  ; əgər mas=9 isə keçid
          JL  kiçik          ; əgər mas < 9 isə keçid
          JG  böyuk         ; əgər mas>9 isə keçid
bərabər:
            ...
kiçik:
             ...
böyuk:
             ...

Şərti keçid əmrlərinin digər qrupunun mnemonik adlarında bayraqların adları və ya ”N” inkar simvolu ilə və ondan sonra bayrağın adı yazıla bilər. Əgər bu simvol yoxdursa, onda uyğun bayraqların vəziyyəti yoxlanılır və əgər bayraqlar vahid vəziyyətində isə keçid nişanına keçid baş verir. Əgər “N” simvolu iştirak edirsə, onda uyğun bayraqların vəziyyəti yoxlanılır və əgər bayraqlar sıfır vəziyyətindədirsə keçid nişanına keçid baş verir. Bu əmrlər aşağıdakı cədvəldə verilmişlər

Bu keçid əmrlərindən göstərilən bayraqların vəziyyətini dəyişən istənilən əmrlərdən sonra istifadə etmək olar. Bir çox şərti keçid əmrləri ekvivalentdirlər. Çünkü onlar eyni bayraqların yoxlanılması əsasında işləyirlər.

Keçid əmrlərindən istifadə etməklə aşağıdakı funk­siyanın hesalanması proqramını nəzərdən keçirək:

MODEL SMALL
.STACK 100h
.DATA
a    DB     -5
b    DB     2
x    DB     100
y    DD     ?
.CODE
		EXTRN CON2:FAR
main:
        MOV  AX,@DATA
        MOV  DS,AX
        XOR  AX,AX
        MOV  AL,a
        CMP  AL,0
         JG   boyuk
         JE   barabar
         MOV  AL,B
         IMUL x
         JMP  son
   boyuk:   IMUL x
         MOV  BX,WORD PTR x
         IMUL BX
         JMP  son
barabar:      MOV  AL,x
         IMUL x
         MOV  BX,WORD PTR x
         IMUL BX
         ADD  AX,1
         ADC  DX,0
 son:         MOV  WORD PTR y,AX
         MOV  WORD PTR y+2,DX

        MOV  AX,4C00h
         INT  21h
END    main

İndi isə n bayt ölçülü str1 adlı sətrdəki ingilis əlifbasının kiçik hərflərini böyük hərflər ilə əvəz edən proqramı nəzərdən keçirək.

MODEL SMALL
.STACK 100h
.DATA
n EQU 10    ; str1-dəki simvolların sayı 
str1 DB ”abcdefgikl”
.CODE
start:
	MOV AX,@DATA
	MOV DS,AX
	XOR AX,AX
	MOV CX,n
; str1 effektiv ünvanını BX yükləmək 
	LEA BX,str1  
; str1-dən növbəti simvolu AL yükləmək
m1: 	MOV AL,[BX]
; simvol kodunu 61h ilə müqayisə etmək
	CMP AL,61h   
 ; əgər bu kod 61h kiçikdirsə, onda emal etmək lazım 
;   deyil və növbəti simvola keçmək
	JB next 
; elə bu simvolun kodunu 7Ah ilə müqayisə etmək 
	CMP AL,7Ah  
; əgər bu kod böyükdürsə, onda emal etmək lazım deyil
 ; və növbəti simvola keçmək	
           JA next 
; 5-ci  biti inversiya etmək alınan            
   AND AL,11011111 
 ; böyük simvolu öz sətr ekvivalentinin yerinə yazmaq
   MOV [BX],AL          
next:
	INC BX
	DEC CX
	JNZ m1
exit:
	MOV AX,4C00h
	INT 21h
end start

Bu proqramı işini başa düşmək üçün əvvəlcə ASCII kodunun cədvəl fraqmentini nəzərdən keçirək:

Cədvəldəki simvolların ikilik təsvirindən göründüyü kimi kiçik və böyük hərflərin üyğun çevirməsini aparmaq üçün yalnız 5-ci biti inversiya etmək kifayyətdir. JNZ m1 əmri ZF bayrağının vəziyyətini analiz edir və o 1-ə bərabər olmayana qədər idarəni m1 nişanına göndərir. Faktiki olaraq bu əmr dövri təşkil edir. Bu əmrin əvəzinə JNE əmrindən də istifadə etmək olar. Ancaq, CX reqistrinin analizi üçün mikroprosessorun əmrlər sistemində JCXZ (Jump if CX is Zero –əgər CX=0-dırsa, keçid) və JECXZ (Jump if ECX is Zero – əgər ECX =0-dırsa, keçid: i80386) əmrləri nəzərdə tutulub. Bu əmrlər ümumi şəkildə aşağıdakı kimi göstərilir:

JCXZ yaxın_nişan

JECXZ yaxın_nişan

Dövrlərin təşkilində və sətr simvolları ilə işlədikdə öu əmrlərdən istifadə etmək çox əlverişlidir.Gti komandı oçenğ udobno ispolğzovatğ pri orqanizaüii üikla i pri rabote s üepoçkami simvolov. idarənin şərti ötürülməsinin başqa əmrlərindən fərqli olaraq, JCXZ və JECXZ əmrləri ancaq qısa keçidləri(-128 və ya +127) ünvanlaşdıra bilir.