İki değerin eşitliği CMP komutundan sonra ZF bayrağına bakılarak tespit edilebilir. Bu testi yapan makine komutu JZ/JE’dir(Bu iki komut birbirinin aynısıdır). Koşullu JMP komutları koşul sağlanmışsa belirtilen bölgeye dallanmayı sağlarlar. Koşul sağlanmamışsa bir sonraki komuttan devam ederler. Aşağıdaki C karşılaştırmasının sembolik makine dili karşılığı:

if (x == y)
ifade1;
else
ifade2;
MOV AX, x
CMP AX, y
JZ @1
İfade2
JMP NEXT
@1:
ifade1
@2:

Burada tipik bir if komutunun sembolik makine dilindeki karşılığı görülmektedir.
Eşitsizlik Karşılaştırması

CMP komutundan sonra JNZ/JNE komutu ile ZF bayrağı 0 ise dallanılabilir.

Kalıp:
Bellekte bulunan bir değerin 0 olup olmadığını anlamak için iki yöntem kullanılabilir.
1. Değişkeni doğrudan 0 ile karşılaştırıp ZF bayrağına bakmak,
2. Değişkeni register’a çekip kendisiyle AND ya da OR işlemine sokmak. Bu yöntem daha etkindir. Aşağıdaki if ifadesinin sembolik makine dili karşılığı:
if (result)
ifade1;
else
ifade2;
MOV AX, result
AND AX, AX
JNZ @1
İfade2
JMP @2
@1:
ifade1
@2:

Bazen karşılaştırma işlemlerinde ek bir takım makine komutları söz konusu olabilir. Örneğin:

if (x + y == a * b)
ifade1;
else
ifade2;
MOV BX, x
ADD BX, y
MOV AX, a
MUL word ptr b
CMP AX, BX
JZ @1
İfade2
JMP @2
@1:
ifade1
@2:
İşaretsiz Sayıların Karşılaştırılması

İşaretsiz sayıların karşılaştırılması için SUB ya da CMP komutundan sonra CF ve ZF bayraklarına bakmak yeterlidir. Aşağıda açıklanan komutlar yalnızca bu bayraklara bakmaktadır. İşaretsiz karşılaştırma yapan komutlar ve eş değerleri aşağıda verilmiştir:

Komutlarda büyüktür için above sözcüğü, küçüktür için below sözcüğü kullanılmaktadır. Karşılaştırma işleminin anlatımı SUB ya da CMP komutunun birinci operandı dikkate alınarak kurulmuştur.

JA(jump if above)/JNBE(jump if not below or equal)
JB(jump if below)/JNAE(jump if not above or equal)
JAE(jump if above or equal)/JNB(jump if not below)
JBE(jump if below or equal)/JNA(jump if not above)

if (x >= y)
ifade1;
else
ifade2;
MOV AX, x
CMP AX, y
JAE @1
ifade2
JMP @2
@1:
ifade1
@2:
İşaretli Sayıların Karşılaştırılması

İşaretli sayıların karşılaştırılmasında SUB ya da CMP komutundan sonra OF, ZF ve SF bayraklarına bakılır. Karşılaştırmanın anlatımı yine birinci operanda göre kurulmuştur. Büyüktür için greater, küçüktür için less sözcükleri seçilmiştir. İşaretli karşılaştırma komutları şunlardır:

JG(jump if greater)/JNLE(jump if not less or equal)
JL(jump if less)/JNGE(jump if not greater or equal)
JGE(jump if greater or equal)/JNL(jump if not less)
JLE(jump if less or equal)/JNG(jump if not greater)

if (x >= y)
ifade1;
else
ifade2;
MOV AX, x
CMP AX,y
JGE @1
ifade2
JMP @2
@1:
ifade1
@2:
Diğer Koşullu JMP Komutları

İşaretli ve işaretsiz karşılaştırma komutlarının dışında CF, OF, PF ve SF bayraklarının durumuna göre dallanmayı sağlayan 8 koşullu JMP komutu da vardır:

JC(jump if carry)
JNC(jump if not carry)
JO(jump if overflow)
JNO(jump if not overflow)
JP(jump if parity)
JNP(jump if not parity)
JS(jump if sign flag set)
JNS(jump if not sign flag set)
Alt Programların Çağırılması

C’de bir fonksiyon çağırıldığında fonksiyonun ana bloğu bittiğinde ya da fonksiyon içerisinde return anahtar sözcüğü kullanıldığında akış çağırılma işleminden sonraki koddan devam eder. Fonksiyonların çağırılması için Intel işlemcilerinde CALL makine komutu, fonksiyondan geri dönmek için ise RET komutu kullanılır. CALL makine komutunun JMP’den tek farkı dönüş adresinin stack’te saklanmasıdır. CALL makine komutu dallanmadan önce CALL komutundan sonraki komutun adresini kendi içerisinde otomatik olarak stack’e PUSH eder. Böylece dallanma işlemi yapıldığında dönüş adresi stack’tedir. İstediğimiz zaman RET makine komutuyla o adresi stack’ten alarak geri dönebiliriz. Bu durumda

CALL adr

eşdeğerindeki bir komut

PUSH sonraki_adr
JMP adr

biçiminde yapılır. CALL makine komutunun 4 biçimi vardır:

1. Segment içi doğrudan CALL(direct within segment CALL)
Bu makine komutunu E8 byte’ıyla teşhis edilir. Komutun kendisi 3 byte uzunluğundadır. 2 byte’lık bir yer değiştirme miktarı vardır. Yani segment’in her tarafına dallanılabilir. Dallanmadan önce yalnızca IP register’ı stack’e PUSH edilir. Örneğin:

CALL func

Fonksiyondan geriye dönmek için sembolik olarak POP IP işleminin yapılması gerekir. Tabii POP IP biçiminde bir makine komutu yoktur. Bu makine komutunun ismi RET komutudur. Yani aslında C’de fonksiyonun ana bloğu bittiğinde derleyici bizim görmediğimiz bir RET komutu yerleştirmektedir.

2. Segment içi dolaylı CALL(indirect within segment CALL)
Burada komutun operandı bellek ya da register’dır. Programın akışı operand ile belirtilen bellekteki adrese gider. Bu çağırma işleminin segment’ler arası dolaylı çağırma işleminden ayrılması için CALL komutundan sonra near anahtar sözcüğünün getirilmesi gerekir. Örneğin:

CALL near [SI]
CALL near [BP – 2]

Komutu anlatan byte FF biçimindedir.

3. Segment’ler arası doğrudan CALL(direct intersegment CALL)
Segment’ler arası CALL işleminden geri dönülebilmesi için hem CS hem de IP register’larının stack’e atılması gerekir. Komut önce PUSH CS, sonra PUSH IP işlemleriyle sonraki komutun segment ve offset bilgilerini stack’e atar ve operand biçiminde verilmiş olan CS ve IP değerlerini yükleyerek dallanmayı gerçekleştirir.

Komut 5 byte uzunluğundadır. Sembolik makine dilinde CALL segmentffset biçiminde kullanılır. Örneğin:

CALL 1FC0:2C15

Segment’ler arası CALL işleminden RETF makine komutuyla geri dönülür.

4. Segmentler arası dolaylı CALL(indirect intersegment CALL)
Bu komutun operandı bellek ya da register’dır. Belirtilen bellek bölgesindeki düşük anlamlı word IP register’ına, yüksek anlamlı word CS register’ına çekilerek dallanma gerçekleştirir. Komutta far anahtar sözcüğü kullanılmalıdır. Örneğin:

CALL far [SI]
CALL far [BP – 2]