Transistörlerimizi oluşturduk, Logic Gate’leri tanıdık,
Sonra onları kullanarak 4 Bit’lik toplayıcı (ALU) yaptık,
Sonrasında VisUAL2’nin de desteği ile, ARM Assembly’e giriş yaptık.
Şimdi sırada, Assembly’i bir adım daha öteye taşımak var.
Önceki Assembly konusunda, Assembly dillerine giriş yapmış, temel öğelerden bahsetmiştik. Ben, Assembler olarak ARM’yi seçmiştim. Zira yeni trend ARM.
Önceki makalemi, kısaca bir başlığa değinerek bitirmiştim: Branch and Control
Bir başka yazının konusu olsun diye kısa kesmiştim ve bugün, o yazının vakti geldi.
ARM Assembly – Branch and Control
Python, C, Javascript gibi alıştığımız ve günlük hayatta sıklıkla kullandığımız dillerde, if
, else
, else if
ya da elif
gibi ifadeleri çokça görmüşsünüzdür, kullanmışsınızdır. Kabaca “Conditions and Statements” olarak ifade edilen bir durum, temelinde şu ilkeye dayanır. Çok detayına girmeden açıklamak gerekirse, bu kalıplar belirli koşullarda (conditions), belirli durumların (statements) ortaya çıkmasına sağlar. Koşullar genelde bir değişken olurken, durumlar ise bir kod parçası, fonksiyon ya da çıktı olur.
Programlamaya yeni başlayan ve daha fazla detaylara inmek isteyenler için, İngilizce bir makale: Statements
Önceki yazımda da bahsettiğim gibi, ARM alıştığımız dillerden farklı karakterlere sahiptir. Bu karakterlerden biri de, alıştığımız dillerde olan if
, else
, while
gibi operatörleri barındırmamasıdır. Bunun yerine, benzer işlevi görmesi için, farklı ama kolay bir yol kullanılır.
Programın çalışma süresi boyunca, genellikle atlamalar (branching) yaparak veya yalnızca bir koşul geçerli olduğunda, belirli bazı talimatlar uygulayarak programın akışını kontrol etmek, için koşulları (conditions) kullanırız. Koşul, CPSR (Current Program Status Register) yazmacındaki (register) belirli bir Bit’in durumu olarak tanımlanır. Bu Bit’ler, bazı talimatların sonucuna göre zaman zaman değişir.
Örneğin, iki sayıyı karşılaştırdığımızda ve bunların eşit olduğu ortaya çıktığında, Sıfır bitini (Z = 1) tetikleriz, çünkü işlemcinin içinde şunlar gerçekleşir: a - b = 0
. Bu durumda, EQual koşulumuz sağlanmış olur. İlk sayı daha büyük olsaydı, Büyüktür koşuluna sahip olurduk, tersi durumda ise Küçüktür koşuluna. Ve bunların dışında, bir sürü koşul vardır.
Aşağıdaki tablo, mevcut koşul (condition) kodlarını, anlamlarını ve test edilen durumları gösteriyor:
Koşul (Condition) kodu | Anlamı | Kontrol durumu |
---|---|---|
EQ | Equal | Z==1 |
NE | Not Equal | Z==0 |
GT | Signed Greater Than | (Z==0) && (N==V) |
LT | Signed Less Than | N!=V |
GE | Signed Greater Than or Equal | N==V |
LE | Signed Less Than or Equal | (Z==1) || (N!=V) |
CS or HS | Unsigned Higher or Same (or Carry Set) | C==1 |
CC or LO | Unsigned Lower (or Carry Clear) | C==0 |
MI | Negative (or Minus) | N==1 |
PL | Positive (or Plus) | N==0 |
AL | Always executed | – |
NV | Never executed | – |
VS | Signed Overflow | V==1 |
VC | No signed Overflow | V==0 |
HI | Unsigned Higher | (C==1) && (Z==0) |
LS | Unsigned Lower or same | (C==0) || (Z==0) |
Bunlara ek olarak, CPSR (Current Program Status Register) tablosuna da ihtiyacımız olacak. Bu registerlar, programdaki mevcut koşulu kaydetmeyi yarar:
Değer | Açıklaması |
---|---|
N (Negative) |
Talimatın sonucu negatif bir sayı verirse etkindir. |
Z (Zero) |
Enabled if result of the instruction yields a zero value. |
C (Carry) |
Talimatın sonucu sıfır değeri verirse etkindir. |
V (Overflow) |
Komutun sonucu, 32 bit ikinin tümleyeni ile temsil edilemeyen bir değer verirse etkinleştirilir. |
E (Endian-bit) |
ARM, küçük endian veya büyük endian’da çalışabilir. Bu bit, küçük endian için 0’a veya büyük endian modu için 1’e ayarlanır. |
T (Thumb-bit) |
Bu bit, Tumb State geçerliyse ayarlanır ve ARM State etkinken devre dışı bırakılır. |
M (Mode-bits) |
Bu bitler, geçerli ayrıcalık modunu (USR, SVC, vb.) belirtir. |
J (Jazelle) |
Bazı ARM işlemcilerin donanımda Java bayt kodu yürütmesine izin veren üçüncü yürütme durumu. |
Şimdi ise gelin, örnek bir kod yazalım:
mov r0, #2
cmp r0, #3
addlt r0, r0, #1
cmp r0, #3
addlt r0, r0, #1
Ve satır satır anlamaya çalışalım:
Bu yaptığımız aslında, alıştığımız dillerdeki for
döngüsünün içinde, if
ve else
kullanmaktan farksız bir durum. Aslında aradaki farkın temeli de burada anlaşılıyor.
Condition kodlarını ve CPSR registerlarını kullanarak, farklı durumlara göre programımızın yol almasını sağlayabiliriz. Bunu kısaca bir tabloyla gösterelim: (Ben çizdim ancak çok temel bir tablodur, internette benzerlerini hatta daha detaylılarını bulabilirsiniz)
Böylece if
veya for
/ while
operatörlerinin işlevlerini, Assembly’de yerine getirebiliriz.for
ve while
detayına fazla girmek istemedim, zira kafanızın fazla karışmasını istemedim. Bu yazıdaki temel amacım, öncesinden eksik kalan noktayı tamamlamaktı.
Okuduğunuz için teşekkür ederim.
İbrahim Özdemir, Ocak 2021