Assembler proqramlaşdırma dili

Şərtsiz keçid əmrləri

Şərtsiz keçid əmrləri

Assembler proqramında qayıtma nöqtəsini qeyd etmədən, heç bir şərti yoxlamadan, idarəni proqramın istənilən sətrinə göndərmək üçün Jmp (JuMP unconditionally - şərtsiz keçid) şərtsiz keçid əmrindən istifadə olunur və ümumi şəkildə belə yazılır:

Jmp [ modifikator ] keçid_ ünvanı

Kvadrat mötərizə içərisindəki parametr məcburi deyil və o, yazılmaya da bilər. Məcburi olmayan modifikator haqqında yuxarıda məlumat verilmişdir.

Mikroprosessorun əmrlər sistemində Jmp şərtsiz keçid maşın əmrinin bir neçə kodu mövcuddur. Onlar bir-birindən məqsədli ünvanın verilməsi üsüllarına və keçid məsafəsinə görə fərqlənirlər. Keçid məsafəsi keçid_ ünvanı operandının yerləşmə ünvanına görə təyin olunur. Bu ünvan cari kodlar seqmentində və ya hər hansı başqa kodlar seqmentində ola bilər. Birinci halda keçid seqmentdaxili (yaxın), ikinci halda isə seqmentlərarası ( uzaq) adlanır.

Seqmentdaxili keçiddə yalnız EIP/IP registrinin məzmu­nunun dəyişməsi nəzərdə tutulur. Jmp əmrinin seqment­daxili istifadəsini üç varianta ayırmaq olar:

- birbaşa qısa (Jmp əmrinin uzunluğu 2 bayt);

- birbaşa (Jmp əmrinin uzunluğu 3 bayt);

- dolayısı ilə (Jmp əmrinin uzunluğu 3 bayt).

Seqmentdaxili birbaşa qısa keçid əmri, Jmp əmrindən keçid ünvanına qədər məsafə –128 və ya +127 baytdan çox olmadıqda tətbiq olunur. Birbaşa qısa keçidi icra edərkən, keçid ünvanı və Jmp əmrinin özünün yeləşməsi ilə bağlı olan, aşağıdakı halı nəzərə almaq lazımdır. Əgər keçid ünvanı Jmp əmrindən əvvəl yerləşirsə, onda assembler əlavə ğöstəriş olmadan, qısa şərtsiz keçidi təşkil edir. Keçid ünvanı Jmp əmrindən sonra yerləşdiyi halda isə, translyator özü keçidin qısa keçid olmasını (keçid ünvanı haqqında hələ ki, məlumat olmadığından) müəyyən edə bilmir. Bu halda qısa şərtsiz keçid əmrini formalaşdırmaq üçün SHORT PTR modifikatorundan istifadə olunur:

...
JMP SHORT PTR nish
;35 –40  əmrdən çox olmayan (127 bayt)
nish: 
...
və ya
nish: 
...
; 35 –40  əmrdən çox olmayan (-128 bayt)
JMP nish

Birbaşa seqmentdaxili keçiddə, keçid ünvanı Jmp əmrindən 64 Kbayt intervalında yerləşməlıdır:

nish:
...
;məsafə 128  baytdan çox və 64 Kbaytdan az olmalıdır
JMP nish

Seqmentlərarası dolayısı ilə keçid zamanı əmrdə keçid ünvanının özü deyil, onun olduğu yer göstərilir. Registrdən və ya yaddaş sahəsindən iki baytlıq keçid ünvanının seçilməsinə aid bir neçə misal göstərək:

1)	   LEA BX,m1
          JMP BX
            ...
m1:
2)	  .DATA
                ... 
addr_m1  DW   m1
           ...
         .CODE
          ...
        JMP  addr_m1   ; keçid ünvanı yaddaşın addr_m1
     ; xanasında yerləşir
          ...
        m1:
3)
.DATA
unvan  DW nish1
       DW nish2
        ...
.CODE
        ...
      MOV SI,0
again:
       ...     
      JMP unvan[SI]  ; keçid ünvanı söz uzunluqlu 
  ; unvan+ (SI) yaddaşında 
       ...
nish1: ...
     MOV SI,2
     JMP again
       ...
nish2: ...

Sonuncu misalda bir JMP əmri (sətr 10) iki müxtəlif nişana keçid verə bilər. Konkret keçid nişanının seçilməsi SI registrinin məzmununa görə təyin olunur. JMP əmrinin operandı keçid ünvanını, dolayısı ilə, unvan+( SI) ifadəsini hesabladıqdan sonra təyin edir

4)
.DATA
unvan  DW nish
       ...
.CODE
       ...
    LEA SI, unvan
    JMP WORD PTR[SI] ; keçid ünvanı unvan yaddaş
			;xanasındadır
         ...
nish:     ...

Bu halda WORD PTR modifikatorunun göstərilməsi vacibdir. Çünki, addr yaddaş xanasının ünvanı keçid ünvanı ilə translyatora qeyri aşkar şəkildə ötürülür (3, 7 və 8 sətrlərə bax) və nişan haqqında informasiya olmadığından o, konkret olaraq seqmendaxili və ya seqmntlərarası formada keçidin yerinə yetirilməsini müəyyən edə bilmir.

Seqmenlərtarası keçidin realizasiyası zamanı EIP/IP registrindən başqa CS registrinin qiymətini də modifikasiya etmək lazımdır. Seqmentlərarası keçid formasında şərtsiz keçid əmrinin ikivariantından: birbaşa və dolayısı ilə variantlarıından istifadə olunur. Bu halda JMP əmrinin uzunluğu 5 bayt (iki bayt sürüşmənin qiyməti, iki bayt isə seqmentin başlanğıci ünvanı üçün) ola bilər.

Seqmentarası birbaşa keçidin təşkilinə aid misala baxaq:

seg_1    SEGMENT
      ...
     JMP FAR PTR m2     ; burada FAR məcburidir
     ...
 m1 LABEL FAR
    ...
 seg_1   ENDS
    ...
 seg_2  SEGMENT 
    ...
 m2   LABEL  FAR
     JMP   m1          ; burada FAR məcburi deyil.

Bu misalda JMP əmrində istifadə olunan FAR PTR mo­di­fikatorunu nəzərdən keçirək. Əgər cari proqram mət­nində nişanlar ona uyğun keçid əmrindən əvvəl gəlirsə (ni­şan m1), translyatora verilmiş nişan məlum olduğundan, mo­difikatoru göstərmək məcburi deyil. Əks halda, yəni cari proq­ram mətnində nişanlar ona uyğun keçid əmrindən son­ra gəlirsə, translyator nişan haqqında məlumata malik olma­dığından, JMP əmrində FAR PTR modifikatorunu gös­tərmək məcburidir. Yəni, bu halda translyator əmrin han­sı formada (üçbitlik və ya beşbitlik əmrin) formalaş­dır­masını müəyyən edə bilmir.

Xüsusi modifikator göstəricisi olmadıqda translyator susmaya görə seqmentdaxili üçbaytlıq (near atributlu) keçid əmrini formalaşdıracaqdır.

Seqmentarası dolayısı ilə keçid əmrində operand kimi yaddaş sahəsinin ünvanı götürülür. Yaddaş sahəsinin məzmunu isə sürüşmə və seqment hissəsinin məqsədli keçid ünvanından ibarətdir

Misal 1:
Data   segment
Addr_m1 DD   m1      	; addr_m1 sahəsində sürüşmə 
                ;qiyməti və m1 nişanının seqment ünvanı
Data    ends
Code_1  segment
         ...
     JMP    m1
       ...
Code_1   ends
Code_2   segment
        ...
 m1 LABEL FAR
       MOV AX, BX
          ...
Code_2 ends 

Seqment arası dolayısı ilə keçid variantı kimi, dolayısı ilə registrli seqment arası keçidi xüsusi qeyd etmək lazımdır. Bu formada keçid ünvanı keçiddə dolayısı ilə göstərilir və o, re¬gistrdə yerləşdirilir. Bu, dinamiki keçidlərin (proqramın ic¬rası prosesində keçid ünvanları dəyişdikdə) proqram¬laşdırılmasında çox əlverişlidir.

Misal 2:
Data   segment
Addr_m1 DD   m1           ; addr_m1 sahəsində sürüşmə
	                ;qiyməti və m1 nişanının seqment ünvanı
Data    ends
Code_1  segment
       ...
LEA BX ,addr_m1
JMP    DWORD PTR [BX]
      ...
Code_1   ends
Code_2   segment
       ...
 m1 LABEL FAR
 MOV AX, BX
      ...
Code_2   ends

Beləliklə, SHORT PTR, NEAR PTR və WORD PTR modifikatorları seqmentdaxili, FAR PTR və DWORD PTR isə seqmentarası keçidlərdə istifadə olunur.

Tam aydınlıq üçün bir daha qeyd edək ki, USE32 tip seqmentlərdə IP registrinin əvəzinə EIP registrini götürmək və uyğun sürüşdürmə sahəsinin ölçüsünü 32 bitə tamamla­maq lazımdır.