Virüs kodu yazılımı 9 Matematiksel (Aritmetik) Komutlar

serdengeçti

Katılımcı Üye
12 Ara 2007
849
4
ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM -4 )


ASSEMBLY KOMUTLARI :


Matematiksel (Aritmetik) Komutlar :


Assembly de bütün register arasında standart toplama, çıkarma, çarpma ve bölme işlemleri rahatça yapılabilir arkadaşlar.Ben de burada standart olarak 4 bölüme ayırıp açıkladım. Aritmetiksel komutların icrası sırasında flag registerler değişikliğe uğrar.

a - ADD ve ADC (Toplama)Komutları : ADD komutu toplama işlemini gerçekleştirmek için kullanılır. ADD komutu ile “kaynak” içerisindeki değer “hedef” ile toplanıp tekrar “hedef” register içerisine kaydedilir. “Hedef” ve “kaynak” alanları da register-register, bellek-register, register-bellek gibi çiftlerden birisi olabilir.Örnek olarak;

MOV AX, 5 - ax içerisine 5 değerini yazdık.
ADD AX, 6 - Ax deki değer ile 6 yı toplayıp tekrar Ax ‘e kaydettik.

Yukarıdaki örnekte AX registerimizin değeri 11 olacak ve hexdecimal karşılığı olarak 0Bh yazılacaktı.ADC komutu da tıpkı ADD komutu gibi toplama işlemi için kullanılır arkadaşlar.Aralarındaki tek fark ise ADC komutunda toplama işlemine bir de carry (elde biti) flag’ın değerinin eklenmesidir.Yukarıdaki örnekte işlemin sonucun da eğer carry flag’ın değeri 1 olsa idi, o zaman bizim işlemimizin sonucu da 11 değil 12 olarak çıkacaktı. Gösterimi daha anlaşılır olacaktır.

register = hedef + kaynak + carry flag’ın değeri

b- SUB , SBB ve CMP ( Çıkartma ) Komutları :

SUB (Subtract )komutu çıkarma işlemi için kullanılır. Kullanımı ADD komutunda olduğu gibidir. “Kaynak” içerisindeki değer “hedef” içerisinden çıkartılıp sonuç “hedef” register içerisinde saklanır.Şu şekilde örnek gösterebiliriz.

Mov ax,8
Mov bx,3
Sub ax,bx sonuç ax = 5

SBB Komutu (Subtract with Barrow) ise SUB komutunun Carry’li versiyonudur. Ödünç ile toplama komutu olan SBB, operand ile beraber elde (Carry) bayrağını çıkarmada kullanır.Yani SBB komutu ile SUB arasındaki ilişki, ADD komutu ile ADC arasındaki ilişki ile aynıdır.SUB komutu ile aynı işlem yapılır yalnız burada “hedef” alana atılan değerden carry flag’ın değeri de çıkartılır.
register = hedef – kaynak – carry flag’ın değeri şeklinde gösterebiliriz.

CMP bu komut aslın da karşılaştırma komutu gibi görünse de arkadaşlar CMP komutu kullanım bakımından tamamen SUB komutu gibidir. Ancak işlemin sonucunu herhangi bir kaydediciye yüklemez ,çıkartma işleminden sonra yalnızca bayraklar etkilenir aralarında ki fark sadece budur. CMP ’nin anlamı "compare" yani karşılaştır demektir. Bu komut A, C, O, P, S ve Z bayraklarını etkiler.CMP komutundan sonra sonuca göre genellikle koşullu dallanma komutları ile programın akışı değiştirilir.

Cmp ax, bx

Yukarıdaki örnekte Ax den BX çıkarılıyor AX, BX’e eşit ise işlemin sonucu sıfır olur ve zero flag 1 değerini alır.

INC – DEC (Artırma-Eksiltme ) Komutları :INC ve DEC komutları registerleri, adresleri, yada değerleri azaltmak - arttırmak içindir. Her iki komutta her çalışmasında sadece 1 byte lık azaltma veya arttırma yapmaktadır. Daha fazla adımlarda azaltma-arttırma yapmak için ADD ve SUB komutlarını kullanmalıyız. DEC ve INC komutları oluşturdukları yeni değerlere göre bayrak registeri etkilerler.
Kısaca
INC komutu kendisine verilen register yada bellek bölgesi içerisindeki değeri bir arttırır. C
dilindeki “++” komutu ile aynı işi yapmaktadır .Yada VB deki “a = a + 1” ile aynı anlamdadır.

Add ax,1 komutu da aynı işi yapar fakat aşağıda ki örnek daha hızlı çalışır.

inc ax (ax= ++)

DEC komutu da kendisine verilen register yada bellek bölgesi içerisindeki değeri bir azaltır.Yine C dilindeki “--“ komutuna ,yada VB dilindeki “ a = a – 1 ” komutuna karşılık gelmektedir.

Dec ax (ax = -- anlamın da ve oldukça hızlı çalışır)

MUL ve IMUL (Çarpma) Komutları :Çarpma işlevide registerler arasında , adresler arasında, ve kendi arasında uygulanabilir. Çarpma işlemi MUL ve IMUL komutları ile gerçekleşmektedir. İkisini amacı çarpim olduğu halde MUL ve IMUL arasında farklılıklar vardır. MUL işaretsiz çarpma ,IMUL ise işareti dikkate alarak çarpma işlemlerini yapar.Arıca IMUL komutu 2 veya çarpıma olanak vermekte ve kullanım şekli daha geniştir. IMUL komutu 32 bit işlemler için idealdir.

MUL :Aritmetiksel olarak çarpma işlemi iki değer ile gerçekleştirilmesine karşın MUL komutu sadece bir değer alır. MUL komutu ile kullanılan değer gizli olarak ax /al içerisindeki değer ile çarpma işlemine tabi tutulur.Şöyle ki;

mov ax,0045 -ax = 45
mov bx,0011 -bx =11
mul bx -ax * bx = sonuç yine ax registere aktarılır .

Yukarıdaki örnekten anlaşılacağı gibi daima AX (AL ve EAX register) asıl çarpılandır.Eğer bir çarpma işlemi sonucu ax registerin alabileceği en büyük değeri geçiyorsa geçme sayısı DX registere aktarılır. Eğer geçme yoksa DX registerde bir değişme olmaz.
IMUL : IMUL komutu da MUL komutu gibi çarpma işlemi için kullanılır tek fark IMUL komutunun işaretli sayılar üzerindeki işlemler için kullanılan bir komut olmasıdır.Ayrıca IMUL komutu çoklu register ve büyük değerlerle işlem yapmaya olanak vermektedir. Yanlız MUL komutunda olduğu gibi taşma olduğunda DX register aktarılma yapılmaz. IMUL ile üçlü çarpımda mümkündür.

mov ax, 04h
mov bx,05h
imul ax,bx,8h ; [AX*BX] * 8 = 160

Yukarıda sadece küçük sayılarla örnek verdim anlaşılması için yoksa bu komutla daha büyük sayılar çarpılabilir.32 bit işlemcilerde bu komut kullanılır.

DIV ve IDIV (Bölme) Komutları : Bölme komutuda DIV ve IDIV olmak üzere kapsamlı olarak iki tanedir. DIV komut da MUL komutundan olduğu gibi sadece bir değer ile işleme girer ve gizli olarak AX register’ını kullanır. Yani işlem sonundaki bölüm değeri AX ve kalan değeri de DX içerisine atılır.DIV division yani bölme kelimesinin kısaltmasıdır, dikkat edilmesi gereken bir diğer husus da sıfır ile bölme durumudur. Diğer işlemlerde olduğu gibi bölme işleminde de matematik kuralları geçerlidir ve matematikte "sıfıra bölme" anlamsızdır. CPU’ da sıfıra bölüm için özel bir kesme(interrupt) ayırmıştır ve böyle bir durum da işlemi durdurur.

Mov ax,10
Mov bx,3
DİV bx

bx deki 3 değeri ax deki 10 değerine bölünüyor ve ax de 3 değeri ,kalan 1 ise DX registerde saklanıyor.
IDIV komutu ise aynı IMUL komutunda olduğu gibi daha yüksek işlemler için idealdir.Ayrıca IDIV komutu işaretli sayılar üzerinde işlem yapmak için kullanılır.Bu komutu fazla kullanmayacağınızdan bu kadar yeterlidir diye düşünüyorum.

Böylece Matematiksel komutları da bitirmiş olduk Son bölümde görüşmek üzere Selametle..

alıntıdır...
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.