Öncelikle, eğer okumadıysanız bir önceki konu olan Assembly – Farklı Atama Yolları Mov ve ‘=’ Kullanımı isimli konuyu okumanızı tavsiye ederim.
Tüm konulara ise Assembly Kodlama linkinden ulaşabilirsiniz.
Bu konuda Mantıksal işlemlerin başlangıçı olan ADDEQ ve SUBGT komutlarını örnekleri ile beraber inceleyeceğiz ve Assembly’de Flag Sisteminden daha detaylı olarak bahsedeceğiz.
CMP ile Flag Kontrolü
- CMP –> Assembly dilinde bir varsayımın kontrolü CMP ile gerçekleştirilir. CMP açılımı Compare ( karşılaştırmak ) kelimesinin kısaltılmış halidir. Sytnax‘ı aşağıdaki gibidir.
CMP Register1 , Register2
CMP r0,r1
r0 ile r1 registerlarındaki kayıtlı değerleri karşılaştırır.
CMP Register1 , #constant
CMP r0, #5
r0 ‘daki kayıtlı olan değeri 5 ile karşılaştırır.
Peki karşılaştırma sonucunda Flagların durumları ne olur?
- Eğer r0 < r1 ise Negative Flag 1 ve Zero Flag 0 olarak belirlenir.
- Eğer r0 > r1 ise Negative Flag 0 ve Zero Flag 0 olarak belirlenir.
- Eğer r0 = r1 ise Negative Flag 0 ve Zero Flag 1 olarak belirlenir.

Şimdi Flaglar üzerinde tam hakimiyet sağladığımıza göre karşılaştırmanın sonucuna göre işlem yapabiliriz.
MOVGT,ADDEQ,SUBGT Kullanımları
Burada öğrenmemiz gereken kısım ADD, MOV ve SUB gibi komutlardan sonra gelen ek kısımları (suffix) . Çünkü hali hazırda bu komutların basit olanlarını biliyoruz.
- GT –> Greater Than, eğer karşılaştırmanın sonucu ilk sayı diğer sayıdan daha büyükse ekin önünde kalan işlemi gerçekleştirir.
- EQ –> Equal, eğer iki sayı eşit çıktı ise ekin önündeki işlemi gerçekleştirir.
- LT –> Less Than, eğer ilk sayı diğer sayıdan daha küçükse ekin önündeki işlemi gerçekleştirir.
Örnek – 1:
Aşağıdaki basit kodda r0 ve r1‘in sahip olduğu değerlere göre r6, r7 veya r8‘e istenilen değerler yazılabilir. Böyle bir kodda flag kısmına dikkat etmemize gerek yok.
LDR r0,=3 ; r0 = 3 LDR r1,=5 ; r1 = 5 CMP r0,r1 ; compare edileceği söylenir MOVEQ r6,#1 ; eğer eşitlerse r6'ya bir yazar. MOVGT r7,#2 ; eğer daha büyükse r7'ye iki yazar. MOVLT r8,#3 ; eğer daha küçükse r8'e üç yazar.

Örnek -2:
Bu örnekte değerleri, unutmamak adına bir önceki konularda atadığımız gibi atadık.
R2 ‘deki 2 değerinden 2 çıkartınca sonucu 0 olduğundan dolayı Zero Flag 1 oluyor ve ADDEQ komutunu gerçekleştiriyor.
aa DCD 3 ; aa = 3 bb DCD 2 ; bb = 2 adr r1,aa ; r1 = aa'nın adresi ldr r0,[r1] ; r0 = r1'in gösterdiği değer yani 3 adr r1,bb ; r1 = bb'nin adresi ldr r2,[r1] ; r2 = 2 subs r2,r2,#2 ; r2 = r2 -2, 0 yapar. addeq r3,r2,#3 ;zero flag 1 olduğu icin r3 = r2 + 3 islemini gerçekleştirir.
Not: Eğer Subs ve Zero Flag’ın neden 1 olduğuna dair aklınızda kafa karışıklığınız varsa Assembly – Aritmetik Islemler ADD,SUB konusundaki SUBS ve ADDS kısmını inceleyebilirsiniz.

Tabi, benim önerim Assembly dilinde Flag sistemine hakim olmanız ancak kodları Flag sistemini Örnek-1‘deki gibi kontrol etmeye gerek kalmayacak şekilde yazmanızdır.
Konunun sonuna gelmiş bulunuyoruz eğer herhangi bir sorunuz varsa Hakkımda bölümünden veya aşağıya cevap yazarak bana ulaşabilirsiniz. Bir sonraki konuda görüşmek üzere.
Bir Sonraki Konu : –>
Assembly – Mantıksal Islemler If-Else
Bir Önceki Konu: <–
Assembly – Farklı Atama Yolları Mov ve ‘=’ Kullanımı