Assembly – Mantıksal İşlemler – ADDEQ, SUBGT

Ö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.
Negative,Zero,Carry,Overflow Flagları

Ş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.
Cmp, Moveq , Movgt ve Movlt örneği


Ö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.

Flag Kullanımı ile Addeq örneği

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ı 

Yer işareti koy Kalıcı Bağlantı.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir