**********************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...