Programlama yapalım ve Öğrenelim. - Delphi Eğitim231
  Ana Sayfa
  .NET Eğitim Notları
  Visual C# .NET Örnek Kodları
  VisualBasic.NET Örnek Kodları
  J# Örnekleri
  ASP.NET Örnek Kodları
  Delphi Eğitim
  => Delphi Eğitim1
  => Delphi Eğitim2
  => Delphi Eğitim3
  => Delphi Eğitim4
  => Delphi Eğitim5
  => Delphi Eğitim6
  => Delphi Eğitim7
  => Delphi Eğitim8
  => Delphi Eğitim9
  => Delphi Eğitim10
  => Delphi Eğitim11
  => Delphi Eğitim13
  => Delphi Eğitim14
  => Delphi Eğitim15
  => Delphi Eğitim16
  => Delphi Eğitim17
  => Delphi Eğitim18
  => Delphi Eğitim19
  => Delphi Eğitim20
  => Delphi Eğitim21
  => Delphi Eğitim22
  => Delphi Eğitim23
  => Delphi Eğitim24
  => Delphi Eğitim25
  => Delphi Eğitim26
  => Delphi Eğitim27
  => Delphi Eğitim28
  => Delphi Eğitim29
  => Delphi Eğitim30
  => Delphi Eğtim31
  => Delphi Eğitim32
  => Delphi Eğitim33
  => Delphi Eğitim34
  => Delphi Eğitim35
  => Delphi Eğitim36
  => Delphi Eğitim37
  => Delphi Eğitim38
  => Delphi Eğitim39
  => Delphi Eğitim40
  => Delphi Eğitim41
  => Delphi Eğitim42
  => Delphi Eğitim43
  => Delphi Eğitim44
  => Delphi Eğitim45
  => Delphi Eğitim46
  => Delphi Eğitim47
  => Delphi Eğitim48
  => Delphi Eğitim49
  => Delphi Eğitim50
  => Delphi Eğitim51
  => Delphi Eğitim52
  => Delphi Eğitim53
  => Delphi Eğitim54
  => Delphi Eğitim55
  => Delphi Eğitim56
  => Delphi Eğitim57
  => Delphi Eğitim58
  => Delphi Eğitim59
  => Delphi Eğitim60
  => Delphi Eğitim61
  => Delphi Eğitim62
  => Delphi Eğitim63
  => Delphi Eğitim64
  => Delphi Eğitim65
  => Delphi Eğitim66
  => Delphi Eğitim67
  => Delphi Eğitim68
  => Delphi Eğitim69
  => Delphi Eğitim70
  => Delphi Eğitim71
  => Delphi Eğitim72
  => Delphi Eğitim73
  => Delphi Eğitim74
  => Delphi Eğitim75
  => Delphi Eğitim76
  => Delphi Eğitim77
  => Delphi Eğitim78
  => Delphi Eğitim79
  => Delphi Eğitim80
  => Delphi Eğitim81
  => Delphi Eğitim82
  => Delphi Eğitim83
  => Delphi Eğitim84
  => Delphi Eğitim85
  => Delphi Eğitim86
  => Delphi Eğitim87
  => Delphi Eğitim88
  => Delphi Eğitim89
  => Delphi Eğitim90
  => Delphi Eğitim91
  => Delphi Eğitim92
  => Delphi Eğitim93
  => Delphi Eğitim94
  => Delphi Eğitim95
  => Delphi Eğitim96
  => Delphi Eğitim97
  => Delphi Eğitim98
  => Delphi Eğitim99
  => Delphi Eğitim100
  => Delphi Eğitim101
  => Delphi Eğitim102
  => Delphi Eğitim103
  => Delphi Eğitim104
  => Delphi Eğitim105
  => Delphi Eğitim106
  => Delphi Eğitim107
  => Delphi Eğitim108
  => Delphi Eğitim109
  => Delphi Eğitim110
  => Delphi Eğitim111
  => Delphi Eğitim112
  => Delphi Eğitim113
  => Delphi Eğitim114
  => Delphi Eğitim115
  => Delphi Eğitim116
  => Delphi Eğitim117
  => Delphi Eğitim118
  => Delphi Eğitim119
  => Delphi Eğitim120
  => Delphi Eğitim121
  => Delphi Eğitim122
  => Delphi Eğitim123
  => Delphi Eğitim124
  => Delphi Eğitim125
  => Delphi Eğitim126
  => Delphi Eğitim127
  => Delphi Eğitim128
  => Delphi Eğitim129
  => Delphi Eğitim130
  => Delphi Eğitim131
  => Delphi Eğitim132
  => Delphi Eğitim133
  => Delphi Eğitim134
  => Delphi Eğitim135
  => Delphi Eğitim136
  => Delphi Eğitim137
  => Delphi Eğitim138
  => Delphi Eğitim139
  => Delphi Eğitim140
  => Delphi Eğitim141
  => Delphi Eğitim142
  => Delphi Eğitim143
  => Delphi Eğitim144
  => Delphi Eğitim145
  => Delphi Eğitim146
  => Delphi eğitim147
  => Delphi Eğitim148
  => Delphi Eğitim149
  => Delphi Eğitim150
  => Delphi Eğitim151
  => Delphi Eğitim152
  => Delphi Eğitim153
  => Delphi Eğitim154
  => Delphi Eğitim155
  => Delphi Eğitim156
  => Delphi Eğitim157
  => Delphi Eğitim158
  => Delphi Eğitim159
  => Delphi Eğitim160
  => Delphi Eğitim161
  => Delphi Eğitim162
  => Delphi Eğitim164
  => Delphi Eğitim165
  => Delphi Eğitim166
  => Delphi Eğitim167
  => Delphi Eğitim168
  => Delphi Eğitim169
  => Delphi Eğitim170
  => Delphi Eğitim171
  => Delphi Eğitim172
  => Delphi Eğitim173
  => Delphi Eğitim174
  => Delphi Eğitim175
  => Delphi Eğitim176
  => Delphi Eğitim177
  => Delphi Eğitim178
  => Delphi Eğitim179
  => Delphi Eğitim180
  => Delphi Eğitim181
  => Delphi Eğitim182
  => Delphi Eğitim183
  => Delphi Eğitim184
  => Delphi Eğitim185
  => Delphi Eğitim186
  => Delphi Eğitim187
  => Delphi Eğitim188
  => Delphi Eğitim189
  => Delphi Eğitim190
  => Delphi Eğitim191
  => Delphi Eğitim192
  => Delphi Eğitim193
  => Delphi Eğitim194
  => Delphi Eğitim195
  => Delphi Eğitim196
  => Delphi Eğitim197
  => Delphi Eğitim198
  => Delphi Eğitim199
  => Delphi Eğitim200
  => Delphi Eğitim201
  => Delphi Eğitim202
  => Delphi Eğitim203
  => Delphi Eğitim204
  => Delphi Eğitim205
  => Delphi Eğitim206
  => Delphi Eğitim207
  => Delphi Eğitim208
  => Delphi Eğitim209
  => Delphi Eğitim210
  => Delphi Eğitim211
  => Delphi Eğitim212
  => Delphi Eğitim213
  => Delphi Eğitim214
  => Delphi Eğitim215
  => Delphi Eğitim216
  => Delphi Eğitim217
  => Delphi Eğitim218
  => Delphi Eğitim219
  => Delphi Eğitim220
  => Delphi Eğitim221
  => Delphi Eğitim222
  => Delphi Eğitim223
  => Delphi Eğitim224
  => Delphi Eğitim225
  => Delphi Eğitim226
  => Delphi Eğitim227
  => Delphi Eğitim228
  => Delphi Eğitim229
  => Delphi Eğitim230
  => Delphi Eğitim231
  => Delphi Eğitim232
  => Delphi Eğitim233
  => Delphi Eğitim234
  => Delphi Eğitim235
  => Delphi Eğitim236
  => Delphi Eğitim237
  => Delphi Eğitim238
  => Delphi Eğitim239
  => Delphi Eğitim240
  => Delphi Eğitim241
  => Delphi Eğitim242
  İletişim

 

Currency değerlerin tamsayı aritmetiği kullanılarak yuvarlanması

Aşağıdaki fonksiyon verilen ondalık hanesi kadar girilen currency değeri yuvarlar.

 

Explain:

The datatype Currency is a fixed point format and consumes 8 bytes in memory.

Instead of converting currency to Extended (and back) this function use

only (64bit-) integer arithmetics.

 

examples:

RoundCurrency(1.2520, 1)  => 1.3

RoundCurrency(-99.5, 0)  => -100

RoundCurrency(-99.4999, 0)  => -99

 

function RoundCurrency(const Value:Currency; const nk:Integer):Currency;

const

   faktors : array[-3..3] of Integer = (

      10000000, 1000000, 100000, 10000, 1000, 100, 10);

var

   x : Int64;

   y : Int64;

begin

   // Currency has only 4 digits after the decimalseparator

   if (nk>=4) or (Value=0) then

   begin

      Result := Value;

      Exit;

   end;

   if nk < Low(faktors) then

      raise EInvalidArgument.CreateFmt('RoundCurrency(,%d): invalid arg', [nk]);

 

 

   // cast Currency to Int64

   x := PInt64(@Value)^;

   y := faktors[nk];

 

   // rounding

   if x > 0 then

      x := ((x+(y div 2)) div y)*y

   else

      x := ((x-(y div 2)) div y)*y;

 

   // cast Int64 to Currency

   Result := PCurrency(@x)^;

end;

 

Delphi - .....................................

 

Currency değerlerin tamsayı aritmetiği kullanılarak yuvarlanması

Aşağıdaki fonksiyon verilen ondalık hanesi kadar girilen currency değeri yuvarlar.

 

Explain:

The datatype Currency is a fixed point format and consumes 8 bytes in memory.

Instead of converting currency to Extended (and back) this function use

only (64bit-) integer arithmetics.

 

examples:

RoundCurrency(1.2520, 1)  => 1.3

RoundCurrency(-99.5, 0)  => -100

RoundCurrency(-99.4999, 0)  => -99

 

function RoundCurrency(const Value:Currency; const nk:Integer):Currency;

const

   faktors : array[-3..3] of Integer = (

      10000000, 1000000, 100000, 10000, 1000, 100, 10);

var

   x : Int64;

   y : Int64;

begin

   // Currency has only 4 digits after the decimalseparator

   if (nk>=4) or (Value=0) then

   begin

      Result := Value;

      Exit;

   end;

   if nk < Low(faktors) then

      raise EInvalidArgument.CreateFmt('RoundCurrency(,%d): invalid arg', [nk]);

 

 

   // cast Currency to Int64

   x := PInt64(@Value)^;

   y := faktors[nk];

 

   // rounding

   if x > 0 then

      x := ((x+(y div 2)) div y)*y

   else

      x := ((x-(y div 2)) div y)*y;

 

   // cast Int64 to Currency

   Result := PCurrency(@x)^;

end;

 

Delphi - .....................................

 

Delphi ile Assembly dersleri 5

ASSEMBLY İLE DÖNGÜ KOMUTLARI ve ALT PROGRAMLAR

DÖNGÜ KOMUTU (Loop)

 

Assembly dilinde de istenilen komutların istenilen sayıda tekrar edilmesi sağlanabilir. Bu tekrarlama işlemini isterseniz dallanma komutlarıyla da yapabilirsiniz. Ancak döngü komutuyla basit bir şekilde döngü oluşturuluyor.

 Loop komutuyla istenilen adresten itibaren, loop komutuna kadar olan, aradaki komutların tekrar etmesi sağlanır.

 Tekrar sayısını cx veya ecx kaydedicisinin değerini değiştirerek belirleyebilirsiniz.Diyelimki cx kaydedicisine 4 verdiniz. Döngü her çalıştığında cx kaydedicisinin değeri 1 azalacaktır. Cx kaydedicisinin değeri 0 olana kadar, belirtilen işlemler tekrar eder.

Örnek:

      mov cx,4

      @baslangic:  //döngünün başlangıcı

        tekar edecek komutlar  //Bu komutlar tekrar edecek

        .....................

        .....................

      Loop @baslangic  //döngü sonu

 

Örnek program: İstenen sayıdan saymaya başlayıp(istenilen artım sayısıyla [Üçer üçer, beşer beşer, .....]) , sayıları toplayan program.

 

procedure TForm1.Button1Click(Sender: TObject);

  var

  basdeger,sonuc,artim:integer;

  tekrarsayisi:integer;

begin

  tekrarsayisi:=strtoint(edit1.text);//Bu işlem kaçkez tekrarlanacak?

  basdeger:=strtoint(edit2.text); //Hangi sayıdan itibaren sayma işlemine başlanacak?

  artim:=strtoint(edit3.text);//Her tekrar işleminde sayı ne kadar artacak?

  asm

   mov ecx,tekrarsayisi  {tekrar sayısı ecx değişkenine aktarılıyor [zorunlu]}

   mov eax,0 {başlangıç değeri}

   mov ebx,0

   @@dongu:   {@@dongu etiketiyle loop komutu arasındaki komutlar tekrar edecekler}

    inc ebx

    add eax,ebx {Her seferinde artim değişkeninin değeri kadar eax kaydedicisinin değeri artacak}

   loop @@dongu

   mov sonuc,eax {eax kaydedicisinin değeri sonuc değişkenine aktarılıyor}

  end;

 showmessage('Sonuç:'+inttostr(sonuc));

end;

 

Dikkat!!! Eğer döngü içindeki bir işlem cx veya ecx kaydedicisinin değerini değiştirirse döngünün tekrar sayısıda değişecektir. Örneğin döngü içinde cx veya ecx kaydedicisine sabit bir değer verirseniz(0 dışında) sonsuz döngü oluşacaktır.Bunun yerine şarta bağlı olarak sabit değer verebilirsiniz.

 

Örnek program: Girilen sayının faktöriyelini bulan program nteger 32 birlik olduğu için çok büyük sayılar girilmemelidir.)

   Faktöriyel:   4! (dört faktöriyel)  -> 1*2*3*4

                 5! (beş faktöriyel)   -> 1*2*3*4*5

                 6! (altı faktöriyel)  -> 1*2*3*4*5*6

 

Program:

procedure TForm1.Button1Click(Sender: TObject);

  var

  faktor,sonuc:integer;

begin

  faktor:=strtoint(edit1.text);

   asm

    mov ecx,faktor

    mov eax,1  //eax e başlangıç değeri olarak 1 veriliyor

    mov ebx,1  //ebx e başlangıç değeri olarak 1 veriliyor

    @@dongu:

      mul ebx  //eax ve ebx çarpılıyor , sonuç eax e aktarılıyor..

      inc ebx  // ebx in değeri 1 arttırılıyor..

    loop @@dongu

    mov sonuc,eax

  end;

showmessage('Sonuç:'+inttostr(sonuc));

   end;

 

Çeşitli döngü komutları: Kullanımları Loop komutuyla aynı

Loopz komutu(Loope ile aynı):

      Bu döngü komutuyla, cx veya ecx kaydedicisinin değeri 0 olana kadar veya zero bayrağının değeri 0 olana kadar döngü devam edecektir. Bu şartlardan biri veya her ikiside gerçekleştiği anda döngüden çıkılacaktır.

Loopnz komutu(Loopne ile aynı):

      Bu döngü komutuyla cx veya ecx'in değeri 0 olana kadar veya zero flağı set(1) edilene kadar ya da her iki şart birlikte gerçekleşene kadar döngü kurulmuş olur.

 

ALT PROGRAMLAR: Assembly ile de alt programlar oluşturup daha sonra istediğiniz yerden bu alt programı çağırabilirsiniz. Yapmanız gereken ana programın üst kısmında alt programlarınızı yazmanız. Alt programı ana programın üstünde yazmak zorunda değilsiniz. Ancak ana programın üstünde tanımlamanız daha kullanışlı. Neden? Çünkü Assembly yapısal bir programlama dili değil. İlk satırdan itibaren çalışmaya başlıyor. Eğer programın akışını yönlendirmezseniz, siz istesenizde istemesenizde alt program en az bir kez çalışacaktır. Bunu kolay bir şekilde engelleyebiliriz. Diyelimki birsürü alt programınız var. Üst tarafa alt programları yazdınız. Alt tarafta ana program bloğu var. Alt programların sizin komtrolünüz dışında çalışmasını istemiyorsunuz. O zaman programın en başına koşulsuz dallanma komutunu koyuyor ve programın akışını ana programın başladığı yere aktarıyoruz. Böylece alt programlar bizim isteğimiz dışında çalışmıyor. İsterseniz bu yapıyı kullanmayabilirsiniz. Ancak o zaman birsürü koşullu ya da koşulsuz dallanma komutu kullanmanız gerekecektir.

       Diyeceksiniz ki "Alt programa ne hacet, ben aynı işi dallanma komutlarıyla da yapabilirim.". Evet ama dallanma komutuyla programın akışını değiştirdiniz. İstediğiniz program parçası çalıştı, peki ama program akışı kaldığı yerden nasıl devam edecek?

İşte alt programlar sayesinde program akışı, alt program çalışmasını bitirdikten sonra kaldığı yerden devam ediyor.

 

Alt programlarda Call ve Ret komutları kullanılır. Call komutuyla önceden oluşturulan alt program çağrılır. Ret komutuysa alt programın sonunda bulunur ve alt programın bittiğini gösterir. İşlemci ret komutunu gördüğünde Call komutunun altındaki satırdan itibaren çalışmaya devam eder. Dikkat!! Call komutundan önce ret komutu kullanılamazzzz. Hata oluşur!! İlkönce call, sonra ret....

        Komutların kullanımı: Call adres --> adres dallanılacak alt programın adresidir.

        Ret komutuysa alt programın sonunda bulunur.

 

Çalışan alt programı sonlandırmanın iki yöntemi vardır. 1 Ret komutuyla 2 Retf komutuyla

   Eğer alt programla, alt programın çağrıldığı kısım(Call komutu) aynı bellek bölgesindeyse(segment) Ret, aynı bellek bölgesinde değilse(birbirlerine uzaksalar) Retf komutu kullanılır.

 

Örnek program: Girilen sayının istenilen kuvvetini hesaplayan program.

 

procedure TForm1.Button1Click(Sender: TObject);

  var

  sayi,kuvvet,sonuc:integer;

begin

  sayi:=strtoint(edit1.text);

  kuvveti:=strtoint(edit2.text);

   asm

     mov ebx,sayi

     mov ecx,kuvveti

     mov eax,1  //çarpmanın etkisiz elemanı...:)

     jmp @dongu  //alt program çalışmadan ana program kısmına dallanılıyor.

    

      @altprogram: //alt program başlangıcı

        mul ebx

       ret //alt programın çalışması bitiyor

    

     @dongu: //dikkat ettiyseniz döngü içinde istediğiniz kadar alt programı tekrar tekrar çağırabiliyorsunuz...

         call @altprogram //alt program çağrılıyor

      loop @dongu

     

     mov sonuc,eax

   end;

  showmessage('Sonuç:'+inttostr(sonuc));

  end;

 

İleride göreceğimiz dersler: Döndürme komutları, string komutları(belki), kesmeler(interrupt)...Assembly çok basitmiş değil mi? Ben 1-2 ay içinde kendi kendime öğrendim. Size de öğretmek istedim :)

 Zaten programlama mantığını bir kere öğrendikten sonra programlama dillerini öğrenmeniz çok kolay oluyor. Öğrenmeniz gereken sadece hangi işlemi hangi komutla yapacağınız.

Delphi ile ilgili örnek pek olmadığı halde, deneme-yanılma yöntemiyle de pekçok şey bulunabiliyor...

Muharrem YILDIZ

kasimyildizi@yahoo.com, muharremyildizxxx@hotmail.com

 

Delphi - .....................................

 

Delphi ile Assembly dersleri 5

ASSEMBLY İLE DÖNGÜ KOMUTLARI ve ALT PROGRAMLAR

DÖNGÜ KOMUTU (Loop)

 

Assembly dilinde de istenilen komutların istenilen sayıda tekrar edilmesi sağlanabilir. Bu tekrarlama işlemini isterseniz dallanma komutlarıyla da yapabilirsiniz. Ancak döngü komutuyla basit bir şekilde döngü oluşturuluyor.

 Loop komutuyla istenilen adresten itibaren, loop komutuna kadar olan, aradaki komutların tekrar etmesi sağlanır.

 Tekrar sayısını cx veya ecx kaydedicisinin değerini değiştirerek belirleyebilirsiniz.Diyelimki cx kaydedicisine 4 verdiniz. Döngü her çalıştığında cx kaydedicisinin değeri 1 azalacaktır. Cx kaydedicisinin değeri 0 olana kadar, belirtilen işlemler tekrar eder.

Örnek:

      mov cx,4

      @baslangic:  //döngünün başlangıcı

        tekar edecek komutlar  //Bu komutlar tekrar edecek

        .....................

        .....................

      Loop @baslangic  //döngü sonu

 

Örnek program: İstenen sayıdan saymaya başlayıp(istenilen artım sayısıyla [Üçer üçer, beşer beşer, .....]) , sayıları toplayan program.

 

procedure TForm1.Button1Click(Sender: TObject);

  var

  basdeger,sonuc,artim:integer;

  tekrarsayisi:integer;

begin

  tekrarsayisi:=strtoint(edit1.text);//Bu işlem kaçkez tekrarlanacak?

  basdeger:=strtoint(edit2.text); //Hangi sayıdan itibaren sayma işlemine başlanacak?

  artim:=strtoint(edit3.text);//Her tekrar işleminde sayı ne kadar artacak?

  asm

   mov ecx,tekrarsayisi  {tekrar sayısı ecx değişkenine aktarılıyor [zorunlu]}

   mov eax,0 {başlangıç değeri}

   mov ebx,0

   @@dongu:   {@@dongu etiketiyle loop komutu arasındaki komutlar tekrar edecekler}

    inc ebx

    add eax,ebx {Her seferinde artim değişkeninin değeri kadar eax kaydedicisinin değeri artacak}

   loop @@dongu

   mov sonuc,eax {eax kaydedicisinin değeri sonuc değişkenine aktarılıyor}

  end;

 showmessage('Sonuç:'+inttostr(sonuc));

end;

 

Dikkat!!! Eğer döngü içindeki bir işlem cx veya ecx kaydedicisinin değerini değiştirirse döngünün tekrar sayısıda değişecektir. Örneğin döngü içinde cx veya ecx kaydedicisine sabit bir değer verirseniz(0 dışında) sonsuz döngü oluşacaktır.Bunun yerine şarta bağlı olarak sabit değer verebilirsiniz.

 

Örnek program: Girilen sayının faktöriyelini bulan program nteger 32 birlik olduğu için çok büyük sayılar girilmemelidir.)

   Faktöriyel:   4! (dört faktöriyel)  -> 1*2*3*4

                 5! (beş faktöriyel)   -> 1*2*3*4*5

                 6! (altı faktöriyel)  -> 1*2*3*4*5*6

 

Program:

procedure TForm1.Button1Click(Sender: TObject);

  var

  faktor,sonuc:integer;

begin

  faktor:=strtoint(edit1.text);

   asm

    mov ecx,faktor

    mov eax,1  //eax e başlangıç değeri olarak 1 veriliyor

    mov ebx,1  //ebx e başlangıç değeri olarak 1 veriliyor

    @@dongu:

      mul ebx  //eax ve ebx çarpılıyor , sonuç eax e aktarılıyor..

      inc ebx  // ebx in değeri 1 arttırılıyor..

    loop @@dongu

    mov sonuc,eax

  end;

showmessage('Sonuç:'+inttostr(sonuc));

   end;

 

Çeşitli döngü komutları: Kullanımları Loop komutuyla aynı

Loopz komutu(Loope ile aynı):

      Bu döngü komutuyla, cx veya ecx kaydedicisinin değeri 0 olana kadar veya zero bayrağının değeri 0 olana kadar döngü devam edecektir. Bu şartlardan biri veya her ikiside gerçekleştiği anda döngüden çıkılacaktır.

Loopnz komutu(Loopne ile aynı):

      Bu döngü komutuyla cx veya ecx'in değeri 0 olana kadar veya zero flağı set(1) edilene kadar ya da her iki şart birlikte gerçekleşene kadar döngü kurulmuş olur.

 

ALT PROGRAMLAR: Assembly ile de alt programlar oluşturup daha sonra istediğiniz yerden bu alt programı çağırabilirsiniz. Yapmanız gereken ana programın üst kısmında alt programlarınızı yazmanız. Alt programı ana programın üstünde yazmak zorunda değilsiniz. Ancak ana programın üstünde tanımlamanız daha kullanışlı. Neden? Çünkü Assembly yapısal bir programlama dili değil. İlk satırdan itibaren çalışmaya başlıyor. Eğer programın akışını yönlendirmezseniz, siz istesenizde istemesenizde alt program en az bir kez çalışacaktır. Bunu kolay bir şekilde engelleyebiliriz. Diyelimki birsürü alt programınız var. Üst tarafa alt programları yazdınız. Alt tarafta ana program bloğu var. Alt programların sizin komtrolünüz dışında çalışmasını istemiyorsunuz. O zaman programın en başına koşulsuz dallanma komutunu koyuyor ve programın akışını ana programın başladığı yere aktarıyoruz. Böylece alt programlar bizim isteğimiz dışında çalışmıyor. İsterseniz bu yapıyı kullanmayabilirsiniz. Ancak o zaman birsürü koşullu ya da koşulsuz dallanma komutu kullanmanız gerekecektir.

       Diyeceksiniz ki "Alt programa ne hacet, ben aynı işi dallanma komutlarıyla da yapabilirim.". Evet ama dallanma komutuyla programın akışını değiştirdiniz. İstediğiniz program parçası çalıştı, peki ama program akışı kaldığı yerden nasıl devam edecek?

İşte alt programlar sayesinde program akışı, alt program çalışmasını bitirdikten sonra kaldığı yerden devam ediyor.

 

Alt programlarda Call ve Ret komutları kullanılır. Call komutuyla önceden oluşturulan alt program çağrılır. Ret komutuysa alt programın sonunda bulunur ve alt programın bittiğini gösterir. İşlemci ret komutunu gördüğünde Call komutunun altındaki satırdan itibaren çalışmaya devam eder. Dikkat!! Call komutundan önce ret komutu kullanılamazzzz. Hata oluşur!! İlkönce call, sonra ret....

        Komutların kullanımı: Call adres --> adres dallanılacak alt programın adresidir.

        Ret komutuysa alt programın sonunda bulunur.

 

Çalışan alt programı sonlandırmanın iki yöntemi vardır. 1 Ret komutuyla 2 Retf komutuyla

   Eğer alt programla, alt programın çağrıldığı kısım(Call komutu) aynı bellek bölgesindeyse(segment) Ret, aynı bellek bölgesinde değilse(birbirlerine uzaksalar) Retf komutu kullanılır.

 

Örnek program: Girilen sayının istenilen kuvvetini hesaplayan program.

 

procedure TForm1.Button1Click(Sender: TObject);

  var

  sayi,kuvvet,sonuc:integer;

begin

  sayi:=strtoint(edit1.text);

  kuvveti:=strtoint(edit2.text);

   asm

     mov ebx,sayi

     mov ecx,kuvveti

     mov eax,1  //çarpmanın etkisiz elemanı...:)

     jmp @dongu  //alt program çalışmadan ana program kısmına dallanılıyor.

    

      @altprogram: //alt program başlangıcı

        mul ebx

       ret //alt programın çalışması bitiyor

    

     @dongu: //dikkat ettiyseniz döngü içinde istediğiniz kadar alt programı tekrar tekrar çağırabiliyorsunuz...

         call @altprogram //alt program çağrılıyor

      loop @dongu

     

     mov sonuc,eax

   end;

  showmessage('Sonuç:'+inttostr(sonuc));

  end;

 

İleride göreceğimiz dersler: Döndürme komutları, string komutları(belki), kesmeler(interrupt)...Assembly çok basitmiş değil mi? Ben 1-2 ay içinde kendi kendime öğrendim. Size de öğretmek istedim :)

 Zaten programlama mantığını bir kere öğrendikten sonra programlama dillerini öğrenmeniz çok kolay oluyor. Öğrenmeniz gereken sadece hangi işlemi hangi komutla yapacağınız.

Delphi ile ilgili örnek pek olmadığı halde, deneme-yanılma yöntemiyle de pekçok şey bulunabiliyor...

Muharrem YILDIZ

kasimyildizi@yahoo.com, muharremyildizxxx@hotmail.com

 

Delphi - .....................................

 

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

 

Delphi - .....................................

 

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

 

Delphi - .....................................

 

Dbgrid arama yapmak

dbgrid de arama yapmak için ne yapmalıyım

            yardımcı olusanız sevinirim

            hancim@mynet.com

 

Delphi - .....................................

 

Dbgrid arama yapmak

dbgrid de arama yapmak için ne yapmalıyım

            yardımcı olusanız sevinirim

            hancim@mynet.com

 

Delphi - .....................................

 

Symbian

Merhaba arkadaşlar

   Öncelikle symbian hakkında biraz bilgi veriyim.

Symbian cep telefonları için yapılmış bir işletim sistemidir.

Nokia 3650, 7650, 6600 vs. Siemens Sx1 Sendo x gibi telefonlarda bu işletim sistemi kullanılır.

Bu işletim sistemi için program geliştirmek istiyorsan www.symbian.com

sitesinden öncelikle bir sdk indirmen gerekecek. İster C++ ile ister Java ile

bu işletim sistemi için program geliştirebilirsin. Sdk'nin içinde gerekli dosyalar mevcut

ayrıca Jre nin 1.3.1 sürümünü ve active perl'i indirmen lazım. Şimdiden başarılar diliyorum.

Yaptığın ilk programı e-mail adresime yollarsan sevinirim

           huseyinkeles7@hotmail.com

 

Delphi - .....................................

 

Symbian

Merhaba arkadaşlar

   Öncelikle symbian hakkında biraz bilgi veriyim.

Symbian cep telefonları için yapılmış bir işletim sistemidir.

Nokia 3650, 7650, 6600 vs. Siemens Sx1 Sendo x gibi telefonlarda bu işletim sistemi kullanılır.

Bu işletim sistemi için program geliştirmek istiyorsan www.symbian.com

sitesinden öncelikle bir sdk indirmen gerekecek. İster C++ ile ister Java ile

bu işletim sistemi için program geliştirebilirsin. Sdk'nin içinde gerekli dosyalar mevcut

ayrıca Jre nin 1.3.1 sürümünü ve active perl'i indirmen lazım. Şimdiden başarılar diliyorum.

Yaptığın ilk programı e-mail adresime yollarsan sevinirim

           huseyinkeles7@hotmail.com

 

Delphi - .....................................

 

dbgrıdde mouse ile dolaşmak

//Bir Allah'ın kulu çıkıpta sorunuma yardım etmedi.

    //Zaten artık gerekte kalmadı.Kendim buldum sonunda.

    //Alın görün kodları :-<

    //29 Aralık 2004 10:22

    //Tekno_Baris

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, DB, DBTables, Grids, DBGrids;

 

type

  TForm1 = class(TForm)

    DBGrid1: TDBGrid;

    DataSource1: TDataSource;

    Table1: TTable;

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  procedure DBGrid1PillaLaRueda(var Message: TMessage);

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

type

   TomaInvento = class(TControl);

 

procedure TForm1.DBGrid1PillaLaRueda(var Message: TMessage);

var

Cuanto : short;

begin

if (Message.Msg = WM_MOUSEWHEEL) then begin

    Cuanto:=HIWORD(Message.WParam);

    Cuanto:=Cuanto div 120;

    DbGrid1.DataSource.DataSet.MoveBy(-Cuanto);

    end else TomaInvento(DBGrid1).WndProc(Message);

end;

 

 

procedure TForm1.FormCreate(Sender: TObject);

begin

DBGrid1.WindowProc := DBGrid1PillaLaRueda;

end;

 

end.

 

Delphi - .....................................

 

dbgrıdde mouse ile dolaşmak

//Bir Allah'ın kulu çıkıpta sorunuma yardım etmedi.

    //Zaten artık gerekte kalmadı.Kendim buldum sonunda.

    //Alın görün kodları :-<

    //29 Aralık 2004 10:22

    //Tekno_Baris

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, DB, DBTables, Grids, DBGrids;

 

type

  TForm1 = class(TForm)

    DBGrid1: TDBGrid;

    DataSource1: TDataSource;

    Table1: TTable;

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  procedure DBGrid1PillaLaRueda(var Message: TMessage);

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

type

   TomaInvento = class(TControl);

 

procedure TForm1.DBGrid1PillaLaRueda(var Message: TMessage);

var

Cuanto : short;

begin

if (Message.Msg = WM_MOUSEWHEEL) then begin

    Cuanto:=HIWORD(Message.WParam);

    Cuanto:=Cuanto div 120;

    DbGrid1.DataSource.DataSet.MoveBy(-Cuanto);

    end else TomaInvento(DBGrid1).WndProc(Message);

end;

 

 

procedure TForm1.FormCreate(Sender: TObject);

begin

DBGrid1.WindowProc := DBGrid1PillaLaRueda;

end;

 

end.

 

Delphi - .....................................

 

Dinamik Bileşen oluşturma

//Nuh EROĞLU

//nuheroglu@hotmail.com

var

sayac      : Integer = 20;

PANELLER               : ARRAY OF TPanel       ;

procedure TForm1.herseyihazirla();

begin

     for sira := 1 to sayac do begin

     PANELLER[sira]                 := TPanel.Create(Form1) ;

         with PANELLER[sira] do begin

              Parent         := Form1 ;

              Width          := 1024 div 5;

              Height         := 650  div (sayac div 5);

              Left           := Width*((sira+4) mod 5);

              if  (sira mod 5) = 0 then

              Top            := 0 + (sira div 5)*Height-Height

              else

              Top            := 0 + (sira div 5)*Height;

              Name           := 'Panel_Makine' + inttostr(sira);

              Color          := clwhite ;

              Caption        := 'Panel_Makine' + inttostr(sira) ;

              Visible        := True ;

              DoubleBuffered := True ;

         end; // with Panel

     end;

end;

Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol