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