111

11:18 | 0 Comments




Notun Tamamına PDF Formatında Ulaşmak İçin (22 Sayfa) :
TIKLAYINIZ

Bilişim Hukuku Kitabına PDF formatında ulaşmak için (346 Sayfa) :
TIKLAYINIZ


İNTERNET VE KİŞİLİK  HAKLARI

           Vücudu, organları, yaşamı, düşünceleri, onuru, saygınlığı, sırları, dini, ailesi, malları gibi  kişinin sahip olduğu bütünün her bir parçasına “hak” adı verilmiştir. Din ve ahlak gibi toplumsal düzeni oluşturan  “Hukuk” da,  kişilere ait bu hakları korumaktadır.
            Hukuk kurallarının en üstünde yer alan Anayasa’nın 12. maddesi, “Herkes kişiliğine bağlı, dokunulmaz, devredilmez, vazgeçilmez temel hak ve hürriyetlere sahiptir.” demektedir. Bu temel düzenlemeyi hayata geçirmek için kanun, yönetmelik ve idari kararlar gibi diğer alt kurallar yapılıp, hepimizin hakları korunmaktadır.
            Anayasa’mızın “herkesin maddi ve manevi varlığını geliştirme hakkı vardır” düzenlemesini alırsak, öncelikle kişi hakları,  maddi  ve manevi haklar diye ikiye ayırabiliriz.


  • Maddi Haklar


            Maddi hakları bedensel haklar ve mülkiyet hakları diye ayırarak iki başlık altında incelenecektir. İsim ve resim de kimi zaman maddi haklara konu olmakta iseler de, uygulamada çoğunlukla manevi açıdan saldırıya uğradığından manevi haklar başlığında incelenecektir.

     1.Bedensel Haklar


            Anayasa, öncelikle kişinin yaşama hakkını en temel hak olarak almıştır. Kişinin beden bütünlüğüne dokunulamaz. Kimseye eziyet yapılamaz. Herkes kişi hürriyetine ve güvenliğine sahiptir.

            Bu hakkın sonucu olarak herkesin bedensel bütünlüğünü ve sağlığını koruma hakkı vardır. Bu haklara kitle iletişim araçlarında yapılan yayınlar sebebiyle zarar verilmişse, yayıncı ve sorumlular bu zararı telafi etmek ve Türk Ceza Kanunu’na göre adam öldürme ve müessir fiil adını verdiğimiz yaralamaya sebep olmuşlarsa bu suçun cezasını çekmek zorundadırlar. Yine Medeni Kanun ve Borçlar Kanunları gereğince, bu bedensel zararlara ve ölümlere ilişkin maddi ve manevi tazminat ödemek durumundadırlar. Özellikle Borçlar Kanunu’nu 47. maddesi fiziki varlığın zarar görmesi durumunda tazminat sorumluluğunu düzenlemiştir.

    2.Mülkiyet Hakları

           Kişinin miras yoluyla kazandığı ya da kendi çalışması ile satın aldığı yahut kendisine bağışlanmış olan araba, mücevher, kıyafet, mobilya gibi menkul (taşınır) ya da arsa, arazi, ev, işyeri gibi gayrımenkul (taşınmaz) malları Hukuk tarafından korunmaktadır. Bu malların, gazete ve dergilerdeki yazı ve haberler veya internet ortamındaki yayınlar vasıtasıyla doğrudan yok edilme olanağı bulunmamakla beraber, dolaylı olarak bir yayın sonucu zarara uğraması olanak dahilindedir. Özellikle hızla gelişmesi ve yayılması karşısında kontrol ve müdahale edilmesi her geçen gün daha çok zorlaşan internet üzerinden yayınlar kişilerin markalarına, isimlerine ve mülkiyet haklarına zarar vermektedir.

            Ev, arazi gibi gayrımenkul ve televizyon, elbise, telefon ve araba gibi menkul malvarlığı haklarınız dışında size geçim, para ve malvarlığı sağlayan ticari işletmeniz ve mesleğiniz de Hukuk’un koruması altındadır. İnternette yapılan yayınla bir firmanın mallarının ya da markasının boykotunu yapmak, mallarını ve markasını haksız olarak kötülemek, markası hakkında asılsız iddialarda bulunmak ve yayın yapmak veya bir kuruluşu sürekli kötüleyerek ona kredi verilmesine engel olmak mesleki ve ticari haklara yapılan saldırılardır.

           Türk Ticaret Kanunu’nun 56. maddesinden itibaren haksız rekabet düzenlenmiştir. TTK 57. maddeye göre; başkalarını, onların mallarını, ürünlerini, faaliyetlerini, ticari işlerini yanlış ve gereksiz sözlerle kötülemek, onların ahlaki ve mali yeterliliği hakkında gerçeğe aykırı bilgi vermek veya kendisi hakkında yukarıdaki konularda yanlış ve yanıltıcı bilgi vermek, imalat ve ticari sırları elde etmek ve açıklamak, sır konularından haksız faydalanmak ve başkalarına açıklamak ekonomik açıdan haksız rekabettir. Bu konuda yayın yapılıp, haber ya da reklam yoluyla, bir kişinin adı, firma adı veya ürünü kötülenirse veya kendi ürünü hakkında yanlış bilgi verilirse haksızlığın tespiti, rekabetin önlenmesi, yanlış bilgilerin düzeltilmesi, maddi ve manevi tazminat ile ceza davaları açılabilir.

           Yapılan yayın ile, bir kişinin mesleki ya da bilimsel kişilik hakkına ağır ve yersiz eleştiriler yöneltmek, gerçek dışı söylenti ve suçlamalarla toplum içindeki ekonomik ve manevi yerini sarsmak, onun ticari varlığına zarar vermektir.

            Ticari kuruluşlar, şirketler ve bankalar için de, gerçek dışı olması kaydıyla, batıyor, kara para aklıyor, ürettiği ürün dayanıksız gibi nitelemeler hukuka aykırıdır.
 Bireylerin haberleşme özgürlüğü nasıl kutsalsa, şirketlerin ya da meslek sırları ve ticari itibarları da o kadar kutsaldır. Bu yüzden meslek ve ticari sırlar mülkiyetle ilgili kişilik haklarındandır. Bir şirketin, iş adamının ya da meslek mensubunun ürün araştırmaları, kayıt ve belgeleri, hesapları, defterleri, üretim ve yönetime ilişkin plan ve düzenlemeleri, müşteri liste ve adresleri mesleki ve ticari gizleridir.

           Bir haber için bunların fotoğrafını çekmek, planları ya da listelerin fotokopisini çekmek, görüntülemek, yayınlamak hem tazminat hem de hapis cezasını gerektirebilir. Bu kuralın istisnaları vardır. Bir banka, leasing ve faktoring kuruluşunun kredi için istihbarat ve bilgi toplaması hukuka uygundur. Basının haber verme hakkı kapsamında bir suçun işlendiğini, ahlaka yahut sağlığa aykırı bir üretim yapıldığını, küçüklerin çalıştırıldığını söylemek de istisnalardandır.


  • Manevi Haklar 


            Manevi haklar dediğimizde Anayasa’da manevi varlığını geliştirme özgürlüğü, din ve vicdan özgürlüğü, haberleşme özgürlüğü, özel yaşamın gizliliği akla gelmektedir.
            Bu haklar başkalarının saldırılarına karşı olduğu gibi, kişilerin bizzat kendilerinden kaynaklanan vazgeçmelere karşı korunmuştur. Medeni Kanun’un 23. maddesi, “Kimse hürriyetinden vazgeçemeyeceği gibi, kanuna veya genel ahlaka karşı biçimde sınırlayamaz.” demektedir.

    1.İsim

           İsim kişinin toplumsal ilişkilerinden kaynaklanan bir değerdir. Sadece gerçek anlamdaki isim değil, kişiyi ve ailesini toplum içinde tanıtmaya yarayan öz ad, göbek adı, lakap, takma isim, ünvan, ün, simgeler, arma, rozet gibi değerler de kişi haklarındandır.
            Eğer bir kişinin ismini gerçek dışı bir yayında kullanırsak, onun kişilik haklarından manevi değerlerine zarar vermiş oluruz. Bunun gibi bir yayından dolayı haberde adı geçen, işini kaybetmiş veya ismin yanlış kullanılması sonucu bir ticari kuruluşun kredisi kesilmiş, müşterileri azalmış, itibarı zedelenmiş olabilir. Bu durumlarda ilgili maddi tazminat davaları açılabilir. X adlı şirketin ürünlerinin bozuk olduğu, üzünlerin içerisinden çivi vs gibi yabancı maddeler çıktığı hususunda yayın yapılması halinde söz konusu kuruluş maddi tazminat davası açabilmelidir.

2.Resim

            Resim, bir kimseyi başkaları için tanınır kılan her çeşit görünümdür. Fotoğraf, tablo, karikatür, heykel, görüntü  resim olarak kabul edilir. Fotoğraf ve filim kayıtları dışında, fırça, kalem ya da farklı malzemelerle yapılanlar ile bilgisayar çizimleri kişilik hakkına saldırıya konu veya araç olur.

3.Onur ve Saygınlık

             Gerek tek tek insanlar, gerekse bunların bir araya gelerek oluşturdukları tüzel kişiler olan şirketler, dernekler ve partiler de onur ve saygınlığa sahiptirler. Bu onur ve saygınlığa karşı yapılacak kötüleme ve aşağılamalar gerçek yada tüzel kişinin manevi dünyasında zararlara yol açar. Kişi ya da kuruluşun bir örümcek ağı gibi yıllarca uğraşarak oluşturduğu manevi kişiliği birden sarsılır ve bütün bunlar neticesinde kişinin saçları dökülebilir, kalp krizi geçirebilir, ülser olabilir, sokağa çıkamaz hale gelebilir, dostları tarafından terkedebilir, iş hayatı bozulabilir, müşterilerini kaybedebilir, ürünleri kimse tarafından satın alınmayabilir. Neticede söz konusu bir insansa kendini kötü hisseder, bir kuruluşsa da söz konusu firma iş yapamaz hale gelebilir. İşte internette yapılan içeriklerin bu zararı doğurması sonucu, yayıncılar kişi ve kuruluşların zararlarını tazmin etmek ve bu bir hakaret ya da sövme suçu ise cezasını çekmek durumunda olurlar.

4.Özel Hayatın Gizliliği

                      İnsan Hakları Evrensel Beyannamesi’nin 12. maddesinde, kişilerin gizli alanlarına saygı gösterilmesi düzenlenmiştir. Anayasa’mızın 20. maddesinde de “herkes özel hayatına ve aile hayatına saygı gösterilmesini isteme hakkına sahiptir. Özel hayatın ve aile hayatının gizliliğine dokunulamaz” denmektedir. Özel hayatın gerçekleşme alanı olan konut dokunulmazlığı da önemli bir yasak alandır. Bunun yanı sıra haberleşmenin gizliliği özel hayatı koruyan bir sigortadır. Fikir ve Sanat Eserleri Kanunu, Medeni Kanun, Borçlar Kanunu, Türk Ceza Kanunu gibi hukuk kuralları ile özel hayatın gizliliği koruma altına alınmıştır.

Durum kaydedicisi 8-bitlik bir kaydedicidir. Bu kaydedicinin her bir biti ayrı ayrı anlam ifade eder. Mikroişlemci içinde veya dışardan yapılan herhangi aritmetiksel, mantıksal veya kesmelerle ilgili işlemlerin sonucuna göre bu bitler değer değiştirir. Bir işlem sonucunda bu bitlerin aldığı değere göre program yön bulur. Programcı bu bitlerde oluşacak değerlere göre programa yön verebilir. Şekil 1.7’te 6502 mikroişlemcisine ait 1-baytlık durum kaydedicisinin bit şekli göstermektedir.

Bayrak Kaydedicisi



Kabul edilen terminolojiye uyarak, eğer bir bayrağa karşılık olan bit 1 ise söz konusu bayrak kuruldu, eğer bit 0 ise söz konusu bayrak silindi denir.

Carry (elde bayrağı-C): Elde / borç bayrağıdır. 8-bitlik bir işlem sonucunda dokuzuncu bit ortaya çıkıyorsa elde var demektir. Bu durumda C bayrağı mantıksal 1 olur. Bu bayrak biti programcı tarafından kurulur ya da silinebilir (CLC, SEC). Ayrıca bazı komutlar tarafından test edilebilir (BCC, BCS).

Zero (sıfır bayrağı-Z): Sıfır bayrağı, aritmetik ve mantık işlemi sonucunda kaydedici içeriği sıfır ise Z = 1’e kurulur. Aksi durumda sıfırlanır (Z = 0).

Interrupt disable (kesme yetkisizleştirme bayrağı-I): Mikroişlemci normal durumda komutları işlerken bir kesme (IRQ) geldiğinde bu kesme bu bayrak biti ile engellenebilir. Eğer bu bit komutlar (SEI) mantıksal 1 yapılırsa gelen kesmeler göz önüne alınmaz. Ancak bu bayrak mantıksal 0 olduğunda kesme dikkate alınır ve kesme hizmet yordamına dalınır. Yani bu bayrak biti, normal işleyiş sırasında bir kesme geldiğinde kabul edilip edilmeyeceğini belirler. Programcı bunu komutla yapar. NMI kesmesi bu bayrak için kullanılmaz.

Decimal (ondalık bayrağı-D): Bu bayrak 1 olduğunda aritmetik işlemler BCD modunda yapılırken 0 olduğunda ikilik modda yapılır. Bu işlem eğitim ve uygulama açısında programcıya büyük kolaylıklar sağlar.

Overflow (taşma bayrağı-V): Bu bayrak aritmetik işlemlerde, eğer işlem +127 ile -
128 aralığını geçiyorsa bir taşma meydana gelir ve V bayrağı 1 olur. Diğer yandan, yine benzer işlemlerde, eğer pozitif bir sayı ile negatif bir sayı üzerinde işlem yapılıyorsa ve sonuç pozitif çıkması gerekiyorken negatif çıktıysa, bu bayrak 1 olur. Taşma bayrağı işaretli sayılarla işlem yapılırken devreye girer.

Negative (negatif bayrağı-N): 8-bitlik bir işlemcide 7.bit MSB biti olarak bilinir. Eğer MSB biti bir işlem sonucunda 1 ise N bayrağı 1’e kurulur. Eğer MSB biti 0 ise kaydedicisideki değer pozitif demektir ki, N bayrağı 0 olur.

Bayraklardaki 4. bit B (Break) olarak tanımlanmış olup, program durduğunda otomatikman 1 olur. 5. bit ileride kullanılmak üzere boş (+5V) bırakılmıştır.
Farklı mikroişlemcilerde birbirine benzer bayraklar olmasına rağmen faklı bayraklarda olabilir.























8086 Kaydedici Adresleme:
Adından anlaşılacağı gibi kaydediciden kaydediciye yapılan işlemlerde bu adresleme modları kullanılır. En hızlı adresleme modu’dur, çünkü işlem hafızada değil işlemcinin içinde gerçekleşir.

Genel amaçlı ve indeks kaydedicilerde kaydedici adresleme modları:
mov    ax, bx        ; BX teki değeri AX’e kopyalar
mov    dl, al         ; AL teki değeri DL’ye kopyalar
mov    si, dx         ; DX teki değeri SI’ya kopyalar
mov    sp, bp        ; SP deki değeri BP’ye kopyalar
mov    dh, cl         ; CL deki değeri DH’a kopyalar
mov    ax, ax        ; Bu da doğru bir kullanımdır!

Kaydedici adreslemede en çok dikkat etmeniz gereken husus hedef ve kaynağın boyutlarıdır. Örneğin 16 bitlik bir kaydediciden 8 bitlik bir kaydediciye taşıma yapılamaz!

        mov    al, bx         ;yanlış kullanım, derleme anında assembler hata verir.

Küçük boyuttaki kaynaktan büyük boyuttaki hedefe de kopyalama yapılamaz.

        mov    cx, al        ; Yanlış kullanım, AL’ile CX eşit boyutta değil.

Bunlara ek olarak segment kaydedicilerinin kullanımında dikkat edilmesi gereken noktalar vardır.

1- Segment kaydedicileri arasında bir transfer işlemi ancak genel amaçlı bir kaydedici vasıtasıyla yapılabilir.

        mov    ds,cs        ; doğru kullanılmayan segment kaydedicisi şeklinde assembler hata verir!

Bu işi yapmak için,

        mov    ax,cs
        mov    ds,ax

komut satırları kullanılabilir.


2- CS ve IP kaydedicilerinin değeri kaydedici adresleme ile değiştirilemez

        mov    cs, ax        ; kaynak genel amaçlı kaydedici olmasına rağmen bu işlem mümkün değildir!

Segment kaydedicileri programın icrası aşamasında hafızanın segment olarak adlandırılan bölümlerinin adreslerini tuttuklarından, bu kaydedicileri verilerinizi saklamak veya taşımak için kullanmanızı tavsiye etmem, kullanılmamalıdırlar. Bunun yerine genel amaçlı kaydedicileri kullanmanız daha uygun olur.

8086 Hafıza Adresleme Modları

a- Acil Adresleme ( Immediate Addressing )

Herhangi bir genel amaçlı veya indeks kaydedicisine doğrudan bir değer yükleye bilirsiniz. Yüklenecek olan veri kod segmentten alınacağından bu tür kullanımları şahsen ben pek tavsiye etmem. İyi bir program organizasyonu için, veriler hafızanın ayrı bir bölümünde (mesela data segmentte) değişkenler veya sabitler olarak belirtilmelidir.

        mov    al, 17            ; AL’ye 11h yüklenir.

b- Direkt Adresleme (Displacement Only Addressing )

Acil adreslemenin doğru kullanılmış şeklidir. Bu adreslemede segment:ofset adresi kullanılarak hafızaya erişilir.


        mov    al, ds:12        ; ds:000C adresinden 1 byte AL’ye kopyalanır.
        mov    ds:12, al        ; AL’nin içeriği ds:000C adresine kopyalanır.
        mov    ax, ds:12       ; ds:000C adresinden 2 byte AX’ye kopyalanır.
        mov    ds:12, ax       ; AX’nin içeriği ds:000C adresinden itibaren kopyalanır (2 byte)

Aslında kaynak kod hazırlanırken genelde bu şekilde bir kod yazımı yapılmaz. Değişkenler ve sabitler sembolik kelimelerle ifade edildiğinden buna gerek yoktur. Ne var ki debugger programlarında da sembolik değişken isimlerini değil adresleri görürüz. Aşağıdaki kod parçasını inceleyin;

        .data
        sayi1    db 5

        .code
        mov    ax, @data
        mov    ds, ax

        mov    al, sayi             ; 5 değerini al’ye yükler.
        mov    al, ds:0000        ; aynı işi yapar yani 5’i AL’ye yükler.
                                        ; veriler tanımlanırken sayi1 db 5 şeklinde değil de
                                        ; sadece db 5 yazılsaydı, bu komutu kullanmak zorunda kalırdık.


c- Kaydedici Dolaylı Adresleme ( Register Indirect Addressing )

Adının kaydedici olduğuna aldanmayın. Burada operand olarak kullanılan kaydedici köşeli parantez içine alınır ve bu andan itibaren bir offset adresi oluverir.

        mov    al, [bx]        ; hafızadan AL’ye 1 byte taşınır. Alınacak verinin offset adresi BX’in değeridir.

        mov    al, [bx]
        mov    al, [si]
        mov    al, [di]
        mov    al, [bp]

Yukarıdaki 4 örnekte AL’ye kopyalanacak verilerin offset adresleri ilgili kaydedicinin içindeki değerdir. Segment adresleri ise ilk üçünün DS sonuncusunun SS’dir. BP indeks kaydedicisi yalnız başına hafıza adreslemede kullanılırsa, daima stack segmentin (SS) offset adreslerini gösterir. Fakat BP kaydedicisi de dahil olmak üzere bu adresleme segment kaydedicileri de belirtilerek yapılırsa, o zaman ilgili segment:offset adresine erişilmiş olunur.

BX=0000, BP=0001, SI=0002, DI=0003 olduğunu varsayalım;

mov    al, cs:[bx]     ; AL’ye CS:0000’dan kopyalama yapılır
mov    al, [bx]         ; AL’ye DS:0000’dan kopyalama yapılır
mov    al, ds:[bp]    ; AL’ye DS:0001’den kopyalama yapılır
mov    al, [bp]        ; AL’ye SS:0001’den kopyalama yapılır
mov    al, ss:[si]     ; AL’ye SS:0002’den kopyalama yapılır
mov    al, [si]         ; AL’ye DS:0002’den kopyalama yapılır
mov    al, es:[di]     ; AL’ye ES:0003’den kopyalama yapılır
mov    al, [di]         ; AL’ye DS:0002’dan kopyalama yapılır
d- İndeksli adresleme ( Indexed Addressing )

Kaydedici dolaylı adreslemenin operandına sabit bir değer eklenmiş halidir.

Kullanım şekli;

        mov    al, disp[bx]
        mov    al, disp[bp]
        mov    al, disp[si]
        mov    al, disp[di]

Not : disp kısaltması İngilizcede displacement kelimesinin karşılığıdır. Buradaki anlamı ise referans alınan ofset adresidir. Komut setlerinde adresleme modları açıklanırken disp veya mem kısaltması ile çok sık karşılaşacağınızdan, komutları yazarken İngilizce ifadeler kullanmak durumunda kaldım.

Mesela BX=2000h olsun, mov dl, 20h[bx] şeklinde bir komut kullanıldığında, DS:2020h adresindeki 1 byte’lık değer dl’ye kopyalanacaktır. Aynı şekilde BP=3030h olduğunu varsayalım, mov dh,1020h[bp] gibi bir komut ile, SS:4050h adresindeki 1 byte’lık değer dh’a kopyalanır.

Bu adresleme modunda da BP segment kaydedicisi daima SS’in ofsetlerini gösterir. Fakat kaydedici dolaylı adreslemede de olduğu gibi bizzat segment kaydedicisinide belirterek bu adresleme modunu kullanabiliriz. Bu durumda ofset adresleri komutta belirtilen segmentin ofseti olur.

        mov    al, ss:disp[bx]        ; BX normalde DS’nin ofsetlerini gösterirken burada SS’in ofseti olmuş.
        mov    al, es:disp[bp]        ; BP normalde SS’nin ofsetlerini gösterirken burada ES’in ofseti olmuş.
        mov    al, cs:disp[si]         ; SI normalde DS’nin ofsetlerini gösterirken burada CS’in ofseti olmuş.
        mov    al, ss:disp[di]         ; DI normalde DS’nin ofsetlerini gösterirken burada SS’in ofseti olmuş.

e- Taban İndeksli adresleme ( Based Indexed Addressing )

Bu adresleme modu da kaydedici dolaylı adreslemeye çok benzer. Kullanım formatı aşağıdaki gibidir;

        mov al, [bx][si]
        mov al, [bx][di]
        mov al, [bp][si]
        mov al, [bp][di]

BX’in 0500h SI’nın 0360h olduğunu varsayalım,

        mov al,[bx][si]

gibi bir komut işlenince AL’ye kopyalanacak veri DS:0860 adresinden alınır.

Aynı şekilde;

BP=1598h DI=1004 ve mov ax,[bp+di] gibi bir komut işleniyorsa; AX, SS:259Ch ve SS:259Dh adreslerindeki veri ile yüklenir.

SI ve DI kaydedicileri için Intel’in özel komutları vardır, bu yüzden bu kaydediciler genellikle programlamada indeks değerlerini tutar, arttırır veya azaltırlar.

f- Taban İndeksli artı direkt adresleme (Based Indexed Plus Displacement Addressing)

Bu adresleme modu taban indeksli adreslemeye 8 yada 16 bitlik sabit bir değerin eklenmiş halidir.

        mov al, disp[bx][si]
        mov al, disp[bx+di]
        mov al, [bp+si+disp]
        mov al, [bp][di][disp]

BP = 1000h, BX= 2000h, SI= 0120h, DI = 5 olduğunu varsayalım.

        mov al,10h[bx+si]           ; AL’ye DS:2130 adresindeki veri yüklenir
        mov ch,125h[bp+di]        ; CH’a SS:112A adresindeki veri yüklenir
        mov bx,cs:2[bx][di]        ; CS:2007 adresinden itibaten 2 byte’lık veri yüklenir


TASM ve MASM ‘ın adresleme modları için esnekliği.

TASM ve MASM assembler’ları indeksli, taban indeksli, ve taban indeksli artı direkt adresleme için değişik yazım şekillerini desteklerler;

İndeksli adresleme için;

        disp[bx] = [bx][disp] = [bx+disp] = [disp][bx] = [disp+bx]

Taban indeksli adresleme için;

        [bx][si] = [bx+si] = [si][bx] = [si+bx] ;

Taban İndeksli artı direkt adresleme için;

        disp[bx][si] = disp[bx+si] = [disp+bx+si] = [disp+bx][si] = disp[si][bx] = [disp+si][bx] = [disp+si+bx] = [si+disp+bx] = [bx+disp+si]

Yukarıda yazılan bu 3 adresleme modundaki operandlar aynı işi yaparlar. MASM ve TASM "[ ]" sembollerine "+" operatörü gibi davranır. ( disp[bx][si] = disp[bx+si] örneğinde olduğu gibi )

8086 Adresleme Hafıza Adresleme Modlarını Hatırlamak İçin Kolay Bir Yol:

8086 işlemcisi için toplam 17 adet adresleme modu mevcuttur. Bunlar disp, [bx], [bp], [si], [di], disp[bx], disp[bp], disp[si], disp[di], [bx][si], [bx][di], [bp][si], [bp][di], disp[bx][si], disp [bx][di], disp[bp][si], and disp[bp][di] adresleme modlarıdır. Aşağıdaki şekil, bu 17 adresleme modunu ezberlemeniz yerine kolayca hatırlamanıza yardımcı olacaktır.


   Seri iletimde veri genellikle bir kanal boyunca sabit bir oranda gönderilemez.Bunun yerine patlamalı olarak ikili düzende veri bitleri aralıklı olarak gönderilir.İkili düzende veri paketleri aynı şekilde mesaj tamamıyla iletilene kadar değişken uzunluklu aralıklarla iletilir.Alıcının bireysel bitleri kanaldan okuyacağı uygun anları bilmesi için tam olarak bir paketin ne zaman başladığını ve bitler arasında ne kadar süre geçtiğini bilmesi gereklidir.Bu zamanlama bilgisi bilindiğinde alıcı verici ile eş zamanlanmış,yani senkronize edilmiş ve doğru şekilde veri iletimi gerçekleştirilmiş olur.iletimde bu eş zamanlamanın kaybolması verinin bozulmasına ve kaybolmasına neden olur.

Eş zamanlama için iki temel teknik kullanılır.Senkron sistemlerde veri ve eş zamanlama bilgisinin iletimi için iki ayrı kanal kullanılır.Zamanlama kanalı saat darbelerini alıcıya gönderir.Saat darbesinin alınması üzerine alıcı veri kanalını okuyarak o anda kanal üzerinde bulunan bit değerini yakalar.Veri kanalı bir sonraki saat darbesi gelene kadar okunmaz.verici hem veri ve hem de zamanlama darbelerini gönderdiğinden,alıcı veri kanalını yalnızca verici tarafından belirtildiğinde okur ve böylelikle eş zamanlama garanti altına alınır.

Zamanlama ve veri işaretlerinin birleştirildiği ve tek bir kanalın kullanılabildiği tekniklerde mevcuttur.bu teknikler eş zamanlı iletimin modemlerle gerçekleştirileceği yerlerde durumlarda çok yararlıdır.Verinin kendi eş zamanlama bilgisini taşıdığı iki yöntem NRZ ve çift fazlı Manchester kodlamasıdır.Her iki yöntem veri akımının iletim için elektriksel dalga şekillerine kodlanmasını sağlar.

Asenkron sistemlerde ayrı bir zamanlama kanalı kullanılmaz.verici ve alıcı önceden bir baund oranında anlaşmış olmalıdırlar.Alıcı içindeki hassas bir yerel osilatör,vericinin içinde bulunanın belirli bir yüzdesine eşit dahili bir saat işareti üretir.En yaygın seri protokolde veri,sekiz biti mesaj bilgisine karşılık gelen 10 veya 11 bitlik küçük paketler halinde iletilir.Kanal durağan olduğunda işaret gerilimi mantıksal sürekli “I” e karşılık gelir.bir veri paketi,alıcıya,iletimin başladığını uyarmak için her zaman mantıksal “0” (başlangıç biti)ile başlar.Başlangıç biti alıcı içinde gerekli saat darbelerini üretecek dahili zamanlayıcıyı tetikler.Başlangıç bitini takiben sekiz bitlik mesaj üzerinde ulaşılan baud oranı ile alıcıya bit bit gönderilir.

Asenkron sistemlerde paket boyu,alıcı ve vericideki yerel osilatörlerin birbirinden kopuk çalışması riskini azaltmak için kısa tutulur.yüksek kaliteli kristal osilatörler kullanıldığıdında 11 bitlik periyot boyunca eş zamanlama garantilenebilir.her yeni paket iletiminde başlangıç biti eş zamanlamayı yeniler ve böylelikle paketler arası boşluk süresi keyfi seçilebilir.RS-232 standardı seri bir arabirimin elektriksel,zamansal ve mekanik karakteristiklerini belirlemesine rağmen asenkron seri protokolünü kapsamaz.
Buraya kadar dış cihazla mikrobilgisayar arasında veri transferine ilişkin iki yöntem incelendi. Programlı G/Ç yöntemi, düşük işlem verimine rağmen, mikroişlemciyi dış cihaza senkronlar. Kesmeli G/Ç yöntemi ise en doğal yöntemdir ve mikroişlemci yalnız istek gelince cevap verir. Bu yöntem büyük yazılım olmadan, mikroişlemciyi en verimli biçimde kullanır. Programlı G/Ç yöntemine göre daha kısa cevap süresine sahiptir, ama veri transfer oranı yine düşüktür. Bunun üç sebebi vardır.

1. CPU kesme isteğini algıladığı zaman, program sayıcı içeriğinin korunması ve kesmenin onaylanması için bazı mikroemirler koşar. Fırın sıcaklığı denetimi örneğinde olduğu gibi, eğer her sıcaklık verisi için bu işlemin yapıldığını ve bu veri transferinin çok sık tekrarlanıldığı varsayılırsa, bu tür işlemler CPU’nun oldukça uzun zamanını alır.

2. Fırın örneğinde olduğu gibi, kesme servis programı verileri dış cihazdan mikrobilgisayara transfer edecekse, veri sayıcıya bellek adresini yükleyen, G/Ç kapısından akümülatöre veri taşıyan, ve daha sonra veri sayıcı ile adreslenen bellek alanına akümülatör içeriğini saklayan emirler içerir.

3. Birinci maddede anlatılanların tersine uygulanmasını, yani CPU kaydedici içeriklerinin yığından çağrılmasını gerektirir.
Bu kadar çok işlemin örneğin bir baytlık bilginin transferi için yapılması, çok sayıda CPU saat periyodunu alacaktır. Veri transferini bir veya birkaç saat periyodunda gerçekleyebilecek başka bir yöntem olmalıdır.

Veri transferinde kullanılan üçüncü yöntem doğrudan bellek erişimidir (direct memory access). DMA kullanıldığı zaman, dış cihaz mikroişlemciye değil ana belleğe senkronlanır. Bellek erişim süresi çok kısa olduğundan, transfer oranı çok yüksek olabilir.

DMA kavramını anlayabilmek için, veri transferinde gerçek darboğazın mikroişlemcinin kendisi olduğu bilinmelidir. Fınn örneğinde, her veri transferinde CPU’nun yaptığı iş veri bellek adresini güncelleştirmek, yani bir artırmaktır. Bu kadar basit iş için CPU’nun aracı olmasına gerek yoktur.

DMA yönteminde CPU dışlanarak dış cihazın ana belleğe erişimine izin verilir, yani doğrudan bellek erişimi yapılır. Eğer bellek her 200ns de yeni bir bayt alabiliyor veya verebiliyorsa, veri transfer oranı 5 milyon bayt/sn değerine yükselmiş olur.

G/Ç kapılan ile bellek arasında veri taşıma görevi yapan yeni bir lojik kurulacaktır. DMA denetleyici adını alan bu yeni lojik görevini, CPU lojiğini bastmp uygun veri transferini sağlayacak işaret dizisini yaratarak yapar.

CPU bir saat işareti ile sürüldüğünden, geçici olarak CPU lojiğini bastırmak kolaydır. Saat işaretini durdurarak CPU susturulabilir. Bu amaçla Şekil 5.33’te gösterildiği gibi, CPU’nun denetim yoluna yeni iki hat ilave edilecektir, bunlar BUSRQ yol isteme hattı ve BUSAKyol onaylama hattıdır. El sıkışma hatlan sadece CPU ile DMAC arasında değil aynı zamanda DMA denetleyici (DMAC) ile dış cihaz arasında da olmalıdır. Dış cihaz MEŞGUL/HAZIR bayrağını kullanarak DMA denetleyiciye DMARQ hattı üzerinden veri transfer isteğini gönderir. DMA denetleyici dış cihazın bu isteğini BUSRQ hattını aktif yaparak CPU’ya iletir. CPU ise mevcut makina periyodunu tamamladıktan sonra BUSAK hattını aktif yaparak bu yol isteğine cevap verir. CPU aynı zamanda veri, adres, ve denetim yollarını yüksek-Z durumuna sokar. DMA denetleyici bu durumu DMACK hattını aktif yaparak dış cihaza bildirir.

Şimdi bellek ve G/Ç cihazları kendilerini DMA denetleyici ile yüzleşmiş olarak bulur. İki sınıf DMA vardır. Ardışık DMA çalışmada DMA denetleyici okuma işlemi yaparak veriyi DMAC’a getirir. Daha sonra yazma işlemi yapılarak bu veri G/Ç kapısına transfer edilir. G/Ç kapısından okuyup belleğe yazma şeklinde tersine bir çalışma da mümkündür.


Kesmeli Giriş/Çıkış 

Programlı G/Ç (yoklama) yönteminde iki sınırlama vardır. Birincisi, yoklama yöntemi mikroişlemci zamanının harcanması demektir, çünkü CPU sürekli olarak tüm dış cihazların (peripheral) durumunu denetlemelidir. İkinci olarak, .yoklama tekniği yavaştır, çünkü herhangi bir dış cihaza tekrar geri gelmeden önce tüm G/Ç cihazların durumu test edilmelidir. Gerçek-zamanda (real-time) çalışan sistemlerde bu duruma izin verilmez çünkü böyle sistemlerde dış cihazlara belirli bir süre içinde servis vermek zorunluluğu vardır. Özellikle hızlı çalışan dış cihazlar sisteme bağlandığı zaman, yoklama yöntemi minimum servis gereklerini karşılamak için yeterli hızda olmayabilir. Disk veya CRT gibi hızlı çalışan cihazlar, veri transferini kayıpsız olarak gerçeklemek için hemen hemen ani cevap gerektirir.
Yoklama bir senkron mekanizmadır, ve bu mekanizma ile cihazlara sırayla servis edilir. Kesme ise asenkron. mekanizmadır. Kesmeli çalışmanın ilkesi Şekil 5.8’de gösterilmiştir. Dış cihaz mikrobilgisayarın dikkatini çeksin diye CPU’larda bir denetim işareti vardır. Buna kesme işareti (INT) denir, çünkü dış cihaz mikrobilgisayar sisteminin o anda ne iş yaptığına bakmaksızın mikrobilgisayara kesme vererek dış lojiğin ihtiyaçlarına cevap vermesini ister. Her dış cihaz, kesme işaretini CPU’ya kapılayan, bir kesme hattına bağlanır.


CPU’lar her emir icrasının sonunda kesmeleri denetler. Eğer bir kesmeye rastlarsa, CPU o kesme yapan dış cihaza servis eder. Kesme yoksa, CPU bir sonraki emirin icrasıyla ana programı koşmaya devam eder. Bu durum Şekil 5.9’da gösterilmiştir.

Kesmeli çalışma basit bir örnek üzerinde incelenecektir. Fırın sıcaklığını, ayarlanabilen belirli bir sıcaklıkta tutmaya yarayan bir mikrobilgisayar sistemi düşünülsün. Fırın sıcaklığı sayısal bir termometre ile ölçülüp mikrobilgisayara gönderilmektedir. Mikrobilgisayar bu sıcaklık değerini, daha önce başka bir yolla bilgisayara verilmiş referans bir sıcaklık değeri ile karşılaştırır. Arzulanan ile gerçek sıcaklık değerleri arasındaki farka bağlı olarak, mikrobilgisayar ısıtıcıyı denetleyen işareti üretecek veriyi çıkış kapısına gönderir. Böylece fırın sıcaklığı sabit tutulmaya çalışılır.



Isıtıcıyı denetleyerek fırın sıcaklığını istenilen değere hemen ayarlamak mümkün olmadığından, sıcaklık ayan için mikrobilgisayarın koşması gereken yetenekli bir programın olması gerekir. Bu programa AYAR adı verilecek ve program bellekte aşağıdaki gibi gösterilecektir.

KAYIT adlı başka bir program termometreden sıcaklık değerini alıp mikrobilgisayara getirecektir. KAYIT ile AYAR programlan arasındaki bağ şöyledir; KAYIT program sıcaklık değerini termometreden okuyup bellekteki veri tampona koyar, AYAR program ise bu tampondan aldığı bilgiyi işleyerek ısıtıcıyı denetleyen işareti üretecek değeri belirler ve onu ısıtıcıya gönderir, Şekil 5.10.
AYAR program veriler üzerinde bir takım hesaplar yaptığından icrası KAYIT’a göre daha uzun süre alır, ve bu yüzden CPU tarafından sürekli koşulan program olarak yorumlanır. Termometrenin sıcaklık ölçüm işlemini ne zaman tamamladığını mikrobilgisayarın bilmesi mümkün değildir. Bu yüzden AYAR koşulıırken termometreyi arasıra okumak bazı ölçüm değerlerinin kaybına yol açabilir. Emniyetli çalışma için termometrenin, hazır olduğunda, mikrobilgisayarı uyarması en uygun yoldur. İşte böyle bir çalışma kesmeli G/Ç yöntemiyle mümkündür.


Kesmeli G/Ç yönteminde mikrobilgisayarın dikkati çekilerek termometredeki sıcaklık değerinin okunması aşağıdaki dört adımlık işlemle gerçekleştirilebilir.
1. Termometre sıcaklık ölçümünü tamamladığı zaman, paralel G/Ç arayüz cihazı (PIA) üzerinden CPU’ya IREQ kesme isteğini INT işareti olarak gönderir.
2. Mikrobilgisayar bu kesme isteğini kabul veya red etme seçeneğine sahiptir. Kesme isteği CPU tarafından onaylanınca, IACK onaylama işareti CPU tarafından PIA cihazına gönderilir.
3. PIA cihazı kimlik bilgisini veri yolu üzerinden göndermek için IACK işaretini kullanabilir.
4. PIA dış cihaza, yani termometreye, mesaj göndererek, verisini PIA G/Ç kapısına koyabileceğini söyler. Daha sonra bu kapıdaki bilgi veri yolu üzerinden akümülatöre getirilir.








Programlı Giriş / Çıkış :

Bu yöntemde veri transfer isteğinin algılanması ve verilerin transferi tamamen programla yapılır. Dış cihaz istek işaretini göndermese de, CPU sürekli olarak bu isteğin gönderilip gönderilmediğini test etmelidir. Test esnasında CPU başka bir iş yapmadığı için, isteğin de gelmemesi durumunda bilgisayar tamamen boş kalmış olur. Çoğu iş programla yapıldığından, en az donanım gerektiren ve sonuç olarak en ucuz olan yöntemdir.


Dış cihazın erişebileceği, dışarıya gönderilen verinin koyulduğu yeri gösteren bir protokol olmalıdır. Veya tersine, mikrobilgisayar sistemine verileri sokabilmek için, önceden belirlenmiş bir yere dış cihazın verileri koyması gerektiğini mikrobilgisayar sistemi bir protokol ile belirlemelidir.
Veri, mikrobilgisayar ile dış cihaz arasında her iki yönde olacak şekilde bir G/Ç kapısı (port) üzerinden transfer edilir. G/Ç kapısı, CPU’nun veri yoluna ve dış cihazın eriştiği uçlara bağlanan bir G/Ç kapısı tamponundan (buffer) oluşur.

Dış cihaz mikrobilgisayara veri göndereceği zaman, veriyi önce bu G/Ç kapı uçlarına koyar ve CPU bu uçlan okuyuncaya kadar verinin burada sabit durmasını sağlar. G/Ç tamponu, veri yolu üzerinden CPU ile sürekli haberleşemez, çünkü CPU veri yolu üzerinden bellek ile haberleşiyor olabilir. Bu yüzden CPU, G/Ç kapısını seçer ve G/Ç tamponunun içeriğini, verinin bellekten okunmasında olduğu gibi, okur. Bellekten okuma ile G/Ç tamponundan okuma arasındaki en belirgin fark, bellekten okurken bellek istek hattı MREQ aktif olurken G/Ç tamponundan okumada IOREQ hattının aktif olmasıdır.




Şekil 5.1’deki G/Ç kapısının, veri yolunda herhangi bir veri çekişmesine yol açmaması için yüksek-Z özelliğine sahip olması gerekir. Aynca bir bilgisayar sisteminde bu tür giriş-çıkış kapılarının sayısı genelde birden çok olduğundan, bu kapıların adres- lenebilir olmasa yani CPU konuşacağı dış cihazı tanımlayabilmesi gerekir. Bu amaçla üzerinde birden çok G/Ç kapısı olan adreslenebilir G/Ç yüzleştirme cihazları geliştirilmiştir.

Bu gereksinimlere uygun bir Paralel G/Ç Arayüzü tasarlamaya çalışalım. Her elektronik cihazda en az iki besleme gerilimi ucu bulunmalıdır. CPU ancak adresleyebildiği birimlere erişebileceğinden, adreslemek amacıyla 16-adres hattının bu arayüze bağlanması uygun değildir; çünkü 40-bacaklı böyle bir birimde 16-bacaklı adrese ayrılması diğer işler için bacak kullanımını sınırlar. Bu yüzden bu tür cihazların seçilmesi genelde bir adres kodçözücünün sürdüğü yonga seçme (CS) ucu sayesinde olur. Ama arayüz cihazında bulunan kapılara ve bazı denetim ve durum kaydedicilerine erişmek için CPU’nun adres hatlarından en anlamsız iki veya üç tanesi genelde bu cihaza
uygulanmalıdır, Şekil 5.2.

Dış cihaza gönderilecek veya dış cihazdan alınacak veriler arayüz üzerinden geçeceğinden, CPU’nun arayüz cihazına veri yolu ile bağlanması gerekir. Veri transferinin çift yönlü olması arayüz cihazına yazma ve okuma yapmayı gerektirir. Bu gereksinim RD ve WR denetim işaretlerini doğurur. CPU ve tüm arayüz cihazlarının RESET işaretiyle başlangıç durumuna sokulması gerektiğinden, bu arayüz cihazının da RESET bacağına sahip olması uygundur.



Geriye kalan 24 bacaktan 16 tanesi, her biri 8-bitlik olan iki adet G/Ç kapısına aynlır. Bazı arayüzlerde bu kapılann sayısı üçtür. Bunlardan ikisi veri kapısı olarak, diğeri de bu veri kapılanna ilişkin denetim bilgilerinin iletilmesi için kullanılır. Burada A ve B olmak üzere iki veri kapısı kullanılacaktır. Geriye kalan 8-bacak ise kesmeli G/Ç için gerekli denetim işaretlerinin iletiminde bir sonraki kısımda kullanılacaktır.

Mikrobilgisayar ile dış cihaz arasında kör şekilde veri transferi her zaman yeterli G/Ç yeteneği sağlamaz. Veri transferinde aşağıdaki ihtiyaçların da karşılanması önemlidir.

1. Mikrobilgisayar, dış cihaza verinin G/Ç tampona koyulduğunu ve alınmaya hazır olduğunu haber vermelidir. Tersine dış cihaz da mikrobilgisayar tarafından okunmak üzere veriyi G/Ç tampona koyduğunu gösteren bir araca sahip olmalıdır. 2. Mikrobilgisayar ve dış cihaz, G/Ç tampona koyulan verinin yapısı hakkında diğerine bilgi verebilmelidir. Transfer edilen veri değişik yorumlamalara konu olabilir. Örneğin veri, tamamen sayısal bir veri olabilir, veya gerçekleştirilmiş veya gerçekleştirilecek işlemleri belirleyen bir kod olabilir. Aynı zamanda bir adres parçası da olabilir.

Olayları veya veriyi belirlemek amacıyla mikrobilgisayarın dış cihaza gönderdiği işaretlere G/Ç denetimleri denir. Dış cihazdan mikrobilgisayara gönderilen bu tür bilgiye de G/Ç durumu denir. Akış yönüne bakarak bilgileri bu şekilde sınırlandırmak akla uygundur. Çünkü mikrobilgisayar, dış cihazın işlerini denetlemek için denetim işaretlerini gönderir. Dış cihaz ise mikrobilgisayarı denetleyemez, o yalnız incelenmek üzere durum bilgisini gönderir.

CPU, bellek, ve paralel G/Ç arayüz cihazından oluşan basit bir mikrobilgisayar Şekil 5.3’te gösterilmiştir. Burada B G/Ç kapısı denetim ve durum bilgilerini göndermek için kullanılırken A G/Ç kapısı da veri transferi için kullanılabilir. Kelimenin veri, denetim veya durum bilgisi olduğunu mikrobilgisayarın verileri değerlendirme şekli belirler.




Mikrobilgisayar sistemini oluşturan lojik ile mikrobilgisayar sisteminin dışındaki lojik arasında cereyan eden veri transferine genel olarak Giriş/Çıkış ( I/O ) adı verilir. CPU ile birlikte çalışmak üzere tasarlanmış tüm lojik, mikrobilgisayarın sınırlan içine girer. Bunun dışındaki diğer tüm lojikler de dış lojik olarak bilinir, ve bundan böyle dış cihaz olarak adlandırılacaktır.

Mikrobilgisayar ile dış cihaz arasındaki veri transferi biri seri diğeri paralel olmak üzere iki şekilde yapılabilir. Seri yöntem daha ziyade mikrobilgisayarlardan çok uzakta bulunan cihazlara veri transferi için kullanılır. Amaç, veri bitlerini tek bir hat üzerinden seri biçimde göndererek her bit için ayn bit hattı kullanmayı engellemek ve böylece iletken sayısından tasarruf etmektir. Hat tasarrufu bu yöntemin üstünlüğüdür, ama veri transferi hızının düşük olması en büyük dezavantajıdır. Bu yöntem ayrıntılı olarak bir sonraki bölümde anlatılacaktır.

Paralel G/Ç yönteminde her veri biti için ayrı bir iletken kullanıldığından veri transfer hızı yüksektir. Veri giriş çıkışı olayında, mikrobilgisayar ile dış cihazın yüzleştirilme biçimi açık olarak bilinmelidir. Bu yüzleştirme, verilerin transferi ve olayların oluşumunu gösteren denetim işaretleri hakkında bazı koşullar içermelidir.
Mikrobilgisayar sistemi ile dış cihaz arasında veri transferini gerçeklemek için bir çok yol olmasına rağmen, bunların hepsi üç sınıf altında toplanabilir.
DMA (Direct Memory Access: Direkt Bellek Erişimi) belleğe veri aktarımını ve bellekten veri okumayı; Merkezi İşlem Birimi’ni veri transferi işleminde devre dışı bırakarak, sistemin çalışmasını hızlandıran ve işlemci yükünü azaltan bir yöntemdir.
Normal şartlardan bellekten(/belleğe) veri okumak(/yazmak) istediğimizde, veri ilk önce bellekten(/kaynaktan) okunur ve işlemciye taşınır. İşlemci üzerinden tekrar taşımak istediğimiz adrese; yani aygıta (RAM, HD vb) gönderilir. Buradaki sakınca şudur: Taşımak istediğimiz veride hiçbir değişik yapmasak bile işlemci bu transferlerde etkin rol oynar ve taşınan veri her seferinde işlemciye uğrar. Sistem kaynaklarını bu şekilde kullanmak; fazladan işlem gücü, zaman kaybı ve sistem yavaşlığı olarak sistem performansına yansır. Ayrıca bu taşıma sırasında işlemci yapabileceği diğer işlemleri de yapamaz. Eğer taşıdığımız veriler çok büyükse -örnek olarak veri görüntü kayıt kartından veya ağ kartından geliyorsa- bu işlemler sistemimizin performansını büyük ölçüde yavaşlatır.
Veri transferleri sırasında oluşacak bu negatif etkinin önüne geçmek için; işlemciyi bu akışın içinden çıkarmak ve veri transferi yapmak isteyen aygıta bellek erişimine izin verecek bir yöntem gereklidir. Çeşitli tipleri (mod’ları) olan bu yönteme genel olarak DMA diyoruz. Çalışma mantığını biraz daha açarsak iş akışı şöyle özetlenebilir.
Diyelim ki DMA ile kullanacağımız aygıt video kayıt kartı (frame grabber). Kameradan gelen görüntüleri algılayıp, gerekli işlemleri (filtreleme, analog-dijital çevrim-parlaklık vs) yaptıktan sonra oluşan görüntüyü -640*480 çözünürlük, 256 renk ve saniyede 25 frame ile bir saniyelik veri büyüklüğü 7.3MiB veri transferine eşittir- sistem belleğine atmak için DMA denetleyicinden veri yollarının kontorlünü alır. Bu aşamadan sonra işlemci veri transferlerine karışmaz ve transfer dışında kalan işlemleri yapmaya devam edebilir. Video kayıt kartımız (PCI olduğunu varsayarsak sn 133 MiB veri transferi şansı vardır. Bu da 7.3 MiB’lık veri için 50 ms sürer) görüntüyü belleğe attıktan sonra işlemciyi -genellikle kendine ayrılmış interrupt ile- veri transfer işleminin bittiğine dair uyarır ve veri yolunun kontrolünü bırakır. Bu yöntemle çok büyük veriler işlemcinin yaptığı işe ara vermesine gerek bıraktırmadan taşınabilir. Teorik olarak bu veri transferinin işlemciye yükü %0'dır.
Pratikte görebileceğimiz en iyi örnek ise CD*ROM’u DMA modundan PIO moduna alıp CD’den veri okumaya başladığımız durumdur. Bu durumda işlemci yükü %20'nin üstüne rahatlıkla çıkabilir. DMA’nın Multiword DMA, Ultra-DMA gibi farklı çeşitleri de vardır.

1
Assembler' a Giriş - II

Kesmeler (Interrupts)

Kesmeler özellikle gerçek modda çok önemli olan bir konudur. Ancak korumalı modda da en düşük seviyede kesmeler kullanılmaktadır. Kesmeler programcılar açısından kısaca sistemin bize sağladığı fonksiyonlardır. Sistem açısından ise, kullanılan işletim sistemi ile bilgisayar arasındaki kontrollü çalışmayı sağlama ve gerektiği kadar paylaşımı oluşturmadır. Buradaki paylaşım sistemin ve işletim sistemimin kaynaklarının paylaştırılması. Örneğin bir tuşa basılıp basılmadığını ve hangi tuşa basıldığını öğrenmek için sistem bize sadece klavye konusunda bir kesme vermiştir.  Bunu kullanarak program içerisinden hangi tuşa basıldığını öğrenebiliriz. Yada hangi ekran modunda olduğumuzu yine kesmeler vasıtasıyla öğrenebiliriz. Kesmelerin olmadığı bir program düşünürsek o zaman zor ve çok yüksek bir bilgi birikimi gerektiren "donanım programlaması" yapılması gerekir.

Kesmelerin gerçek modda "kesme tablosu" olarak adlandırılan 0:0 adresniden başlayan bir tablosu vardır. Bu tabloda kesmeler 4 byte aralıkla birbirlerini takip ederler. Bunun nedeni gerçek modda 64kb ' lık segment - offset sistemidir. 16 bitlik segment adresi önce, 16 bitlik offset adreside sonra takip eder. Bu kesme vektörleri değiştirilerek "geridönüm" (callback) yapmak şartıyla yönlendirilebilirler (Hook). Bundan yararlanarak ortaya TSR (terminate and stay resident -sonlan ve kal-) ortaya çıkmıştır. Sistemin istenilen bir fonksiyonu alınarak filitre edilebilir ve o fonksiyon kullanıldığında istenilen program parçacığı çalıştırılabilir. Ayrıca sistemin debug için kesme 1 ve kesme 3 olarak ayırdığı iki kesmede mevcuttur. EFLAG bayrak registerininin TR biti (trap biti = kapan veya debug biti) set edilince CPU her komuttan sonra kesme 1 ' i çağırır. Böylece debug etme işlemi yapılmış olur.

Bayraklar ( Flaglar)

Bayrak komutları ve olayları deyince aklımıza hep sayıları oluşturan bit'ler gelmeli. Basit olarak iki sayının karşılaştırılmasında ortaya o sayının aynı olduğu, aynı olmadığı, büyük veya küçük olması yada sıfır olması gibi durumlar çıkar. Bu durumları öğrenmenin tek yolu o duruma göre şekil alan bayrak register (f) bitlerinin durumunu öğrenmemizdir. Bir test veya bir matematiksel işlem olduğu  durumlarda  sonuclar daima bayrak registerin ilgili bitlerine yansır.

Bayrak register gerçek modda 16 bit, korumalı modda ise 32 bitliktir. Yani gerçek modda toplam 16 bit tane sebeb-sonuç biti ayrılmış aynı şekilde korumalı modda 32 tane sebeb-sonuç biti ayrılmıştır.32 bitlik bayrak registere EFlag adı verilir ve aynı 16 bitlik şekli gibi sadece ilk 16 biti kullanılır.(Bazı bitler dökümante edilmemiştir). EFlag registerin sonraki 16 biti ileride yapılacak  CPU güncellemeri için ayrılmıştır.En başlıca olanları ZF (zero flag), CF (carry flag) ,SF, AF, gibidir. Örneğin bir işlem sonucu 0 ise ZF set olur yani 1 olur.

Bayraklar işlevleri açısından 3 gruba ayrılılar. Status flaglar (durum bayrağı), Control flaglar (kontrol bayrağı) ve, System flaglar (sistem bayrağı). Durum bayrakları programın içindeki komutsal, mantıksal ve matematiksel işlemlerin sonuçlarını verir. Genelde kullanılan bayraklar bunlardır. Kontrol bayrağı sadece 1 tanedir ve ileride göreceğimiz repz komutunun aşağı yada yukarı işlem yapma şeklini ayarlar. Sistem bayrakları ise sistemle ilgili işlemler için kullanılır. Genelde bunları işletim sistemi yada kullanacağımız debugger gibi yüksek düzeyli bir program değiştirir.

Bayrak registerin tam yapısı aşağıdaki gibidir:

0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11-31
CF ? PF ? AF ZF SF TF IF DF OV ? IO ? NTF RF V86 -
Komut Noktası registeri (IP)

Bu register çalışmaktan olan sistemin yada programın o anda hangi adreste olduğunu komutun başlangıç noktasından itibaren belirtir. Örneğin   bir programı debug ederken  her F8 (trace) tuşuna basınca o komut işletip bir alt komuta geçer. İşte o anda IP register o komutun işlemesi ile sonraki komutun başına gelmiş olur. Böyle kod zinciri sağlanmış olur. Bunu CPU otomatik olarak kendisi düzenler. Yine moda göre uzunluğu ve ismi değişir, gerçek mod daha önce anlattığım gibi segment:offset sistemine sahip olduğu için IP register 16 bit olur. Yani sadece offseti gösterir. Ancak korumalı modda bütün 32bit olan registerin başına aldığı 'E' (Extended) harfini alarak EIP olur. Bu registeri direkt olarak MOV EAX,EIP şeklinde elde edemiyoruz. Çünkü bu registerin değişmesi yada farklı bir değer alması sistemin çalışma bütünlüğünü yok eder ve sistemde hatalarına neden olur. Bunu bir su yoluna benzeterek  örnekleyebilirim. Örneğin bir nehrin suyunun rasgele başka bir yere yönlendirildiğini düşünelim. O zaman istenmeyen su baskınları ve ekinleri- evlerin zarar görmesine hatta ölümlere neden olacaktır.  Yinede sistem debug API' leri ile veya aşağıdaki gibi basit bir yöntemle o andaki IP noktası bulunabilir.

         call delta
delta:
        pop eax
        sub eax,5

Burada ileride göreceğimiz CALL komutunu bulunduğu yeri yığın içine atmasından yararlanıyoruz. SUB EAX,5 ile o zamana kadar işletilen kodun uzunluğunu çıkarıyoruz ve sonuçta elimize baştaki komutun çağrıldığı IP noktası kalıyor.

IO Portları

Donamın bize temel işlemler ve sistemi bütün kaynakların kullanmak için kaynak paylaşımını ve erişimini sağlayan erişim kanallaı vermiştir. Aslında sistemdeki ek aygıtlar (ekran kartı, ses kartı..) hepsi sistemler bu portlar vasıtasıyla haberleşmekte ve işlemleri yerine getirmektedir. Bunlara ilaveten daha önce bahsettiğim kesmeler tamamlayıcı bir roldedir. Donamın portları normal programlarda kullanılması hem karışık hemde zor olduğu için genelde çok yüksek düzeyli uygulamalarda direkt olarak kullanılırlar. DOS altında korumalı modda 8 ve 16 bitlik değerlerle istenildiği gibi kullanılabilir ancak korumalı modda en yüksek hassasiyet değerinde (ring 0) olma zorunluğu vardır. Gerçek modda daha doğrusu DOS ortamında bir *.com programı dışarıdan hiç kesme, adres kullanmadan kendi başına bir sistem programı oluşturabilir. Ancak korumalı  modda bu pek mümkün değildir. Bu işletim sisteminin istediği özelliklerden kaynaklanır. Bir *.com dosyası salt makina kodudur ve uygun bir programlama ile sistemin her yerinde çalışabilir (örneğin virusler) Ancak bir windows programı IO programlarının kullanılma kısıtlılığı ve PE dosya yapısı nedeniyle bunu pekde başaramaz. Burada IO portlarının derin bir işlevlik gücü ortaya çıkıyor.

IO portları için 8,16 ve 32 bitlik özel opkodlar tahsis edilmiştir. Genelde asıl port numarasından önce status port denilen ve ön değerlerin gönderilip - alınan veya   kontrol edilen  port(lar) vardır. Hatta bazı donanım sistemlerinde bu   portları 6-7 taneye kadar çıkarak konbine çalışmayı gerektirir.

Örnek vermek gerekirse sistenm CMOS hafızasını okumak için 70h portu kullanılır. Burada CMOS'un 15 ve 16. byteları okunarak hafıza uzunluğu öğreniliyor.

mov ax,1516
out 70h,al
in al,71h
mov byte ptr [hafıza_low],al
mov al,ah
out 70h,al
in al,71h
mov byte ptr [hafıza_high],al
ret

  Bu örneği portlar kullanılmı hakkında daha iyi fikir edinilmesi için verdim. Normalde sistem kesmeleri, API kütüphaneleri ile bu işlem rahatça elde edilebilir. Fakat burada söyle bir fark var. Sistem kesmeleri (interruptlar) ve Windows API kütüphaneleri vectörleri kullanıcı tarafından ele geçirilerek (hook )  istenildiği gibi kısıtlama yada değiştirilme olanağına sahiptir. Ancak IO portları için böyle bir ele geçirme (hook) mümkün değildir. Bunlar tamamen donanıma ait portlardır.

Assembler komutları

Bu kadar genel ve ön bilgi sonrası artık komutları tanımaya başlayabiliriz. Assembler komutları genel amaçlı komutlar, mantıksal komutlar, sistem komutları, gibi bölümlere ayrılmaktadır.

Daha önce söz ettiğimiz MOV, LEA komutları registerleri yükleme, adresleme veya değerini bir yere yazdırma için kullanılır. Genel kullanılış şekli : MOV register, değer veya MOV [adres],register şeklindedir.  Bu komut birden fazla registeri bir arada kullanmayada olanak verir. Örneğin : MOV register, [register+register] gibi.

mov register,[adres]
mov [adres],register
mov [adres+register],register
mov register, [adres+register]
mov register, [register+register]

gibi burada sadece registerler arasında toplama değil çıkartma ve çarpma işlemide yapılabilimektedir.

LEA komutu hem registere değer yüklemek için hemde doğrusal bir hafıza adresinin alınması için kullanılır.

lea register, adres
lea register, [adres]
lea register, register*4
lea register, register+10h

gibi kullanılır. İleride uygulamalı örneklerde MOV ile LEA arasındaki daha iyi farkı göreceksiniz.

Ayrıca LES, LDS, LFS, LSS, LGS  gibi genelde gerçek modda ve yüksek düzeyli korumalı mod mimarisinde kullanılan  register yükleme komutlarıda vardır. Bunlar interrupt ve segment ayarlamalarında kullanılır. Korumalı modda Segment seçici görevini yerine getirir. Şu andaki sistemlerde çok fazla kullanım alanları yoktur.

Buradan sonra çok kullanılan önemli komutları inceleyeceğiz. Bazı komutlar çalıştıktan sonra birden fazla komutu etkileyebilir. Bunların mümkün olduğunca açıklayacağım. Ayrıca mümkün olduğunca her komut için örnek vereceğim.

Registerleri değiştiren, aktaran, ekleyen başka komutlarda vardır.

XCHG KOMUTU

XCHG komutu  iki registerin yada registerler bir yerin yer değişimi sağlar. Bu komut 4-5 tane ayrı komut yapılacak bir işleömi tek başına gerçekleştirir. Kullanılışıda çok basittir.

XCHG REG1, REG2

XCHG REG, [ADDR]

XCHG [ADDR],REG

gibi kullanılır. Buradaki tek şart yer değişecek register veya adresin aynı bit uzunluğuna sahip olmasıdır.

XLAT  KOMUTU

XLAT komutu esas olarak BX (veya EBX) registeri esas alarak çalışır. Buna göre BX registerle gösterilen bir adresteki bilgiyi almak için AL registeri BX register ile toplar ve gösterdiği noktadaki bilgiyi (8 bitlik) alıp AL register yükler. Bu işlemde sadece AL registerin değeri değişir.

Örneğin:

yazi   db 'ABCDEFGH',0
...

        mov al,3           ; AL = 3
        lea ebx, yazi    ; EBX = yazi [ABCDEFG]
        xlat                  ; EBX+AL = [- - *---]   AL= 'C' olur
XLAT komutunu bazı zamanlar XLATB olarakda geçer ve bunlar farklı değil ikiside aynıdır.

MOVSX ve MOVZX komutları

Bu komutlarda diğer komutlar gibi kodu kısatmak ve daha hızlı işlem yapmak içindir. MOVZX komutu bir adresdeki 8 bitlik sayıyı 8 bit registere yükler ama 8 bit dışındaki bitleri resetler (sıfırlar) Böylece elimizde 8 bitlik tertemiz bir değer olur. MOVSX  komutuda benzer olarak registeri yükler ve diğer bitleri temizler ancak bu işlem 16 bitten 8 bite veya 32 bitten  8 bite olmaktadır.

deger2  db 10
....
mov eax,12345678h                   ; eax = 12345678
movzx  eax, byte ptr [deger2]     ; deger2 = 10, eax =10 oldu

Yuıkarıdaki örnekte önceden EAX registere 12345678 gibi 32 bitlik bir değer girdik. [deger2] adresinin 8 bit olduğuna dikkat edin. MOVZX komutndan sonra EAX register sadece 10 değerini alacaktır. Eğer MOVZX kullanmadan normal bir AL register yüklemesi yapsaydık EAX registerin sadece AL kısmı değişecek ve EAX 12345610 değerini alacaktı.

Kombine Veri komutları (LODS, MOVS, CMPS, STOS, SCAS)

Bu komutlar birden fazla registerle, birden fazla kere işlem yapmayı amaçlayan güçlü ve komutlardır. Bunlar tekil olarak yada REPZ, REPNZ, REPNE gibi bu komutlara özel tahsis edilmiş yardımcı komutlar ile beraber çalışır. Hepsi yanına yapacağı bit sayısına göre ek alırlar Bu komut kullacağı bit değerine göre yanına simge alır. Ancak bu bizim tarafımızdan tahsis edilen bir özellik değildir. Bu standart komut setinin ayrı ayrı ayırdığı opkodlardır. Bu opkodlar konunun sonunda göreceğimiz REP komutu ile kullanılışında  her defasında yapılacak işlem miktarınıda ayarlar.

B = byte  (8 bit) bazında işlem
W= word (16 bit) bazında işlem
D= dword (32 bit) bazda işlem

Öncelikle anlaşılabilmesi için tekil kullanımlarını sonrada sayaçlı kullanımlarını inceleyeceğiz.

LODS komutu

Bu komut yanına aldığı eke göre 8 ile 32 bit arasında işlem gücü kazanır. Temel görevi SI (yada ESI) registerin gösterdiği noktadaki değeri alıp bit değerine göre A (AL, AX, EAX) registere yüklemektir. Ayrıca LODS komutu değeri yükledikten sonra SI registerin değerini kullanılan bit değerine göre  arttırarak sonraki veriye göre ayarlamış olur. Bu byte için 1, word için 2 ve dword için 4 byte otomatik olarak toplanacak demektir. Daha önce gördüğünüz XLAT komutuna benziyor olmasna karşın LODSB  çok farklıdır. Aşağıda verilen ve diğer örneklerde verilen bit değerleri gerçek modda veya korumalı modda aynıdır. Kullanım ihtiyacına göre hepsi kullanılabilir.
LODSB  = 1 byte işlem için (8 bit)
LODSW = 2 byte işlem için  (16 bit)
LODSD = 4 byte işlem için (32 bit)

Örnek:

ornekyazi   db 'ASM GENEL TUTOR',0
.....
lea esi,ornekyazi   ; ornekyazi noktasının başlangıç adresini ESI registere yükledik.
lodsb                     ; al registere ilk harf olan 'A' harfi yüklendi. ESI register byte olarak kullandığımız için 1 arttı.

Eğer ilk iki harfi alıp ax registere yüklemek isteseydik lodsw kullanacaktık. Yine ilk 4 byte için lodsd kullanacaktık.

MOVS komutu

Bu komutta LODS komut gibi yanına aldığı B,W,D takıları ile ayrı bir opkod halini alır ve buna göre bitte işlem yapar. MOVS komutu DI (veya EDI), SI  (veya ESI) ve registereleri ile beraber çalışır. SI kaynaktır yani aktarılacak verini adresini gösterir. DI  ise hedeftir gideceği yeri gösterir. Komut sonrası her iki registerde kullanılan bit değerine göre ekleme olur ve yeni yeri gösterirler.


buf1    db 'YAZI',0
buf2    db 0,0,0,0
......
lea esi,buf1    ; buf1 = 'YAZI'
lea edi,buf2   ; buf2= 000000000
movsd
                     ; buf1 = 'YAZI ' ve buf2 = 'YAZI


Bu işlem sonunda buf1 adresindeki veri buf2 bölgesine aktarılır. buf2 bölgesinde bir değişme olmaz, aynı kalır. Burada eğer MOVSB kullanılmış olsaydı sadece ile harf aktarılacaktı. Eğer MOVSW kullanılmış olsa o zaman ilk iki veri aktarılacaktı. Bunlar kullanılan bit değerlerine bağlı.

CMPS Komutu

CMPS komutu ileride göreceğimiz karşılaştırma komutunu kombine bir şeklidir. Bu komut yine tekil olarak diğerleri gibi yanına aldığı ek ile orantılı olarak bit sayısı kadar işlem yapar Yine bu komut SI (veya ESI) ve DI (veya EDI) registerler ile birlikte çalışır.Bu komut tüm karşılaştırma ve test komutları gibi bayrak registeri etkiler. Bu komutu kısaca SI register ile gösterilen bölgeyi DI ile gösterilen bölge ile karşılaştırır diye açıklayabiliriz. Bu işlem tamamen hafıza bölgesi ile ilgilidir. Bu komut ileride göreceğimiz karşılaştıma komutları gibi registerler karşılaştırması yapmaz. Karşılaştırma sonucunu  ZF (zero flag) ile alırız. Eğer iki bölgede verdiğimiz bir değeri kadar karşılaştırılması sonucu aynı ise ZF set (1) olur. Eğer yanlış ise ZF reset (0) olur. Bunu nasıl kullabncağımızı ileri şartlı atmala komutlarında göreceğiz. Şimdilik aşağıdaki örnek bunun nasıl kullanıldığı konusunda  bir fikir verebilir.

buf1  db 01,02,03,04
buf2 db 02,03,01,04
....
lea esi, buf1        ; asıl bölge
lea edi, buf2       ; karşılaştırılan bölge
cmpsd                 ; dword (32 bit ) olarak karşılaştırma
jz dogru              ; eğer aynı ise  "dogru " etiketli  yere atlar. Değilse devam eder.
....

STOS Komutu

Bu komut A register (AL, AX EAX) ile DI register (veya EDI) ile beraber çalışır. STOS komutu diğerler gibi yanlarına aldıkları işaret ile opkod eşlenir ve bu eşleşmeye göre işlemde bit seviyesi kullanır. STOS komutu A registerdeki değeri DI registerin gösterdiği bölgeye aktarır.

buf1   db 00,00,00,00
......
lea edi, buf1
mov al,89h
stosb

Bu işlem sonunda stosb kullandığımız için 1 byte (8 bit) bir yazma olacak ve buf1 db 89h,0,0,0 şeklinde olacaktır. Eğer STOSW komutu kullanmış olsaydı 2 byte   yazacaktı ve dolayısıyla bu AX register olacaktı. Aynı şeklide STOSD kullansaydık 4 byte olacaktı ve bu EAX register olacaktı.

SCAS Komutu

SCAS komutu aramak - taramak kelimesinin kısaltılmışıdır ve yaptığı işlemde taramadır. Tek başına pek bir işlevi yoktur. Asıl olarak aşağıda göreceğiniz gibi REP tekrarlatıcısı ile güçlü bir arama - tarama işlevi kazanır.



REP komutunu LODS, MOVS, CMPS, STOS ve SCAS  ile kullanılışları

REP komutu yukarıda gördüğümüz 4 sınıf komut ile kombine çalışarak onların tek başına yaptıkları işi grup halinde ve istenilen sayıda yapılmasını sağlar. Burada önemli olan sayıdır ve sayıyı CX (veya ECX) register ile belirtiriz. Diğer kullanımlar her komut için yukarıda anlattığım gibi ilgili registerlere ve kullanılan alanlara bağlıdır. REP komutuvir döngü oluşturur ve verilen komutu belirlenen CX (veya ECX) kadar yapar.

REP komutu REPZ, REPE, REPNE olarak döngüyü  kontrol altına alma olanağıda vardır. REPZ ile CX (yada ECX) 0 oluncaya kadar devam et anlamındadır. REPE yine CX register eşit oluncaya kadar ve, REPNE ise eşit olmayıncaya kadar anlamındadır. REPZ genelde çok kullanılır ama DF bayrağı değiştirilerek tersine işlem ile diğerleride rahatça kullanılabilir.

MOVS ve REP kullanılışı

MOVSB daha önce anlattığım gibi kombine veri aktarma görevini yerinr getiriyordu. REP komut ile SI ile belirtilen hafıza  bölgesinden  DI ile belirtilen hazıfa bölgesine CX kadar aktarma yapar. Örneğin:

lea esi,buf1
lea edi,buf2
mov ecx,100h
repz
movsb
....
buf1 bölgesinden buf2 bölgesine 100h byte şeklinde aktarma yapılıyor. Eğer MOVSB yerine MOVSW kullanlırsa aktarma Word (16 bitlik) olacak ve burada kullandığımız ECX = 100h * 2  olacak. Çünkü her sayımda 1 değil 2 veri aktarmış olacağız. Aynı şekilde MOVSD kullanırsak 32 bitlik bir aktarma komutu kullandığımız için 100h * 4 olacaktır.

CMPS ve REP kullanılışı

CMPS komutuda MOVS komutu gibi REP komutu ile beraber kullanılınca döngü içerisinde kontrol sağlar. Bu komutun en büyük avantajı çok uzun veri yada yazıları rahatlıkla karşılaştırılabilmesidir. Normalde bu komut olmasa döngü içinde tek tek karşılaştıran bir program yazmak gerekir. Ancak REP CMPS kombinasyonu ile güçlü bir kontrol mekanizması oluşturulabilir.

str1        db 'www.bsca.tk',0
str2        db 'BSCA2002',0
.....
lea esi,str1
lea edi,str2
mov ecx,8
repz
cmpsb
jz ayni
:::::::::

Burada str1 bölgesi ile str2 bölgesi karşılaştırılıyor ve karşılaştırma uzunluğu 8 byte. Eğer aynı ise JZ AYNI ile başka yere atlanılıyor eğer değilse devam ediliyor. Buradaki karşılaştırma sonucunda ZF (Zero flag = sifir bayrağı) etkilendiği için istenildiği gibi düzenlenebilir.

STOS ve REP kullanılışı

STOS komutu doldurma komutu olduğunu daha önce anlattım. Bu komut DI (veya EDI) komutu ve A (AL, AX, EAX) ile beraber kombine çalışır.DI ile belirtilen hazıfıza bölgesini A register ile doldurulur. Burada doldurma yine CX (veya ECX) sayısı kadardır. Yine MOVS komutunda anlattığım gibi kullanılan registerin biti ve komutun çalışma biti dosldurma alanını büyütür. Eğer ECX=100h verip STOSW kullanırsak 100h * 2 kadar olacaktır.

buf1        db 0,0,0,0,0,0,0,0,0,0,0,0,0
....
lea edi, buf1
mov ecx, 5
mov al,99h
repz
stosw

Burada buf1 bölgesini 99 sayısı ile dolduruyoruz. Normalde ECX ile 5 kere tekrarlanacak olarak verildiği halde STOSW kullandığımız için 5 * 2 = 10 bytelık bir doldurma olacaktır.

LODS ve REP kullanılışı

LODS ile REP komutu genelde döngü içerisinde kullanılır. Tek başına kullanılıması SI (veya ESI) register ve CX (veya ECx) register ile sağlanır ve yine diğerlerinde olduğu gibi kullanılan bit uzunluğuna göre opkod alır. Kullanılan bit uzunluğunca A register (AL, AX, EAX) SI registerdeki veriyi alır.

buf1    db 'ASM TUTORS-2'
....
lea esi, buf1
mov ecx,5
repz
lodsb

bu işlem sonucunda ESI register ECX register kadar veriyi buf1 adresinden alıp AL registere aktarır.
STOS ve REP  kullanılışı

STOS komutu daha önce anlattığım gibi arama - tarama komutudur. Bu komut DI (veya EDI) register ile belirtilen bölgede CX (veya ECX) kadar A registerdeki (AL, AX, EAX) değeri arar. 8, 16 ve 32 bitlik bir veriyi istediğimiz hafıza alanında arama konusunda bir hayli hızlıdır. Yine diğerlerinde olduğu gibi yanına aldığı ek ile opkodu şekil alır ve dolayısıyla arama değerinin biti buna göre ayarlanır. STOSB byte, STOSW word, ve STOSD dword araması yapar. Bu komutta aranılan değer bulunduğu takdirde döngü sonlanır ve DI register aranılan değerin olduğu hafıza adresini gösterir.

buf1     db 'aranılan harfler CY oldun',0
.....
lea edi buf1
mov ecx,10
mov ax,'CY'
repz
scasb

Bu işlem sonunda buf bölgesi aranacak ve 'CY' harflerinin olduğu adreste duracak. Sonuçta bize DI register ile adres vermiş olacak.

1 - MATEMATİK İŞLEM KOMUTLARI

Toplama işlemi

Bütün register arasında standart toplama, çıkarma, çarpma ve bölme işlemleri rahatça yapılabilir. Ayrıca daha ileri işlemler için sonraki bölümlerde anlatacağım FPU (matematik işlemci komutları) vardır ve bunlarla daha üst dereceli hesaplamalar yapılabilmektedir. Şimdi burada standart dört işlemi inceleyeceğiz. Burada genelde al, ax, eax, ebx gibi registerle örnekleme yaptım. Ancak diğer registerle ilede aynı işlemleri rahatça yapabilirsiniz. ESP gibi registerle işlem yaparken dikkatli olmanız gerekir çünkü ESP register sistemin yığın adresini belirttiği için değiştiğinde program içinde kilitlemelere neden olacaktır. Ayrıca işlemler sonucunda kalan sayılar konusunda EDX register yetkili kılınmıştır.

Toplama yapmak için ya iki farklı değişkeni birbirleriyle toplarız yada kendisiyle kendisini toplarız. Registerler arasında toplama veya   adresler arasında toplama işlemi için ADD komutunu kullanıyoruz. ADD komutu 8,16,32 bit olarak işlem yapılabileceği gibi MMX ve FPU komutları ile 64 bitlik işlemde rahatça yapılabilir. Ayrıca bazı registerler için gerekli olabilecek 48 bitlik bir ara değerde vardır.

Bu komut register+register,  register+değer, değer+register, register+adres gibi değişik çok yönlü kullanılıma sahiptir. Eğer AX registerimiz 100 olsa ve BX registerimiz 50 olsa bunların toplamı 150 olacaktır. Bunu gerçeklerştirmek için sadece:

add ax,bx

dememiz yeterli. Burada önemli husus ilk verilen register daima toplanan ikinci register eklenendir. Eğer burada add bx,ax olarak kullanmış olsaydık bx registerin değerine ax registerin değeri eklenecekti. İkinci eklenen registerin değeri değişmez.

Register+değer şeklinde kullanımda ise kullanılacak register ile istenilen bir değer toplanır. Örneğin:

add ebx,12345678h

gibi. Burada ebx registeri ile 12345678h değeri toplanıyor. EBX registerin o andaki değeri ne ise artı 12345678 değeride ekleniyor. Burada verebileceğim tiyo matematikte bildiğimiz gibi sayıdan önceki 0 (sıfır) değersizdir. Diğer işlemlerde olduğu gibi matematiksel işlemlerde sayıdan önce sıfır  veya sıfırlar eklemek gereksizdir. Ayrıca sıfır ile yapılan işlemler bildiğimizde matematiksel kurallar geçerli olur.

Eğer bir adresteki  değer ile bir register toplanacaksa :

add word ptr [adres],ax

şeklinde kullanılabilir. Burada toplanılan register ile adreslenen yerin aynı bit uzunluğunda olmasına dikkat edin. Mesela 16 bitlik bitlik bir ax register ile 8 bitlik bit alan toplanmaya çalışılırsa işlem 8 bit olacaktır. Burada toplama işlemi [adres] olarak simgelenen yere olur ve toplanan register değişmez.

Eğer bir register ile adres toplanacaksa:

add eax,dword ptr [adres]

şeklinde kullanılır. Bu işlemde [adres] olarak belirtilen hafıza adresindeki değer değişmez, o değer register ile toplanır. Yani önceki örneğin tersidir.

Birde bayrak registerle beraber özel bir toplama komutuda mevcuttur. Bu ADC komutudur ve taşıyıcı (CF) bayrak  set (1) ise toplama anlamına gelir. Bu bazı matematiksel özel durumlarda kullanılır ve bir registerin değerini en yüksek noktasını geçmesi sonucunda ortaya çıkan taşma durumunu anlamakta yardımcı olur. Örneğin:

mov ax,0ffffh    ; ax reg = fff0 alabileceği en büyük değer 0ffff' 'dir
add ax,10h       ; 0fff0 ile 10h toplanıyor ve 16 bitlik en büyük değer ulaşıyor. Buından sonrası başa dönüş yani 0
adc dx,0           ; burada dx register 1 olacak çünkü ax registerde  taşma oldu carry flag (CF) set (1) durumunda

Yukarıdaki örnekte görüldüğü gibi ax registerin değeri 16 bitlik bir registerin alabileceği en yüksek matematiksel değer yükseltidi. Bunun sonucu CF set olduğu için dx registerle 0 toplamasına rağmen dx register 1 olacaktır. Bunu programlarını içinde kullanarak daha iyi öğrenbilirsiniz. ADC bütün registerler için geçerli ve yukarıda anlattığım toplama şekillerinde de aynen kullanılabilir. Önemli olan registerin değerini en yüksek değere ulaşıp ulaşmamasıdır.

Çıkarma İşlemi

Çıkarma işleminin toplama işleminden tek farkı komutun SUB olması ve işlevini çıkarma olmasıdır. Aynı toplama komutu gibi register arası, register-adres, adres-register  şeklinde çıkarma işlemi yapılır. Toplama işleminde örneklediğim ADC komutu yerine SBB komutu kullanılır ve sonuc toplamada olduğu gibi değer en yüksek değerde ise CF bayrağı set olur ve kullanılabilir durum oluşur.

Çarpma işlemi

Ç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. IMUL komutu 2 veya  çarpıma olanak vermekte ve kullanım şekli daha geniştir. IMUL komutu 32 bit işlemler için idealdir. Öncelikle MUL komutunu görelim.

MUL komutunda çarpılan daima AX (kullanım bitine göre AL ve EAX registerde) asıl çarpılandır. MUL komunun yanına çarpımı yapacak register yazılır.

mov bx,20
mul bx

şeklinde kullanılınca geçmemesine rağmen burada çarpılan ax registerin o andaki değeri ile bx register (burada 20 değerinde) çarpılır.

MUL komutu için CPU  AX ve DX registeri yetkili kılmştı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 register aktarılır. Eğer geçme yoksa DX registerde bir değişme olmaz.
Böyle bir duruma örnek :

mov ax,100h
mov bx,1000
mul bx

IMUL komutu ise toplama ve çıkartma konularında görüldüğü gibi çoklu register ve büyük değerlere olanak vermektedir. Yanlız MUL komutunda olduğu gibi taşma olduğunda DX register aktarılma yapılmaz.

Örneğin:

mov ax,0ffffh
mov bx,0ffffh
imul ax,bx

gibi kullanılır.

IMUL ile üçlü çarpimda mümkündür.

mov eax, 0ffffh
mov ebx,0ffffh
imul eax,ebx,768  ; [AX*BX]*768 = 02fff0000

Burada önce EAX*EBX işlemi yapılır ardından çıkan sonuç ile 768 sayısı (bu sayı istediğimiz bir sayı olabilir 768 burada sadece örnek olarak) çarpılır. Burada işlem büyük olduğu için 32 bit registelerle örnek verdim. Büyük değerlerde daima 32 bit registerler kullanın. Sonucu tam alabilmek için bu gerekli.

Bölme işlemi

Bölme komutuda DIV ve IDIV olmak üzere kapsamlı olarak iki tanedir. Çarpmada olduğu gibi DIV komutu taşma durumunda DX (veya EDX) komutu CPU tarafından yetkili kılınmıştır. Bölme işleminde DX register kalan sayıları verme konusunda görevlidir. Diğer işlemlerde olduğu gibi bölme işleminde de matematik kuralları geçerlidir ve matematikte "sıfıra bölüm" anlamsız olarak tanımlanmıştır. CPU' da sıfıra bölüm için özel bir kesme ayırmıştır.

DIV komutu aynı MUL konutu gibidir.

mov ax,104h
mov bx,10h
div bx
;ax= 10 , dx =4
yukarıdaki örnekte görüldüğü gibi 104h/10h olur. 104h içerisinde 16 tane 10h vardır ve 04 sayısıda kalandır. Bu işlem sonucunda AX register 10h ve DX registerde 04 kalan sayısını alır. Burada örnek olarak 16 bir registerler ve sayılarla verdim. 32 bit registerler ile daha yüksek işlem olanağı olur.

IDIV komutu aynı IMUL konutunda olduğu gibi daha yüksek işlemler için idealdir. IDIV komutunu DIV komutunu yerine kullanıldığı zaman aynı işlemi yapar. Ancak IMUL' da olduğu üçlü bölüm yoktur. Konu bölüm olunca bunun pek fazla gereği olmadığı görülüyor zaten.

2 - YIĞIN KOMUTLARI

Yığın konusundan daha önce bahsetmiştim. Hafızada saklaması gereken verileri yığın komutları ile sistemin bize tahsis ettiği adreste saklarız. Bu döngülerde, çoklu işlemlerde, matematiksel işlemlerde çok önemlidir. Ayrıca Windows' un API sistemi yığın üzerinden bilgi alışverişi sağlancak şekilde tasarlanmıştır. Bunun için yığın ve kmutları çok önemlidir.

Yığın işlemini ana merkezinde SP (veya 32 bit hali ESP) vardır.  SP ,stack pointer olarak açılır ve yığın noktası anlamına gelir. Yani bu register bize yığın noktasının doğrusal adresini verir. Gerçek modda bu işleme yardımcı olarak SS registerde kullanılır. SS, Stack segment anlamına gelmekte ve Korumalı mod programlamasında gerek olmadığı için kullanılmamaktadır.

Bir değeri, adresi, registeri yığın noktasına attığımız zaman yığın noktası registerinden (SP veya ESP) moda göre düşme olur. Eğer Windows altında bir değer saklıyorsan o zaman SP registerden 16 bitlik bir değer olarak 2 byte gerileyecektir. Örneğin:

SP register burada 0FFFEh adresini gösteriyor.

push ax   ; 0FFFE - 2 = 0FFFCh
push bx  ; 0FFFC - 2 = 0FFFAh
oldu. Bu örneği söyle düşünebilirsiniz, bir depomuz var. Bu depomuzun sadece 1 giriş kapısı var. Biz buradan kutuları numaralarına göre önden başlayıp arkaya doğru sıralıyoruz. Tabi olarak deponun alanı metrekare olarak düşüyor. Depo SP registerimiz olsa ve kutularda değerlerimiz olsa sanırım daha iyi anlaşılır.

Yukarıdaki örnekte görüldüğü gibi PUSH komutu değeri, registeri, yada bir adresteki değeri alıp saklamaya yarar. POP komutu ise bu değeri alıp istediğimiz yere yada registere aktarmamız sağlar. Assembler da  saklanan değerin illaki saklandığı yere çıkmak gibi bir zorunluğu yoktur. Örneğin eax registeri PUSH EAX olarak sakladıysak bunu yine POP EAX olarak illaki EAX register çıkmak zorunda değilir. POP EBX yada POP [ADDR] olarakda çıkabiliriz.

Saklanan değerlerin sondan başlıyarak ilk değere doğru geri dönmesi esastır. Eğer sırasıyla 1,3,5 değerlerini sakladıysak, bize geri dönüşümü 5,3,1 şeklinde olacaktır.

PUSH komutu yığın noktasına saklama görevini üstlenir. PUSH komutu register, sayısal değer veya bir adres olabilir. Aşağıda görülen  örnekler ayrı ayrıdır:

PUSH EAX

PUSH [ESI]

PUSH 9943512

PUSH OFFSET [410002]

    Burada son örnekte görülen OFFSET aslında derleyiciler için kullanılan bir ektir. Normalde böyle bir ek assembler komutları içinde yoktur. Sadece DOS' da segment sistemi olduğu ve segmentler registerin  çalışma alanlarını değiştirdiği için CS: , DS:, ES: gibi ön ekler kullanılır.

Geri alma komutu ise POP komutudur .Bu komut PUSH komutunda olan olayların tersini gerçekleştirir. Yani yığın noktası registerinden (SP vea ESP) değerin boyutu düşülür ve o noktadaki değer istenilen registere, adrese yüklenir. PUSH ve POP komutları döngüler içinde yoğun kullanım alanı bulurlar. Örnegin :

           mov ecx,10
dongu:
            push ecx
            mov ecx,dword ptr [sayac]
            inc ecx
            mov dword ptr [sayac],ecx
            pop ecx
            loopnz dongu
            ....
Bu örnekte iki tane ECX register değeri olduğu halde işlem PUSH ve POP komutları sayesinde değerler ayrı ayrı saklanıp - alnarak tamamlanmaktadır.

POP komutuda PUSH komutu gibi çeşitli şekillerde kullanılabilir: (Hepsi ayrı ayrı örneklenmiştir.)

POP EAX

POP [ESI]

POP 9943512

POP OFFSET [410002]

Hakkında