Mega Code Archive

 
Categories / Delphi / Strings
 

Delphi ile assembly dersleri 3

**********************MANTIKSAL(LOJİK-LOGIC) İŞLEM KOMUTLARI ****************************** ****************************************************************************** Mantıksal işlem komutları:NOT, OR, XOR, AND ve TEST komutlarıdır. NOT hariç tüm lojik komutlar iki operand kullanarak, operandlar üzerinde istenen mantıksal işlemi yaparlar.DİKKAT!!!: Lojik operasyona tabii tutulacak operandların uzunluklarının birbirine eşit olması gerekir. NOT Komutu: Operandının değerinin binary(ikilik sayı sistemi) sistemdeki karşılığında yer alan 1 bitlerini 0, 0 bitleriniyse 1 yapar. Operansyon sonrasında elde edilen sonuç, tekrar, operand ile gösterilen alana aktarılır. Örnek: Not eax Örnek: 11001011 -> Not işleminden sonra 00110100 Örnek program: procedure TForm1.Button1Click(Sender: TObject); var sayi:integer; begin sayi:=strtoint(edit1.text); asm mov eax,sayi not eax //eax'in tersi alınıyor... mov sayi,eax end; showmessage(inttostr(sayi)); end; OR Komutu: Or komutu, iki sayısal değeri oluşturan bitlerin karşılıklı olanlarını kıyaslar. Bitlerden her ikisi de 0 ise yeni bit değeri olarak 0, aksi taktirde 1 sonucu üretilir. Operasyon sonrasında elde edilen değer, soldaki alıcı alan operandına aktarılır. Yazılımı: OR Operand1(Alıcı), Operand2(Gönderici) Sonuçta Alıcı operandın değeri değişiyor(Soldakinin değişeceği daha önceden belirtilmişti değil mi? İki operandlı komutların kullanımını hatırlayın..) Örnek: Or ax,FFFF ->Ax'in tüm bitleri 1 yapılır. Çünkü Ax içindeki değer, ikilik sayı sisteminde karşılığı 1111111111111111 (FFFF) olan değerle or işlemine tabii tutuluyor. Or Ax,FF ->Al'nin tüm bitleri 1 yapılır. Ah korunur.Ek bilgi: (Ax: Al ve Ah kaydedicilerinden oluşur) Aynı şekilde bx kaydedicisi de bh ve bl kaydedicilerinden oluşur.... OR eax,ebx Örnek: 11000111 or 01011010 ->11011111 !!!!!!!!! ***********XOR İŞLEMİ ************** !!!!!!!!!!!!!!!!!!!!! XOR (Özel veya) Komutu: or gibi. Farkı: Bitlerden her ikisi de 0 veya her ikisi de 1 ise yeni bit değeri olarak 0, aksi taktirde 1 sonucunu üretir. Şimdi diyeceksinizki "Bu benim ne işime yarayacak...", ÇOOOOK işinize yarayacak.... XOR komutu genellikle şifreleme programlarında kullanılır. Nasıl mı? Okumaya devam et.. Şimdi diyelimki elmizde bir bytelık veri var. Verimiz şu olsun 10110111 Şimdide bu veriyi şifrelemek için bir anahtarımız olasun, o da şu olsun: 01100110 Şimdi bu iki veri üzerinde şifreleme yapalım(xor işlemine tabii tutalım) Veri:10110111 Anahtar:01100110 -------- Sonuç:11010001 ->Böylece verimiz(1 byte) ifrelenmiş oldu. Diyelimki bir veri vardı ve siz kullanıcıdan bu veriyi şifrelemek için bir anahtar(şifreyi açacak parola) girmesini istediniz. Ve girilen anahtara göre veriyi şifrelediniz. Peki şimdide şifrelenmiş veriyi geri çözelim. Elimizde şifrelenmiş veri var(11010001) ve kullanıcıdan bu şifrelenmiş veriyi çözecek anahtarı girmesini isteyelim. (Veryi şifrelerken kullanıcının girdiği anahtar [01100110] ) Şifrelenmiş veri: 11010001 Anahtar:01100110 (Dikkat! Şifrelerken kullandığımız anahtarla aynı) ---------------- Sonuç:10110111 (Asıl veri [şifreli veri çözüldü]) Tabiii bu en basit şifreleme. Biz anahtar olarak 1 byte'lık veri kullandık. Anahtar olarak 1 cümle veya bir sayfalık yazının kullanıldığını düşünsenize... Şifrelenmiş veriyi çözmek ne kadar zooor olurdu.(Fakat imkansız değil biliyoruz değil mi?) Şifreleme programları genel olarak bu mantıkla çalışır. Fakat şifrelenecek veri başka işlemlerden de geçer. Örneğin verinin tersinin(NOT) alınması, bitlerin döndürülmesi(Bit döndürme komutlarıyla[ROR,ROL]) gibi işlemler ard arda yapılır. Böylece veri nekadar fazla işlemle şifrelenirse çözülme işlemi zorlaşır. Şifre çözülürken işlemler aynı sırayla tersten yapılmalıdır. Eğer standart bir şifreleme algoritması kullanırsanız verileriniz rahatlıkla çözülür. En iyisi kendi algoritmanızı kendinizin geliştirmesi.Şifreleme algoritmasının da şifrelendiğini düşünün...uçtum biraz... Basit bir örnek program(1 byte'lık veriyi istenilen anahtara göre şifreleyen program): procedure TForm1.Button1Click(Sender: TObject); var veri,anahtar,sonuc:byte; begin veri:=ord(edit1.text[1]); anahtar:=ord(edit2.text[1]); asm mov al,veri mov bl,anahtar xor al,bl mov sonuc,al end; showmessage('veri:'+inttostr(veri)+' sonuc:'+inttostr(sonuc)+': Yazıyla: '+chr(sonuc)); end; AND Komutu: Bitlerden her ikisi de 1 ise yeni bit değeri olarak 1, aksi taktirde 0 sonucunu üretir. Operasyon sonrasında elde edilen sonuç değer, alıcı alan operandına aktarılır. Yazılımı: AND Operand1(Alıcı), Operand2(gönderici) Ör: AND ax,bx And ax,0000 -> Ax'in değeri sıfırlanır And Ax,00FF -> Ah sıfırlanır And Ax,FF00 -> Al sıfırlanır. 11001101 and 10011011 -> 10001001 TEST Komutu: Test komutu tamamıyle And gibi çalışır. Farklı olarak, komut ile birlikte kullanılan operandların değerlerini değiştirmez.(Sonuç değerin, alıcı alan operandına aktarılması söz konusu değildir). Bu komutun çalışmasından sonra bayrak değerleri, üzerinde işlem yapılan veriye göre değişecektir.Bu komuttan sonra bayrak değerlerine göre başka komutlarla işlem yapılabilir. Ör: TEST Al,08 JZ .... işlem sonucuna göre(bayrak değerleri) program akışı yönlendirilebilir. (İleride göreceğiz; fakat ben şimdiden söyleyeyim: J harfiyle başlayan komutlar dallanma komutlarıdır. Bu komutlarla programın akışını yönlendirebilirsiniz) ********KAYDIRMA KOMUTLARI ******** Bir veriyi oluşturan bitler sağa veya sola doğru kaydırılabilir. Sağa kaydırma(SHR ve SAR), Sola kaydırma (SHL ve SAL) Shift komutları iki operandla birlikte kullanılır. İlk operand, shift operasyonuna tabii tutulacak olan, bir kaydedici veya uzunluğu belirtilmiş bir bellek bölgesidir. İkinci operand, ilk operandın kaç kez shift(kaydırma) işlemine tabii tutulacağını gösterir. İkinci operand 1 veya kaç kez kaydırma işlemine tabii tutulacağını gösteren CL kaydedicisi olabilir. Bir değer üzerinde kaydırma işlemi 1'den fazla sayıda tekrarlanacaksa, tekrar sayısının cl kaydedicisine aktarılması ve ikinci operand olarak cl kaydedicisinin kullanılması zorunludur. Başka bir püf nokta: Eğer bir kaydedicinin değeri 1 kez sağa kaydırılırsa ikiye bölme işlemi, sola kaydırılırsa ikiyle çarpma işlemi yapılmış olur. Eğer bir sayının iki ve ikinin katlarıyla bölünmesi ya da çarpılması gerekirse kaydırma komutlarını kullanabilirsiniz.Div veya Mul komutlarından daha hızlı bir şekilde işlem gerçekleşir. Ör: Mov al,sayi1 Shl Al,01 ->sayi1'in değeri 1 sola kaydırılıyor(İki ile çarpılıyor), sonuç al kaydedicisinde Shr Al,01 ->Al'nin değeri 2 ile bölünüyor Eğer birden fazla kaydıracaksak cl kaydedicisini kullanıyoruz Mov cl,kaydirma_sayisi Mov Al,veri Shr al,cl ->cl kadar al'nin içindeki değer kere al sağa kaydırılıyor. Örnek 2:(Kaydırma işleminin bitler ve bayraklar üzerindeki etkisi) Mov Al, 33 -> Al =Hexadesimal 33, Binary 00110011 Shr Al,01 -> Al = Hex 19, Bin 00011001, Carry Flag(Elde bayrağı)=1 Shr Al,01 -> Al = Hex 0C, Bin 00001100, CF=1 Shr Al,01 -> Al = Hex 06, Bin 00000110, CF=0 Dikkat!: Sağa kaydırma yapılıyorsa, en sağdaki bit carry bayrağına gidiyor. Soldan boş kalan kısma ise 0 yerleştiriliyor. Eğer Sola kaydırma işlemi yapılıyorsa, en soldaki bit carry bayrağına gidiyor, Sağdan boş kalan kısma ise 0 yerleştiriliyor. Örnek program: Girilen sayıyı 2 ile çarpıp sonucu görüntüleyen program (0-127 arasındaki sayılar). Takdir edersiniz ki sonucu 255'ten büyük olan değerler taşmaya neden olur. Çünkü 8 bitlik(1 byte'lık) kaydedici kullanıyoruz. Eğer büyük sayı girerseniz doğru sonuç çıklamayabilir. procedure TForm1.Button2Click(Sender: TObject); var sayi1,sonuc:byte; begin sayi1:=strtoint(edit2.text); asm mov al,sayi1 shl al,1 mov sonuc,al end; showmessage(inttostr(sonuc)); end; SAR ve SHR Komutları aynı... (Sağa aritmetik kaydırma) SAL ve SHL Komutları aynı... (Sola aritmetik kaydırma komutu-SAL) Sonraki derslerimizde, döndürme, dallanma ve döngü komutlarını göreceğiz. Biraz da alt programlara bakarız...Neyse sonra görüşürüz. Umarım yararlı olur. ASSEMBLY teorik değil, uygulamayla öğrenilir...bu öğrendiklerini uygula!! Örnek programların çalışmasını inceleyip kendi örneğini geliştirmeye çalış.. Eğer güzel örnekler oluşturursanız bizimle paylaşın lütfen...