Kontrol Yapıları

Assambly dilinde Kontrol Yapılarını inceleyelim Assembly dilinde Kontrol işlemleri, birkaç döngü ve dallanma talimatıyla gerçekleştirilir. İncelemeye Koşullu atlama ve Koşulsuz atlama ile başlayalım sonrada Döngüler şeklinde devam edelim.

Koşulsuz Atlama

JMP talimatı ile gerçekleştirilir. Bir koşula bağlı olarak bir dizi atlama talimatı söz konusu değildir. Koşullu yürütme, genellikle o anda yürütülmekte olan talimatı takip etmeyen bir talimatın adresine bir kontrol aktarımını gerçekleştirir. Kontrolün devri ileri yönlü ve yeni bir talimatlar dizisini uygulamak için veya aynı adımları yeniden uygulamak için kullanılabilinir.

Koşullu Atlama

Koşullu atlama koşula bağlı olarak bir dizi atlama talimatı ( j ) ile gerçekleştirilir. Koşullu komutlar, sıralı akışı keserek kontrolü aktarır ve bunu (IP)' deki ofset değerini değiştirerek yaparlar.

Koşullu atlatmanın detayına inmeden önce CMP kavramın değinmemiz daha doğru olaçaktır

CMP

Cmp işlenen iki değeri karşılaştırır. Genelde şartlı durumlar için kullanılır. Bu komut temelde işlenenlerin eşit olup olmadığını karşılaştırmak için bir işleneni diğerinden çıkarır ve karar verme durumunda koşullu atlama talimatıyla birlikte kullanılır. Hedef veya kaynaktan gelen değerde herhangi bir oynama söz konusu değildir.

CMP iki sayısal veri alanını karşılaştırmakla birlikte gelen veriler sabit veya anlık olması durumu değiştirmez ASM yazım şekli olarakta

( CMP hedef,kaynak )

yukarıdaki formatta karşımıza çıkmaktadır.




CMP genellikle bir sayaç değerinin bir döngünün çalıştırılması gereken sayıya ulaşıp ulaşmadığını karşılaştırmak için kullanılabilir. Burada JE komutu zero flag aktif ise atlama işlemini gerçekleştiriyor.




Koşulsuz Atlama

Yukarıda bahsettiğim gibi, bu JMP talimatı ile gerçekleştirilir. Koşullu işlem esnasında genellikle o anda işlem gören olan talimatı takip etmeyen bir talimatın adresine bir kontrol aktarımını barındırır. Kontrolün devri ileri, yeni bir talimatlar dizisini uygulamak için veya aynı adımları yeniden uygulamak için kullanılabilir olabilir.

JMP Kullanım Şekli ( JMP Label )





Koşullu Atlama
Koşullu atlamada belirtilen koşullar karşılanırsa akış belirtilen hedefe doğru aktarılır. Koşul ve verilere bağlı olarak çok sayıda koşullu atlama yöntemleri vardır.
Bunu yazılım dillerinde kullanılan ( if / elif / else ) koşullarına benzetebiliriz ; koşul ve durumlara göre nasıl yazıyorsak burada da aynı mantalite ancak assembly de koşullu atlama ikiye ayrılmaktadır. Aritmetik ve Mantıksal işlemler için farklı atlama talimatları kullanılmaktadır.

Aritmetik işlemlerde kullanılan atlama talimatları





Mantıksal işlemlerde kullanılan atlama talimatları




Aşağıda da koşullu atlamada kullanılan diğer talimatları görmekteyiz




Son olarak da Test edilen bayraklar daha doğrusu Kontrol Kayıtlarının kısaltmalarının açıklamalarına değinecek olursak

Overflow Flag (OF)*- İmzalı bir aritmetik işlemden sonra yüksek dereceli bir veri bitinin (en soldaki bit) taşmasını gösterir.
Direction Flag (DF) - Dizi verilerini hareket ettirmek veya karşılaştırmak için sol veya sağ yönü belirler. DF değeri 0 olduğunda, dizi işlemi soldan sağa ve değer 1 olarak ayarlandığında, dizi işlemi sağdan sola doğru olur.
Interrupt Flag (IF) - Klavye girişi vb. Gibi harici kesintilerin yok sayılacağını veya işleneceğini belirler. Değer 0 olduğunda harici kesmeyi devre dışı bırakır ve 1'e ayarlandığında kesmeleri etkinleştirir.
Trap Flag (TF) - İşlemcinin çalışmasını tek adımlı modda ayarlamaya izin verir. Kullandığımız DEBUG programı tuzak bayrağını ayarlar, böylece her seferinde bir komut yürütme aşamasına geçebiliriz.
Sign Flag (SF) - Bir aritmetik işlemin sonucunun işaretini gösterir. Bu bayrak, aritmetik işlemin ardından bir veri öğesinin işaretine göre ayarlanır. İşaret, en soldaki bitin yüksek sırasıyla gösterilir. Pozitif bir sonuç, SF'nin değerini 0'a temizler ve negatif sonuç onu 1'e ayarlar.

Zero Flag (ZF) - Bir aritmetik veya karşılaştırma işleminin sonucunu gösterir. Sıfır olmayan bir sonuç sıfır bayrağını 0 olarak temizler ve sıfır sonuç onu 1 olarak ayarlar.

Auxiliary Carry Flag (AF) - Bir aritmetik işlemin ardından bit 3'ten bit 4'e taşımayı içerir; özel aritmetik için kullanılır. AF, 1 baytlık bir aritmetik işlem, bit 3'ten bit 4'e taşınmaya neden olduğunda ayarlanır.

Parity Flag (PF) - Bir aritmetik işlemden elde edilen sonuçtaki toplam 1 bit sayısını gösterir. 1 bitlik çift sayı, eşlik bayrağını 0'a, tek sayıdaki 1 bitlik eşlik bayrağını 1'e ayarlar.

Carry Flag (CF) - Bir aritmetik işlemden sonra yüksek dereceli bir bitten (en soldaki) 0 veya 1'in taşınmasını içerir. Ayrıca, bir kaydırma veya döndürme işleminin son bitinin içeriğini de depolar.



Döngüler

JMP gibi kontrol talimatı döngüler için kullanılabilir. Örneğin, aşağıdaki kod parçacığı döngü gövdesini 6 kez çalıştırmak için kullanılabilir.



kontrol talimatları dışında oluşturabileceğimiz döngü talimatı LOOP dur. Kullanım şekli ise

LOOP label

şeklindedir bununla birlikte LOOP komutu, ECX kaydının döngü sayısını içerdiğini varsayar. Döngü başladığında, ECX kaydı bir bir azaltılır ve kontrol, ECX kayıt değeri, yani sayaç sıfır değerine ulaşıncaya kadar döngü devam eder.




yukarıdaki örnek kod betiğinde de görüleceği üzere döngünün 2 kere tekrarlanmasını istiyor.

Döngüler başlığının altında da gösterdiğim gibi LOOP ile olacak diye bir şart yok. Şimdi başka bir örneği inceleyelim basit bir ( while ) döngüsünün assembly karşılığını inceleyelim ve LOOP talimatını kullanmadan yapalım bunu





LOOP lu örneğimizde loop değeri eax daki veriden alıyordu ona göre döngü sayısını belirliyordu
yani elimizdeki hedef sayıdan mevcut sayı çıkarılıp EAX registerine atanıp döngü sayısı ona göre belirleniyordu

Yukarıdaki örnekte ise elimizdeki sayı ile hedefteki sayı eşit mi değil mi diye kontrol edilip ona göre döngünün devam edip etmeyeceği kararına varılıyor. Kontrol mekanizması ise CMP ile gerçekleştiriliyor. CMP nin mantığı bir değer diğerinden çıkarılıp Sıfıra eşit olma durumuna göre atlamalar gerçekleşiyor.

Kontrol Yapıları başlığı altında CMP konusuna değinmiştik daha iyi pekiştirmek adına konuyu tekrar inceleyebilirsiniz