Mega Code Archive

 
Categories / Delphi / Strings
 

Delphi ile assembly dersleri 4

Dallanma Komutları Assembly'de de diğer programlama dillerinde olduğu gibi programın icrası bir noktadan başka bir noktaya transfer edilebilir. İcra transferi bir karşılaştırma işleminin sonucuna göre (Koşullu dallanma [JZ,JE,...]) veya herhangi bir karşılaştırma yapmadan (koşulsuz dallanma [JMP])yapılabilir. Koşulsuz dallanma komutunun genel olarak kullanım amacı: Assembly dili delphi, c,.... gibi yapısal bir programlama dili değildir. Program ilk satırdan itibaren çalışmaya başlar.(Aynen gwbasic dilinde olduğu gibi) Diyelimki bir şarta göre istediğiniz komutların çalışmasını sağladınız. Çalışmasını istediğiniz kısım çalıştı; fakat çalışmasını istediğiniz program parçası çalışmasını bitirmez!!! Bir sonraki komuttan itibaren çalışmaya devam eder. Unutmayın, bir sonraki komut çalışmasını istemediğiniz bir komut olabilir. Bu gibi durumlarda çalışmasını istediğiniz kısım çalıştıktan sonra koşulsuz dallanma komutu yardımıyla çalışmasını istemediğimiz komutlar atlanır. Aşağıdaki örnek programda eğer iki sayı eşitse programın akışı toplama etiketine yönlendirilmektedir. Toplama etiketinin altında bulunan komutlar çalıştıktan sonra, carp, cikar gibi etiketlerin altlarında bulunan komutların çalışmaması için toplama işlemi yapıldıktan sonra programın akışı son etiketine aktarılmaktadır. Böylece carp ve cikar etiketlerinin altlarında bulunan komutlar çalışmayacaktır. Aşağıdaki program girilen iki sayının büyüklüklerini karşılaştırmakta ve karşılaştırma sonuçlarına göre sayılar üzerinde işlem yapmaktadır. (Eşitse toplama, sayı1 sayı2'den büyükse çarpma, sayı1 sayı2'den küçükse çıkarma işlemi yapılacaktır.) procedure TForm1.Button1Click(Sender: TObject); var sayi1,sayi2,sonuc:integer; begin sayi1:=strtoint(edit1.text); sayi2:=strtoint(edit2.text); asm mov eax,sayi1 mov ebx,sayi2 cmp eax,ebx {eax 1. operand ebx 2. operand} jz @@topla {eşitlerse toplama işlemine git} ja @@carp {eax ebx değerinden büyükse carpma işlemine git} jb @@cikar {ebx eax değerinden büyükse cikar işlemine git} @@topla: add eax,ebx jmp @@son {Toplama işlemi bitince sona git} @@carp: mul ebx jmp @@son {Çarpma işlemi bitince sona git} @@cikar: sub eax,ebx jmp @@son {Çıkarma işlemi bitince sona git [Aslında son işlem için JMP gerekmez]} @@son: {program akışı bu noktaya yönlendiriliyor} mov sonuc,eax end; showmessage('Sonuç: '+inttostr(sonuc)); end; Dikkat ettiyseniz dallanma komutları J (Jump-Zıpla)harfiyle başlıyor. Koşulsuz dallanma komutumuz JMP. Yazılımı: JMP adres (dallanılacak komutun adresi) Dallanılacak komutun adresini içeren bir bellek bölgesi ya da bir kaydedici operand olarak kullanılabilir. Kullanımına örnekler: Jmp [100] ->100 adresindeki komuta dallan Jmp [ebx] ->ebx kaydedicisinde bulunan bilginin adresine dallan. Jmp @toplama ->toplama ismindeki etiketin adresine dallan. Koşullu dallanma komutları: Bildiğiniz gibi if komutunda çeşitli şartlar belirtiriz. ( Eşitse =, büyükse >, küçükse <, eşit değilse <>, .....) Assembly dilinde ise karşılaştırma şartlarının herbiri birer komuttur. Örneğin iki sayı eşitse topla etiketine dallan diyelim. JZ @topla ->eğer iki sayı eşitse topla etiketine dallan.. Eveet, gördüğünüz gibi her şart için ayrı bir dallanma komutu var. Dallanma komutları oldukça fazla. Bundan dolayı bu komutları hatırlamanız zor olabilir :( Dallanma komutları karşılaştırma yapılan sayıların işaretli olup olmamasına göre de değişir. :( Operand1 ve Operand2 Operand1 ve Operand2 Araştırılan işaretsiz ise işaretli ise Koşul -------------------- -------------------- ------------------ JZ, JE JZ, JE Oprnd1 = Oprnd2 mi? JB, JC, JNAE JL, JNGE Oprnd1 < Oprnd2 mi? JA, JNBE JG, JNLE Oprnd1 > Oprnd2 mi? JBE, JNA JLE, JNG Oprnd1 <= Oprnd2 mi? JNB, JNC, JAE JGE, JNL Oprnd1 >= Oprnd2 mi? JNZ, JNE JNZ, JNE Oprnd1 <> Oprnd2 mi? Koşullu dallanma komutlarından önce genellikle CMP karşılaştırma komutu kullanılır. CMP komutu aslında karşılaştırılacak iki sayının birbirinden çıkarılmasını ve çıkarma işleminin sonucuna göre bayrak kaydedicisinin değerinin değişmesini sağlar. Dallanma komutları yardımıyla bayrak kaydedicisinin içinde bulunan bayrakların değerlerine göre programın akışı yönlendirilir. Örneğin JZ dallanma komutu zero-sıfır bayrağının 0 veya 1 olma durumuna göre işlem yapar. JZ komutunun icrası sırasında sıfır bayrağı set(1) durumunda ise verilen adrese dallanılır. Sıfır bayrağı reset(0) durumunda ise dallanma işlemi gerçekleşmez. Diğer dallanma komutları da bayrak kaydedicisinin içindeki çeşitli bayrakların durumunu kontrol ederek dallanma işlemini gerçekleştirirler.Dikkat!! Bayrakların durumunu değiştirebilecek tek komut CMP komutu değildir!!! Örnek: TEST komutu.... Koşulsuz dallanma komutunda(JMP) belleğin istenilen her noktasına dallanma yapılabilir. Koşullu dallanma komutlarında ise, dallanmanın sebep olacağı yer değişimi üzerinde belli bir sıralama vardır. Bu tür dallanma komutları ile geriye doğru maksimum 128, ileriye doğru maksimum 127 byte'lık mesafede bulunan adreslere dallanma yapılabilir. Muharrem YILDIZ kasimyildizi@yahoo.com, muharremyildizxxx@hotmail.com