Assembly – Mantıksal İşlemler If-Else

Öncelikle, eğer okumadıysanız bir önceki konu olan Assembly – Mantıksal İşlemler – ADDEQ, SUBGT  isimli konuyu okumanızı tavsiye ederim.
Tüm konulara ise Assembly Kodlama linkinden ulaşabilirsiniz.


Bu konuda Mantıksal İşlemlerin yapı taşı olan If-else kullanımı, CMP, BEQ, B ve BGT gibi komutları kullanarak örneklerle beraber detaylıca inceleyeceğiz.

CMP Nedir?
Daha önceden CMP komutundan bahsetmiştik ancak yeni gelenler için küçük bir hatırlatma yapalım.

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

BEQ – BGT – BLT -BGE – BLE – B Nedir?

  • BEQ –> Branch Equal kelimesinden gelir. B burada ana komut olmakla beraber EQ,GT ve LT bu komuta gelen suffixlerdir. Eğer compare sonucundaki karşılaştırma eşit ise bu komut gerçekleştirilir. Sytanx‘ı aşağıdaki gibidir ve C’deki fonksiyonlar konusu ile benzerlik gösterir.

BEQ BranchName
BranchName
Eğer Compare sonucu Equal ise BranchName adlı yere gider. .

  • BGT –> Branch Greater Than kelimesinden gelir. Eğer compare sonucundaki ilk sayı diğer sayıdan daha büyükse bu komut gerçekleştirilir.
  • BLT –> Branch Less Than kelimesinden gelir. Eğer compare sonucundaki ilk sayı diğer sayıdan daha küçükse bu komut gerçekleştirilir.
  • BLE-> Branch Less Than or Equal kelimesinden gelir. Eğer compare sonucundaki ilk sayı diğer sayıdan küçük veya eşitse gerçekleşir.
  • BGE –> Branch Greater Than or Equal kelimesinden gelir. Eğer compare sonucundaki ilk sayı diğer sayıdan daha büyük ve eşitse bu komut gerçekleşir.
  • B –> Branch kelimesinden gelir. İf-Else kısmında else kısmı olarak rol alır.


Örnek -1 : Sadece İf
– Bu örnekte r3 ile r2 değerini karşılaştırıyor. Eğer r3 r2‘den daha az veya eşitse Branch1 adlı yere atlıyor. Eğer eşit değilse kod komutları normal sırasına göre devam ettireceğinden dolayı Add işlemini gerçekleştiriyor.

		MOV		r1,#5 ;r1 = 5
		MOV		r0,#2 ;r0 = 2
		MOV		r2,#8 ;r2 = 8
		
		ADD		r3,r0,r1 ;r3 = r0 + r1
		
		CMP		r3,r2 ; r3 ile r2 karşılaştırma
		
		BLE		Branch1 ; r3 <= r2 ise Branch1'e git.
		
		ADD		r0,r0,r1 ;Değilse koda devam et. r0 = r0 + r1	
Branch1

Aşağıdaki resimde Branch kısmına dikkat. Kodu VisUAL‘da deneyerek adım adım görebilir ve Branch mantığını tamamen kavrayabilirsiniz.

Assembly Branch İle if Örneği


Örnek -2 : İf – Else
– Bu örnek bir öncekinden biraz daha karmaşık ama tam olarak if-else kullanımı içeriyor. İki sayımız var num1 ve num2 ve bunlar r0 ve r1‘e yükleniyorlar. Eğer r0>r1 ise _then adlı kısıma gidiyor ve oradaki kodu gerçekleştiriyor, ama _else kısmına girmemesi için bir _end kısmı koyuyoruz ki _else kısmını atlayabilsin. Eğer r0>r1 doğru değil ise _else kısmına gidiyor ve işlemi gerçekleştiriyor.

num1		DCD		5
num2		DCD		10
		
		LDR		r0,=num1 ;num1 sayısının adresi
		LDR		r0,[r0]  ; num1 sayısının değerini r0'daki adresten al
		LDR		r1,=num2  ;num2 sayısının adresi
		LDR		r1,[r1]  ;num2 sayısının değerini r1'deki adresten al
		MOV		r2,#5 ; r2 = 5
		
		CMP		r0,r1 ; r0 ile r1'i karsılastır
		
		BGT		_then ;eğer r0>r1 ise _then'e git.
		B		_else ;eğer degilse _else'ye git.
		
_then
		ADD		r1,r1,r2 ; _then'e geldiği icin r1 = r1 + r2
		B		_end ;finish ; kodu bitir _end'e git.
_else
		ADD		r0,r0,r2 ; _else'ye geldiği icin r0 = r0 +2
_end ;bitirme noktası

Kodun VisUAL‘da çalıştırarak Branch’lardaki yani _else _than gibi yerlerlerdeki atlamaları görerek daha iyi anlayabilir ve daha farklı komutları deneyebilirsiniz.

Assembly İf-Else Kodu


Not : Bu kodlardaki en önemli kısım Assembly dilinde komutların ne olursa olsun aşağı doğru giden sırayla Execute edileceği yani işleme sokulacağıdır. Biz ise Branchlar kullanarak bu sıranın farklı yerlere atlamasını kontrol ederek, kod içerisinde if,else gibi mantıksal işlemleri oluşturabiliyoruz.

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 – For/While Döngüsü

Bir Önceki Konu:  <–
Assembly – Mantıksal İşlemler – ADDEQ, SUBGT 

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