Montaj - Koşullar

Assembly dilinde koşullu yürütme, birkaç döngü ve dallanma talimatıyla gerçekleştirilir. Bu talimatlar, bir programdaki kontrol akışını değiştirebilir. Koşullu yürütme iki senaryoda gözlemlenir -

Sr.No. Koşullu Talimatlar
1

Unconditional jump

Bu, JMP talimatı ile gerçekleştirilir. Koşullu yürütme, genellikle o anda yürütülmekte olan talimatı takip etmeyen bir talimatın adresine bir kontrol transferini içerir. Kontrolün devri, yeni bir talimatlar dizisini uygulamak için ileri veya aynı adımları yeniden uygulamak için geri olabilir.

2

Conditional jump

Bu, koşula bağlı olarak bir dizi atlama talimatı j <koşul> ile gerçekleştirilir. Koşullu komutlar, sıralı akışı keserek kontrolü aktarır ve bunu IP'deki ofset değerini değiştirerek yaparlar.

Koşullu talimatları tartışmadan önce CMP talimatını tartışalım.

CMP Talimatı

CMP komutu iki işleneni karşılaştırır. Genelde şartlı yürütmede kullanılır. Bu komut temelde işlenenlerin eşit olup olmadığını karşılaştırmak için bir işleneni diğerinden çıkarır. Hedefi veya kaynak işlenenleri rahatsız etmez. Karar vermede şartlı atlama talimatıyla birlikte kullanılır.

Sözdizimi

CMP destination, source

CMP, iki sayısal veri alanını karşılaştırır. Hedef işlenen, kayıtlı veya bellekte olabilir. Kaynak işlenen, sabit (anlık) bir veri, kayıt veya bellek olabilir.

Misal

CMP DX,	00  ; Compare the DX value with zero
JE  L7      ; If yes, then jump to label L7
.
.
L7: ...

CMP, genellikle bir sayaç değerinin bir döngünün çalıştırılması gereken sayıya ulaşıp ulaşmadığını karşılaştırmak için kullanılır. Aşağıdaki tipik durumu düşünün -

INC	EDX
CMP	EDX, 10	; Compares whether the counter has reached 10
JLE	LP1     ; If it is less than or equal to 10, then jump to LP1

Koşulsuz Atlama

Daha önce belirtildiği gibi, bu JMP talimatı ile gerçekleştirilir. Koşullu yürütme, genellikle o anda yürütülmekte olan talimatı takip etmeyen bir talimatın adresine bir kontrol transferini içerir. Kontrolün devri, yeni bir talimatlar dizisini uygulamak için ileri veya aynı adımları yeniden uygulamak için geri olabilir.

Sözdizimi

JMP talimatı, kontrol akışının hemen aktarıldığı bir etiket adı sağlar. JMP talimatının sözdizimi -

JMP	label

Misal

Aşağıdaki kod parçası JMP talimatını göstermektedir -

MOV  AX, 00    ; Initializing AX to 0
MOV  BX, 00    ; Initializing BX to 0
MOV  CX, 01    ; Initializing CX to 1
L20:
ADD  AX, 01    ; Increment AX
ADD  BX, AX    ; Add AX to BX
SHL  CX, 1     ; shift left CX, this in turn doubles the CX value
JMP  L20       ; repeats the statements

Koşullu Atlama

Koşullu atlamada belirtilen bazı koşullar karşılanırsa, kontrol akışı bir hedef talimata aktarılır. Koşul ve verilere bağlı olarak çok sayıda koşullu atlama talimatı vardır.

Aşağıda, aritmetik işlemler için kullanılan imzalı verilerde kullanılan koşullu atlama talimatları verilmiştir -

Talimat Açıklama Test edilen bayraklar
JE / JZ Eşit Atla veya Sıfırla Atla ZF
JNE / JNZ Eşit Değil Atlama veya Sıfır Değil Atlama ZF
JG / JNLE Daha Büyük Zıpla veya Daha Az Değil / Eşit Zıpla OF, SF, ZF
JGE / JNL Daha Büyük / Eşittir veya Daha Az Değil Zıpla OF, SF
JL / JNGE Daha Az Zıpla veya Büyük Değil / Eşit Zıpla OF, SF
JLE / JNG Daha Az Atla / Eşit veya Daha Fazla Atla OF, SF, ZF

Mantıksal işlemler için kullanılan işaretsiz verilerde kullanılan koşullu atlama talimatları aşağıdadır -

Talimat Açıklama Test edilen bayraklar
JE / JZ Eşit Atla veya Sıfırla Atla ZF
JNE / JNZ Eşit Değil Atlama veya Sıfır Değil Atlama ZF
JA / JNBE Yukarı Atla veya Aşağıya Atla / Eşit CF, ZF
JAE / JNB Yukarı Atla / Eşittir veya Aşağıya Atla CF
JB / JNAE Aşağı Atla veya Yukarıya Atla / Eşit CF
JBE / JNA Aşağı Atla / Eşittir veya Yukarıya Atla AF, CF

Aşağıdaki koşullu atlama talimatlarının özel kullanımları vardır ve bayrakların değerini kontrol edin -

Talimat Açıklama Test edilen bayraklar
JXCZ CX Sıfırsa atla Yok
JC Taşınırsa Atla CF
JNC Taşıma Yoksa Atla CF
JO Taşarsa Atla NIN-NİN
JNO Taşma Olmazsa Atla NIN-NİN
JP / JPE Eşitliği Atla veya Eşitliği Atla PF
JNP / JPO Eşlik Yok Atlama veya Eşlik Oranı Atlama PF
JS Atlama İşareti (negatif değer) SF
JNS İşaret Yok (pozitif değer) SF

J <koşul> yönerge kümesinin sözdizimi -

Misal,

CMP	AL, BL
JE	EQUAL
CMP	AL, BH
JE	EQUAL
CMP	AL, CL
JE	EQUAL
NON_EQUAL: ...
EQUAL: ...

Misal

Aşağıdaki program üç değişkenin en büyüğünü gösterir. Değişkenler çift basamaklı değişkenlerdir. Üç değişken num1, num2 ve num3 sırasıyla 47, 22 ve 31 değerlerine sahiptir -

section	.text
   global _start         ;must be declared for using gcc

_start:	                 ;tell linker entry point
   mov   ecx, [num1]
   cmp   ecx, [num2]
   jg    check_third_num
   mov   ecx, [num2]
   
	check_third_num:

   cmp   ecx, [num3]
   jg    _exit
   mov   ecx, [num3]
   
	_exit:
   
   mov   [largest], ecx
   mov   ecx,msg
   mov   edx, len
   mov   ebx,1	;file descriptor (stdout)
   mov   eax,4	;system call number (sys_write)
   int   0x80	;call kernel
	
   mov   ecx,largest
   mov   edx, 2
   mov   ebx,1	;file descriptor (stdout)
   mov   eax,4	;system call number (sys_write)
   int   0x80	;call kernel
    
   mov   eax, 1
   int   80h

section	.data
   
   msg db "The largest digit is: ", 0xA,0xD 
   len equ $- msg 
   num1 dd '47'
   num2 dd '22'
   num3 dd '31'

segment .bss
   largest resb 2

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

The largest digit is: 
47