Assembly Aritmetik ve Mantık Komutları

layef

Üye
28 Mar 2020
135
46
nowhere

Aritmetik İşlemler

Aritmetik işlemler toplama(ADD-ADC), çıkarma(SUB-SBB), çarpma(MUL-IMUL) ve Bölme(DIV,IDIV) olmak üzere 4 bölümden oluşur. Aritmetik işlemler bayrakları(flags) etkilemektedir. Bayraklara bakılarak büyük-küçük kontrolleri, kalansız bölünüyor mu? gibi kontroller yapılabilmektedir. Aritmetik işlemlere geçmeden önce bayraklara ufaktan değinelim.

Bayraklar(flags)

Bayrak kaydedicileri 16 bit veri taşıyabilir, her bit bir bayrağı ifade eder.

Carry flag (CF)

İşaretsiz(unsigned) sayılarla yapılan işlemler sonucunda bir taşma söz konusu ise bu bayrak 1 yani aktif, taşma meydana gelmiyor ise 0 yani pasiftir.



Örnekte de gözüktüğü üzere al 8 bitlik bir ifade ve al 0-255 arasında değerler alabilir. al ile bl'i toplayıp al'ye attığımız zaman bir taşma oluyor ve carry flag aktifleşiyor.

Parity flag (PF)

İşlemin sonucundaki değerdeki 1 olan bitlerin sayısı çift sayı ise bu bayrak 1 yani aktif eğer işlemin sonucundaki değerde 1 olan bitlerin sayısı tek ise bu bayrak 0 yani pasif olur.



Burada al'deki 8 değeri ile bl'deki 9 değeri toplanıp al'ye yazıldı sonucun binary değeri 00010001 yani burada 1 olan bitlerin sayısı 2 çift sayıdır. Bu yüzden parity flag aktif oluyor.

Zero flag (ZF)

Herhangi bir işlem sonucunda sıfır değeri elde ediliyorsak bu bayrak 1 yani aktif eğer işlemin sonucu sıfır değilse bu bayrak 0 yani pasif olur.



Buradaki örnekte al 1 daha sonra dec komutu al'yi 1 azalttı ve al 0 oldu. Bu yüzden zero flag aktif oluyor.

Sign flag (SF)

Aslında en basit ifade ile bu bayrak işlem sonucunda elde edilen değerin en soldaki bitini yani işaret bitini tutuyor. İşlem sonucunda elde edilen değerin işaret bit'i 0 ise bu bayrak pasif, 1 ise aktif oluyor. Biz bir aritmetik işlemde sonucun negatif olup olmadığını bu bayrak sayesinde anlayabiliriz.



Örnekte al'deki 9 değeri ile bl'deki -10 değeri toplanıp al'ye yazıldı binary değeri 11111111 en soldaki bit yani işaret bit'i 1 olduğu için bu bayrak aktif durumdadır.

Overflow flag (OF)

İşaretli sayılarda yapılan işlemin sonucu işaretli sayı aralığında ise 0 yani pasif ama bir aşma durumu var ise 1 yani aktif olur.



8 bitlik işaretli sayılarda en küçük değer -128 en büyük ise +127'dir. Burada al ile bl toplamı 130 al'ye aktarıldı. İşlemin sonucu işaretli sayı aralığını aşma durumu gerçekleştiği için bu bayrak 1 yani aktif durumdadır.

Auxiliary carry flag (AF)

İşaretsiz(unsigned) sayılarda yapılan işlem sonucunda 4 bit'te taşma meydana geliyorsa Auxiliary carry flag 1 yani aktif eğer taşma meydana gelmez ise 0 yani pasif olur.



Burayı şöyle düşünelim al'ye 10 değerini atadık yani 00001010, bl'ye 6 değerini atadık yani 00000110, ikisini toplayıp(10 + 6 = 16) al'ye atadık. Bilindiği üzere 4 bit 0-15 arasındaki sayılar ile ifade ediliyordu. 00001010 + 00000110 = 00010000 görüldüğü gibi düşük değerli 4 bit'te taşma meydana geldi ve bu bayrak aktif duruma geçti.

Direction Flag (DF)

Ardışık verilerde özellikle string işlemlerinde kullanılan komutların ileri mi geri yönlü mü çalışacağını belirlemektedir. Direction flag 1 ise geri yönlü 0 ise ileri yönlü işlem yapılır.

Interrupt enable Flag (IF)

Default olarak 1 değeri vardır. 1 yani aktif durumda iken işlemciye harici cihazlardan kesme(interrupt) sinyalleri gönderilebilir.


Aritmetik Komutlar - Toplama(ADD-ADC)

ADD toplama, ADC elde ile toplamadır.ADD ile tek farkı elde bayrağının da(CF) eklenmesidir.

ADD ile Toplama işlemi

İşlemin özeti: add deger1,deger2 -> deger1 = deger1 + deger2

register, register şeklinde kullanımı;



memory, register şeklinde kullanımı;



register, memory şeklinde kullanımı;



register, immediate şeklinde kullanımı;



memory, immediate şeklinde kullanımı;



Not: 8 bitlik kaydedicide toplama işleminin sonucu 8 bit'i aşarsa over flag(OF) ve carry flag(FG) aktif olur.

ADC ile Toplama İşlemi

İşlemin özeti: adc deger1,deger2 -> deger1 = deger1 + deger2 + CF

ADC ile eldeli toplamaya gelecek olursak ADD için geçerli olan tüm durumlar burada da geçerli. Yukarıda belirttiğimiz gibi tek fark elde bayrağının işin içine girmesidir.

Aritmetik Komutlar - Çıkarma(SUB-SBB)

SUB ve SBB ikisi de çıkarma işlemi gerçekleştirmek için kullanılır. Aralarındaki temel fark SUB ile çıkarma işlemi yapılırken çıkarma işlemine CF dahil edilmez. SBB ile çıkarma işlemi yapılırken çıkarma işlemine CF de dahil edilir.

register, register
memory, register
register, memory
register, immediate
memory, immediate

kullanımı mevcuttur. Bu yönden toplama işlemi ile bir fark yok. Yukarıdaki gibi her biri için örnek vermeyeceğim.

SUB ile Çıkarma işlemi

İşlemin özeti: sub deger1,deger2 -> deger1 = deger1 - deger2



register, immediate şeklinde kullanıma örnek verdik.



register, register şeklinde kullanıma örnek verdik.

SBB ile Çıkarma işlemi

İşlemin özeti: sbb deger1,deger2 -> deger1 = deger1 - deger2 -CF



Bu örneği açıklayacak olursak al'ye 3 değeri atandı, daha sonra sub ile çıkarma işlemi yapıldı ve 6 çıkarıldı. Bu sırada al değeri FD(253) oldu ve carry flag değeri 1 oldu. En son aşamada sbb ile çıkarma işlemi yapıldı ve 2 çıkarıldı. Normal şartlarda 253 - 2 = 251 olması gerekiyor fakat işin içine carry flag de dahil oldu ve 253 - 2 - 1 = 250 oldu. Carry flag ise 0 değerini aldı.

Aritmetiksel Komutlar - Çarpma(MUL-IMUL)

MUL ve IMUL ile gerçekleştirilir.

İşlemin özeti: mul değer1 -> 8 bit = AX=AL*değer1 , 16 bit=(DX AX) = AX*değer1

MUL ile Çarpma İşlemi

İşaretsiz(unsigned) sayılarda çarpma işlemi yapılırken kullanılır.



Bu örnekte görüldüğü üzere bl, al ile çarpılarak ax içerisine yerleştirildi.



16 bit'le işlem yapıldığında bulunan sonuş dx ax ikilisinde tutuluyordu. Burada sonuç direkt ax içerisinde gözüküyor. dx, çarpma sonrasında oluşan genişleme değerini tutar. Herhangi bir genişleme olmadığı için 0 durumundadır.

IMUL ile Çarpma İşlemi

İşaretli(signed) sayılarda çarpma işlemi yapılırken kullanılır.



bl değeri 2 iken 4 eksiliyor ve işaretli sayılarda -2 oluyor. Daha sonra al 5 oluyor. 5 * (-2) = -10 cevabını buluyoruz.

Aritmetiksel Komutlar - Bölme(DIV-IDIV)

DIV ve IDIV ile gerçekleştirilir.

İşlemin özeti: div değer1 -> 8 bit = AL=AX / değer1 AH = Kalan (Mod)
16 bit = AX=(DX AX) / değer1 DX = Kalan (mod)

DIV ile Bölme İşlemi

İşaretsiz(unsigned) sayılarda bölme işlemi yapılırken kullanılır.



BL içerisindeki 5, AX içerisindeki 51 ile bölme işlemine tabii tutuldu. 51 / 5 = 10 kalan ise 1.
Buradaki örnekte gözüktüğü üzere elde edilen sonuç yani bölüm al'de kalan ise ah'de görülmektedir.

IDIV ile Bölme İşlemi

İşaretli(signed) sayılarda bölme işlemi yapılırken kullanılır.



Özetle (-182) / 9 = (-20) kalan ise -2 burada kalan aynı şekilde AH içerisinde gösterilirken bölüm AL içerisinde gösterilmiş .

Mantıksal Komutlar - AND

Genelde maskeleme amacı ile kullanılmaktadır. İstenilen bitlerin yok edilmesi için kullanılır.

İşlemin özeti: and değer1, değer2 -> değer1 ile değer2 and işlemine tabi tutulur. Sonuç değer1'de saklanır.

0 ve 1 mantığı ile ifade edilirse;

1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0



Bu örnekte yaptığımız işlemi açıklayacak olursak al'de bulunan 'e' değerinin binary karşılığı 01100101 bu değeri 11011111 ile and işlemine tabi tutarsak 01000101 sonucunu veriyor. 01000101 sonucu ise 'E' nin karşılığıdır.

Mantıksal Komutlar - OR

OR komutu AND ile benzerdir, maskeleme işlemi için kullanılır. İstenilen bitlerin korunmasını sağlar.

İşlemin özeti: or değer1, değer2 -> değer1 ile değer2 or işlemine tabi tutulur. Sonuç değer1'de saklanır.

0 ve 1 mantığı ile ifade edilirse;

1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0



Bu örnekte yaptığımız işlemi açıklayacak olursak al'de bulunan 'E' değerinin binary karşılığı 01000101 bu değeri 00100000 ile or işlemine tabi tutarsak 01100101 sonucunu veriyor. 01100101 sonucu ise 'e' nin karşılığıdır. Yani and işlemine benzer bir işlemdir.

Mantıksal Komutlar - XOR

Seçilen bit'in tersini alır.

İşlemin özeti: xor değer1, değer2 -> değer1 ile değer2 xor işlemine tabi tutulur. Sonuç değer1'de saklanır.

0 ve 1 mantığı ile ifade edilirse;

1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0



Bu örneği açıklayacak olursak al içerisindeki 01000101 binary değeri 01010011 binary değeri ile xor işlemi uyguladık. Sonuç olarak 00010110 binary değerini elde ettik.

Mantıksal Komutlar - NOT

Bütün bitlerin tersini alır.

İşlemin özeti: not değer1 -> değer1 içerisinde bulunan değerlerin bitlerinin tersini alır.

0 ve 1 mantığı ile ifade edilirse;

1 NOT = 0
0 NOT = 1



al içerisindeki 42 hex değerini not işlemi uyguladık. 42 hex değerinin binary karşılığı 01000010 not işlemi uygulanmış hali ise 10111101 dir.

Mantıksal Komutlar - TEST

and işlemine tabi tutulur fakat herhangi bir yerde saklanmaz. Sadece bayraklar etkilenir.

Selam ve Sevgilerle layef...


 
Son düzenleme:
Ü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.