BÖLÜM 1. MİKROİŞLEMCİ NEDİR? 1.1. İŞLEMCİ NEDİR? • İşlemci: bellekteki program yardımıyla işlemlerin yapılma düzenini ve sırasını belirleyen; • üç kısımdan (aritmetik-mantık birimi, kaydedici bellek ve kontrol) oluşan; • aritmetik, mantık ve diğer işlemleri yapan temel bilgisayar birimidir. 1.2. MİKROİŞLEMCİ NEDİR? Mikroişlemci (Mİ) nedir? Mİ, büyük entegre devresi teknolojisi ile hazırlanmış ve tek bir entegre devresinde (yongada) toplanmış olan işlemcidir. Mİ’nin özelliği; onun tek bir entegre devresinde toplanmış olmasıdır. Mİ’ler genel amaçlı ve özel amaçlı olarak tasarlanırlar. Bir genel amaçlı Mİ, bellek yongaları, giriş ve çıkış birimleri ve diğer yardımcı birimlerle birleştirilerek mikrobilgisayar oluştura bilmektedir. Kişisel bilgisayarlar mikrobilgisayarlara örnek olabilirler. Özel amaçla tasarlanmış olan Mİ’lere örneklerden biri mikrokontrollerlerdir. Mikrokontrollerler daha çok kontrol ve otomasyon işlerinde kullanılmak için tasarlanmış Mİ’lerdir. 1.3. Mİ PARAMETRELERİ Mikroişlemcileri bir birini ile kıyaslaya bilmek için belirli parametreler kullanılır. Bu parametreler: (1) (2) (3) (4) (5) veri uzunluğu; adres uzunluğu; saat frekansı; iç bellek kapasiteleri; ve diğerleridir. Ayrıca programcının kullanabileceği komut sayıları ve tipleri, adresleme modları, değişik tipteki destek devreleri vb. özellikler de Mİ’nin önemli unsurlarından sayılmaktadır. 1.3.1. Veri Uzunluğu Veri uzunluğu işlemcide kaç bitin aynı anda (paralel olarak) işlenebildiğini gösterir; Tarihsel olarak n=4; 8; 16; 32 ve şimdi 64 bit veri uzunluklu Mİ-ler üretilmekte ve kullanılmaktadır. Veri uzunluğu hesaplama hassasiyetini göstermektedir. Veri bitleri sayısı arttıkça hassasiyet de artmaktadır. Sayfa 1 / 51 Örneğin, n=32 bit bir Mİ 16 bit bir Mİ-den daha hassas hesaplamalar yapabilmektedir. Hatırlatma: 1 bit ={0;1} Diğer taraftan veri uzunluğunun artması hesaplama hızını da artırmaktadır, çünkü bazen çok sayıda bitler üzerinde işlemler yapmak gerektiğinden daha uzun veriye sahip olan Mİ bunu birkaç kere yerine bir kereye yapar. Örneğin, n=64 bit iki sayıyı toplamak için 16 bit Mİ kullanılırsa, bu Mİ sırası ile 4 kere toplama yapacaktır (16x4=64); fakat 64 bit Mİ-de ise bu toplamayı bir kerede yapacaktır. İç veri yolları Mİ-nin içerisindeki birimler arasında veri iletişimini sağlar. Dış veri yolu Mİ ile dışarıda olan birimler (bellekler, giriş ve çıkış birimleri v.s.) arasındaki veri iletişimini sağlar. İç veri yolu ile dış veri yolunun uzunlukları aynı olamayabilir. Veri yollarında veri iki yönde iletilebilmektedir. Bunun için üç durumlu devreler kullanılmaktadır. Ödev 1.1: Bunun nedenini ve nasıl yapıldığını araştırın. Not: Adres Yolu tek yönlüdür! 1.3.2. Adres Uzunluğu Adres – komutları, verileri, kodları vs. gibi enformasyonun bellekte yerleştiği yeri gösteren bir koddur. Bu kod ikili sayı sisteminde gösterildiğinde, bundaki bitlerin sayısı adres uzunluğunu vermektedir. Adres uzunluğu, Mİ-nin bağlı olduğu ana bellek kapasitesini belirler. Adres uzunluğu m (bit) olsun. Maksimum Bellek Kapasitesini V ile işaretleyelim. Bu durumda: V = 2m Örnek: m=16 olsun. Bu durumda: V=216 = 65 536 = 64 K (K= 210=1024), yani ana belleğin maksimum kapasitesi 64 K (Byte) olur (1Byte=8 bit). 1.3.3. Saat Frekansı Her bir Mİ-nin içinde mutlaka senkrosinyaller (puls) üreten bir saat vardır (Senkrosinyaller bir komutun yürütülmesini tetiklemek için gereklidir). İlk mikroişlemcilerde saat bir entegre devresi olarak ayrıca üretilerek sisteme bağlanılırdı. Sayfa 2 / 51 Günümüzde saatler (kristal hariç) artık Mİ yongasının içerisinde yerleştirilmiştir. Bir saatin ürettiği senkrosinyallerin ideal biçimi Şekil 1.1’de verilmiştir. S t T Peryot Bazen saatler biri birinin tam tersi olan iki senkrosinyal serisi üretirler. S1 t S2 t Şekil 1.1. Saat frekansları Frekansın Hz, MHz vs. ile ölçüldüğü bellidir (1 Hz saat frekansı onun 1 saniyede 1 sinyal ürettiğini göstermektedir). Mi-lerde olan saatlerin da frekansları aynen MHz veya en son zamanlar artık GHz-lerle ölçülmeye başlamıştır. Peki, bu ne demektir? Sadelik için Mİ saatinin 1 MHz frekansı ile senkrosinyal ürettiğini varsayalım. Bu durumda saatin ürettiği senkrosinyallerin periyodu 1 mikro saniyedir. Neden ve Nasıl? Çoğu zaman Mİ-lerin hızı hakkında konuşurken hız birimi olarak MHz ele alınır. Bu doğru değildir. Saat frekansı Mİ-nin hızını etkilemektedir, ama direk hızı vermemektedir. Çünkü Mİ-nin hızı dedikte onun 1 saniyede yaptığı işlemlerin sayısı düşünülmektedir (işlem/saniye). Oysa kaba söylemek gerekirse, bir işlemin yürütülmesine her zaman birden fazla senkrosinyal gerekmektedir. Ve hem de çeşitli işlemler için çeşitli sayıda senkrosinyal gerekir. Bu yüzden 1000 MHz-lik bir saati olan Mİ-nin hızı 1000 milyon işlem/saniye (yani 1 milyar işlem/s) değildir. Son zamanlarda Mİ hızları büyüdükleri için onları işlem/s ile değil, milyon işlem/s (MIPS – Millions of Instructions Per Second) veya milyon kayan noktalı işlem/s (MFLOPS – Millions of Floating-Point Operations Per Second) ile ölçmektedirler. Fakat mikrobilgisayar (veya bilgisayar) hızını belirlemek daha zor bir iş olmaktadır, çünkü devreye ana bellekle birlikte dış bellek ve çevre birimleri de girmektedirler. Bu durumda Sayfa 3 / 51 “benchmark” adlanan ve özel olarak tasarlanmış çeşitli standart performans programları kullanılır. Bu testlerden yaygın olarak kullanılanlar SPEC (System Performance Evolution Cooperative) yıllara göre ve tam sayı veya kayan noktalı sayı işlemlerine göre değişmektedir. 1.3.4. İç Bellek Kapasitesi Mİ-lerin iç belleklerinin toplam kapasitesinin büyük olması çok önemlidir, çünkü bu Mİ-den dışarıda olan ana belleğe (RAM ve ROM) müracaat etmeden çalışma olanağı vermekte ve böylece çalışma hızını artırmaktadır (ana belleğe müracaat Mİ-nin hızını yavaşlatmaktadır). İlk Mi’lerde iç bellek olarak yalnızca kaydediciler (register) kullanılırdı. Bu yüzden iç bellek kapasitesini kaydedicilerin sayısı belirlemektedir. Bunların sayısı kısıtlıydı (1 ile 8 arası). Bu kısıtlılık Mİ’nin veri ve program için devamlı ana belleğe baş vurmasına götürür ki bu da Mİ’nin işlem hızını yavaşlatır. Fakat şimdiki Mİ’lerin içeriğine hem kaydediciler üzerinde bellek (32+32 kaydedici), hem de ön-bellek (cache) (veri ve program için) bellek yerleştirilebilmiştir (bu, büyük entegre devreleri teknolojilerinin gelişmesi ile elde edilmiştir). Saat frekansının artması ile birlikte bu da Mİ’lerin hesaplama hızını artırmaktadır. 1.4. Mİ GELİŞME AŞAMALARI Intel firması örneğinde mikroişlemcilerin gelişmesi aşamalarını izlemek mümkündür (Tablo 1.1). Tablo 1.1. Intel firması Mİ’lerinin geliştirilme aşamaları Yıl Ürün Veri 1971 4004 4 1973 8008 8 1975 8080 8 1978 8086 16 1983 80286 16 1985 80386 32 1989 80486 32 1993 Pentium 1 32 1995 Pentium 2 32 1998 Pentium-3 32 2001 Pentium-4 64 2005 ? ? *- Pentium serisinin hepsine ait Adres 16 16 16 20 24 32 32 32 32 32 32 ? Özellikler Hesap makinelerinde kullanıldı Hesap makineleri ve kontrolde kullanıldı Kontrol uygulamalarında kullanıldı 8008 (8 bit ); co-processorlar üretildi Kişisel bilgisayarlarda kullanıldı Ön bellek kullanıldı Daha büyük frekanslı saat 3 milyondan fazla transistor* 64 bit veri yolu da kullanabilir* Birkaç aritmetik-mantık birimi* Yaklaşık 1,5-2,4 GHz saat frekansı* 20 GHz ve 1 Milyar transistor Sayfa 4 / 51 Genelde söylemek gerekirse Intel, mikroişlemci ve diğer uygun birimleri birkaç yönde geliştirmiş ve geliştirmektedir. Bunlardan biri genel amaçlar için kullanılan mikroişlemci (80x86 serisi, Pentium serisi), diğeri mikrokontroller (8048, 8051, 8096, i960) ve bir diğeri de paralel veya süper işlemciler (i860, iPSC serisi) sınıflarıdır. Bazı firmalar ise komutların geliştirilmesini sistem tasarımcılarına bırakan “bit-slice” adlanan Mİ’ler tasarlamışlardır. Böyle Mİ’lerde uygun serinin birkaç işlemcisini kullanarak istenilen veri uzunluğuna ulaşılabilir. Tasarımcı sadece ona gereken komutları oluşturarak daha verimli bir sistem elde edebilir. Bunun için seride mikroprogram kontrol kullanılır ve komutların gerçekleştirilmesi için gereken mikrokomutlar sabit bir bellekte tutulur. Intel firmasının böyle Mİ’si Intel 3000’dir. Motorola; Intel’e paralel olarak uygun Mİ’ler geliştirilmiştir. Motorola’nın geliştirdiği Mİ’ler ve onların özellikleri Tablo 1.2’de gösterilmektedir. Tablo 1.2. Motorola firması Mİ’lerinin geliştirme aşamaları Yıl 1975 1979 1983 1984 1987 1989 1993 1994 Ürün Veri 6800 16 68000 16 68010 16 68020 32 68030 32 68040 32 Power PC 601* 32 Power PC 603* 32 Özellikler İki Akü Kaydediciler 32 bit’tir Sanal bellek kullanıldı Gerçek 32 bit işlemci Bellek kontrol birimi Daha hızlı 2.8 milyon transistor 32 genel amaçlı ve 32 kayan noktalı işlemler için kaydedici 1995 Power PC 604* 32 32 Tam sayılarla 4, kayan noktalı sayılarla 6 boru hattı aşaması 1995 Power PC 620* 64 32 Yonga içinde 32 KB veri ve 32 KB komut ön belleği * Power PC serisinin tasarımına Motorola’dan başka IBM ve Apple firmaları da katkı sağlamıştır. Adres 16 24 24 32 32 32 32 32 Mİ’ler de komutların sayısının az veya çok olması bellek kullanımı ile sıkı ilişkilidir. Bazı Mİ tasarımcıları kullanılan bellek kapasitesini ekonomik olarak kullanmayı hedefleyerek komut sayısını artırmışlar. Bu, bir taraftan işlemcinin iç yapısını karmaşık yapsa da, diğer taraftan belleğe mümkün kadarı ile az müracaat etmesine ve bununla hızın artmasının temel unsurunu oluşturmaktadır. Böyle tasarım prensibine Karmaşık Komut Setli Bilgisayar (Complex Instuction Set Computer – CISC) denmektedir. Diğer bir yaklaşım ise komutların sayısını azaltarak ve onları basitleştirerek onarın daha hızlı yürütülmesini sağlamaktan oluşmaktadır. Böyle tasarlama prensibi Kısaltılmış Komut Setli Bilgisayar (Reduced Instruction Set Computers – RISC) adlanır. Genelde tarihsel olarak Motorola firması kendi Mİ tasarımlarında daha az komutla geçinmeye çalışırken Intel firması Sayfa 5 / 51 komutların sayısını her sonraki serisinde artırmıştır. Bundan dolayı Motorola’nın bir çok Mİ’si RISC yapısına, Intel’inkilerin ise CISC yapısına sahip olduğu söylenebilir. Mİ tasarlayan ve üreten firmalar sadece Intel ve Motorola ile kısıtlı değildir. Zilog, AMD, TMS, Rockwell, Mostek ve diğer firmalar çeşitli yıllarda çeşitli Mİ’ler tasarlamış ve üretmişler. Bunlardan bazıları günümüzde Intel gibi önder firmalarla rekabet eder durumu gelmişler. Sayfa 6 / 51 BÖLÜM 2. MİKROİŞEMCİLERİN TEMEL ÖĞELERİ 2.1. Temel Öğeler Genelde bütün Mİ-lerde en az bir tane aşağıdaki öğeler bulunmaktadır: -1-Akümülatör; -2-Bayrak (Durum) Kaydedicisi; -3-Aritmetik-Mantık Birimi; -4-Genel Amaçlı Kaydedici (veya Kaydediciler); -5-Program (Komut) Sayacı; -6- İndis Kaydedicisi (veya Kaydedicileri); 2.1.1. Akümülatör Akümülatör (Accumulator) her şeyden önce bir kaydedicidir. Onu diğer kaydedicilerden farklılaştıran özellik onun çıkış ve girişlerinin Aritmetik-Mantık Birimine (AMB) bağlı olmasıdır. Bundan dolayı Akü AMB-de elde edilmiş sonuçları tutmaktadır. Yani bir işlem öncesi tuttuğu veri ile sonraki veri aynı olmamaktadır. Bütün Mİ’lerde en azından 1 tane Akü vardır. Bazı Mİ’lerde 2 Akü vardır (Örn. Motorola 6800). Örnek: Toplama işleminde Akü önce toplananlardan birini tutmakta, işlem sonunda ise toplamı depolamaktadır. Şekil 2.1’de bir Akünün AMB ile nasıl bağlandığı gösterilmektedir. Bu şekilde Akünün çıkışı AMB’nin Giriş 1’ne bağlanmıştır. AMB’nin diğer girişine ise ikinci veri iletilmektedir. AMB öngörülen işlemi (Örn. Toplama) yaptıktan sonra sonucu çıkışına bağlanmış olan Aküye iletmektedir. Akü Giriş 1 Giriş 2 AMB Çıkış Şekil 2.1: Akümülatörün AMB’ye bağlanması şeması Akünün bitleri her bir kaydedici gibi sağdan sola doğru 0,1,2,... numaralandırılmaktadır ve bu bitlerin sayısı genelde veri bitleri sayısı kadardır. Şekil 2.2’de böyle numaralandırma gösterilmektedir. Sayfa 7 / 51 n .... 2 1 0 Akü Şekil 2.2: Akünün bitlerinin numaralandırılması 2.1.2. Bayraklar Her bir Mİ’de mutlaka bir Bayrak Kaydedicisi mevcuttur. Bu Kaydedicinin ayrı ayrı bitleri Mİ’nin o andaki durumunu bildirmektedir. Bu yüzden ona bazen Durum Kaydedicisi de denmektedir. Burada en çok kullanılan Bayrakların bir kaçına bakılacaktır: (a) Sıfır (Zero) Bayrağı. Bu Bayrak yapılmış işlem sonucunun sıfır olup olmadığını göstermektedir. Eğer yapılmış işlem sonucu sıfır ise bu Bayrak (ZF)=1 olmakta, sıfırdan farklı oldukta ise (ZF)=0 olmaktadır. Not: İşlem sonucu ile Bayrağın durumlarının ters olduğuna dikkat edin! Ödev 2.1: Bunun nasıl yapılabileceğini düşünün ve şemasını çizin. (b) Elde (Carry) Bayrağı. Bu Bayrak toplama zamanı eldenin olup olmadığını göstermektedir. Eğer Elde varsa (CF)=1, tersi durumda ise (CF)=0 olmaktadır. Ödev 2.2: Elde bitinin toplamadan nasıl etkilendiğini bulun ve şemasını çizin. (c) İşaret Bayrağı. Bu Bayrak işlem sonucunun işaretinin eksi veya artı olduğunu göstermektedir. Eğer sonuç artı ise (SF)=0, aksi durumda (SF)=1 olmaktadır. (d) Taşma (Overflow) Bayrağı. Bu bayrak sonucun doğru olmadığını gösterir. Örn. İki artı sayının toplandığında sonucun eksi veya iki eksi sayının toplandığında sonucun artı alındığı durumlarda (Böyle durumların olabileceğini örnekler göstererek inceleyin). (OF)=1 taşmanın varlığını, (OF)=0 ise taşmanın olmadığını göstermektedir. Ödev 2.3: Taşma Bayrağının etkilenmesi algoritmasını tasarlayın ve şemasını çizin. (e) Onlu Elde Bayrağı. Bu bayrak ikili-onlu sayılarla aritmetik işlemler yapıldığında kullanılır. Özellikle, bu bayrak toplama işleminde bir byte olarak gösterilen iki onlu rakamlar toplandığında 3. bit’ten 4. bite olan eldeden etkilenmektedir. Eğer bu elde var ise (AC)=1, yoksa (AC)=0 oluyor. (f) Eşlik (Parity) Bayrağı. Bu bayrak bir işlem sonucu Aküde alınan sonuçtaki “1”lerin sayısının çift veya tek olduğunu gösterir. Eğer bu sayı çift ise (PF)=1 ve tersi durumda (PF)=0 olur. Sayının değeri “0” ise bu, çift sayı olarak kabul edilmektedir. Sayfa 8 / 51 (g) Diğer Bayraklar: Bayrakların sayısı ve tipleri mikroişlemciden mikroişlemciye değişiklik göstermektedir. 2.1.3. Aritmetik-Mantık Birimi AMB: 2 girişi ve 1 çıkışı olan toplama ve bir dizi diğer işlemler yapmak için kullanılan kombinasyonel bir devredir. Kombinasyonel olduğundan dolayı onun kendi belleği yoktur ve bu görevi devamlı onun çıkışına bağlı Akü üstlenmektedir. AMB hakkında ön bilgi 2.1.1 alt bölümünde de verilmiştir. AMB’nin Bayrak Kaydedicisi ile de bağlılığı vardır, çünkü AMB’de elde edilen sonuç bu veya diğer bayrağı etkilemektedir. Modern Mİ’lerde birden fazla AMB mevcuttur. Bunlardan bir kısmı tam sayılar üzerinde işlemler yaparken, diğerleri kayan noktalı sayılar üzerinde işlem yaparlar. Ödev 2.4. Bir AMB’nin nasıl tasarlandığını inceleyin ve 4 bit bir AMB şeması tasarlayın. 2.1.4. Genel Kaydediciler Her bir Mİ’de birden fazla Genel Amaçlı Kaydedici mevcuttur. Bu kaydediciler geçici olarak verileri, sonuçları vs. tutmak, bazen adres kaydedicisi olarak kullanmak, bazen de indis kaydedicisi vs. olarak kullanmak üzere tasarlanmışlar. Genel kaydedici sayılarının fazlalılığı az sayıda komutla (CISC mimarisi) işlemler yapmaya yardımcı olmaktadır. Örneğin, Power PC 601 ve üst modellerde 32 tane kaydedici tam sayılar üzerinde işlemler yapmak için, 32 tanesi de kayan noktalı sayılar üzerinde işlemler yapmak için kullanılmaktadır. 2.1.5. İndis Kaydedicileri İndis kaydedicileri verilenlerin indisli olması ve bazı diğer durumlarda kullanılır. Özellikle dizi, matris vb. tür veriler üzerinde çeşitli işlemler yapılırken indis kaydedicilerinin kullanılması çok efektli olmaktadır. Bu kaydediciler, veri dizisinin başlangıç adresi sabit tutularak, dizinin diğer elemanlarının adresini sırası ile kolayca hesaplamağa olanak tanırlar. Örneğin, Intel 8086/8088 Mİ’de iki tane indis kaydedicisi bulunmaktadır. Bunlardan biri kaynak, diğeri de hedef indis kaydedicileridir. 2.1.5. Segman Kaydedicileri Segman kaydedicileri belleğin belirli segmanlara (kodlar, veriler, yığıt vs. için) bölünmesi ile 16 bit Mİ’lerden bu yana kullanılmağa başlanmıştır. Her bir segmanın kendi Sayfa 9 / 51 kaydedicisi bu segmandaki enformasyona ulaşmayı organize etmekte kullanılır. Örn. Kod Segman Kaydedicisi (Code Segment Register) programın komutlarını; Veri Segman Kaydedicisi (Data Segment Register) ise programın verilerini adreslemek için kullanılmaktadır. 2.1.6. Program Sayacı Genelde program ana bellekte tutulmaktadır. Bu programın komutlarını oradan işlemciye getirip işleme koyabilmek için bu programın ilk komutunun adresini bilmek gerekmektedir. Program sayacının bir görevi bu ilk adresi tutmaktır. Fakat o, hem de bir sonra getirilecek olan komutun da adresini biçimlendirmelidir. Bunun için bu sayaç o anda işlenen komutun uzunluğuna göre artırılarak bir sonraki adresi oluşturmaktadır. Dolayısı ile program sayacının ikinci görevi de bir sonraki komutun adresini oluşturmaktır. 2.1.7. Adres Kaydedicisi Mİ’nin temel görevlerinden biri de bellekteki enformasyonu alıp getirmek, üzerinde komutun ön gördüğü işlemi yapmak, gerektiğinde sonuçları (veya ara sonuçları) belleğe göndermektir. Bellekteki enformasyona ulaşmak için gereken adresi tutan birim Adres Kaydedicisidir. Genelde Adres Kaydedicisindeki bitlerin sayısı Adres Yolu bitlerinin sayısına eşittir (Adres uzunluğu ile ilgili bilgi için 1.3.2. ADRES UZUNLUĞU alt bölümüne bkz). Adres Kaydedicisi bitleri sayısı Ana bellek kapasitesini belirler. 2.1.8. Yığıt Kaydedicisi Bazen işlem sürecinde işlemci o anda yürüttüğü komuttan farklı bir yerdeki komuta gitmek, sona yeniden bu komuta geri gelerek programı işemeye oradan devam etmek gibi bir görev yapmak zorunda kalabilir. Bu, özellikle alt programlara müracaat işlemlerinde sık rast gelinen bir durumdur. Böyle bir işlemin özelliği, ana programdan alt programa gidildiğinde ve alt program çalıştırılıp geri dönüldüğünde işlemcinin hem kaydedicilerinin, hem de bayraklarının durumunun değişmiş olmasıdır. Oysa program bir önceki, yani alt programa gidilmeden önceki durumdan devam etmelidir, yoksa işlem sonuçları yanlış olacaktır. Bu durumların üstesinden gelebilmek için yiğit organizasyonu kullanılır. Yığıt, özel olarak bellekte ayrılmış bir yere denmektedir. Bu yere işlemcinin iç durumu geçici olarak kayıt edilir ve sonra gerektiğinde işlemcideki uygun birimlere geri yüklenir. Bu işlemlerin yapılması yığıt kaydedicisinin yardımı ile yapılmaktadır. Bu kaydedici yığıtın adres sayacı rolünü oynayarak programcının istediği iç birimlerim içeriğini yığıtın o anda gösterdiği Sayfa 10 / 51 adrese yazmak ve gerektiğinde de geri çekerek uygun birime yüklemek için kullanılır. Bunun için o, hem artan, hem de azalan bir sayaç gibi çalışma özelliğine sahiptir. 2.1.9. Kontrol Birimi Kontrol birimi Mİ içeriğindeki birimlerdeki ve/veya Mİ’den dışarıdaki enformasyonu kullanarak yürütülen işlemleri organize eden kontrol sinyalleri üretmek içindir. Bu kontrol sinyalleri Mİ çeşitli birimlerinin giriş ve çıkışına bağlı olan elektronik kapıları açmakla veya kapatmakla verinin gerektiği zamanda gerektiği yere iletilmesini ve gereken işlemin yapılmasını sağlamaktadırlar. Hangi işlemin yapılacağını ise komutun kodu, ve dolayısı ile bu komutun işlem kodunun yerleştirildiği komut kaydedicisinin çıkışına bağı dekoderin çıkışı belirlemektedir. Bu çıkışlar kontrol biriminin hangi işlemi yapacağını belirliyor ve kontrol birimi her işleme uygun kontrol sinyalleri ardışıklığı üretir. Kontrol birimi programcı için görünmezdir. Kontrol (veya yönetim) birimlerinin tasarlanması yöntemleri [Sentez] literatüründe ayrıntılı olarak ele alınmıştır. 2.2. Mİ’NİN TAŞIT ORGANİZASYONU Mİ veri, adres ve komut gibi enformasyonu bir birimden diğerine iletmek için belirli taşıt sistemine sahip olmalıdır. Genelde taşıt sistemi iki yere ayrılmaktadır: iç taşıt sistemi ve dış taşıt sistemi. İç taşıt sistemi veri, adres ve kontrol yolları olmakla üç çeşittir. Mİ yapısına göre değişik türde organize edilen veri yollarının aynı anda iletebildiği bitlerin sayısı veri uzunluğuna eşit olmaktadır. Örneğin, 8 bit bir Mİ’nin iç veri yolu uzunluğu8 bit (8085), 16 bit bir Mİ’nin iç veri yolu uzunluğu 16 bit olmaktadır. Veri yolları, veriyi iki yönde taşıya bilmektedir. Bu yüzden onlar iki yönlü olmak zorundadırlar. Bundan dolayı veri kaynağı ve veri hedefi aynı birimler olabilmektedir. Genelde bu, kaynak ve hedef genel amaçlı kaydediciler, ana bellek ve diğer birimler olabilir. Bu günkü Mİ’lerde veri yollarının sayısı birden çok olmaktadır. Bunun temeli Intel 8086 Mİ’de konulmuştur. Bu Mİ’de her biri 16 bit olan üç çeşit veri yolu vardır: A, B ve C taşıtları. Mİ’deki çok taşıtlılık çeşitli verilerin aynı zaman süresinde işlemlere sokulabilmesine olanak tanıyarak genelde işlem hızını arttırır. Adres yolu uzunluğu da Mİ’nin adres uzunluğu kadardır. Program sayacı ve adres kaydedicisi bir adresi biçimlendirdikleri için adresin kaynağı genelde bu birimler olmaktadırlar. Adresin hedefini ise genelde ana bellek ve diğer dış birimler oluşturmaktadır. Sayfa 11 / 51 Kontrol yolları uzunluğu çok çeşitlilik arz etmekte ve Mİ’den Mİ’ye değişmektedir. Genelde bu yollar tek yönlü olmakta ve kontrol birimi ile diğer birimler arasında ilişki oluşturmaktadır. Bu yol da iç ve dış olmakla iki yere bölünmektedir. İç kontrol yolları ile kontrol biriminden çeşitli birimlere iletilen kontrol sinyalleri ve bu birimlerden kontrol sinyallerine iletilen uyarıcı sinyaller, dış kontrol yolları ile çeşitli birimlere gönderilen ve bu birimlerden alınan sinyaller iletilmektedir. Örneğin, R / W sinyali ana belleğe yazma ( R / W =0 olduğunda) veya ana bellekten okuma ( R / W =1 olduğunda) işlevini yapmaktadır. Sayfa 12 / 51 BÖLÜM 3. 8 BİT MİKROİŞLEMCİLER Bu Mİ’ler 1973 yıllarından başlayarak piyasaya sürülmüştür. 8 bit veri yolu ve 16 bit adres yolu olan bu Mİ’ler ayrıca dışarısı ile 10-12 dolayında kontrol hatları ile de bağlanmaktadırlar. Bunların yerleştiği entegre devreleri 40 bacaklıdır. Saat frekansları 1 MHz dolayındadır. 3.1. 8085 Mikroişlemcisi 8085 (8080) Mİ’nin programcı açısından yapısı Şekil 3.1’de görülmektedir: 7 . . Genel Amaçlı Kaydediciler (6 tane) (Yerel Bellek) 15 . . . . . 0 7 . . . . B (8) C (8) D (8) E (8) H (8) L (8) . . . . . . . . . . . . 0 . . 0 Program Sayacı (16) Yığın Göstergesi (16) 7 . . . . . Akü (8) 0 7 . . . . . 0 Bayraklar (8) Şekil 3.1: 8085 (8080) mikroişlemcisinin programcı açısından iç yapısı Bu Mİ’ler 1973 yıllarından başlayarak piyasaya sürülmüştür. 8 bit veri yolu ve 16 bit adres yolu olan bu Mİ’ler ayrıca dışarısı ile 10-12 dolayında kontrol hatları ile de bağlanmaktadırlar. Bunların yerleştiği entegre devreleri 40 bacaklıdır. Saat frekansları 1 MHz dolayındadır. Genel Amaçlı Kaydediciler 6 tane 8 bitlik genel amaçlı kaydediciler (B, C, D, E, H, L), kapasitesi 6 byte olan yerel bellek oluştururlar. Bu kaydedicilerin bir özelliği, onların hem tek tek hem de çift olarak (B ve C, D ve E, H ve L) kullanılabilmesidir. Kaydediciler çift olarak kullanıldıklarında oluşturulan 16 bitlik kaydedici, birinci kaydedicinin (B, D, H) adını alır. Kaydedicilerin çift olarak kullanılması 8085’in 8 bit bir Mİ olmasına rağmen bir dizi 16 bit işlemleri yürütmesini de sağlayarak onu zamanının en kullanışlı cihazı yapmıştır. Sayfa 13 / 51 HL kaydedicisi çiftinin bir dizi farklı görevleri de vardır. Bunlardan biri bellekle ilgili işlemlerde bu kaydedici çiftinin adres kaydedicisi rolünü üstlenmesi, diğeri ise 16 bit işlemlerde akümülatör yerine kullanılmasıdır. Akümülatör (A) hem genel amaçlı kaydedici olarak kullanılmakta, hem de AMB’nin giriş ve çıkışına bağlı olduğu için bir çok işlemde varsayılan bir kaydedici olarak yaygınca kullanılmaktadır. Program Sayacı (PC) (16 bit) bellekten alınacak bir sonraki byte için adresi içermekte ve bir sonraki adresi oluşturmaktadır. Yani, PC programın sırası ile çalışmasını sağlamak için kullanılır. Yığın Göstergesi (SP) belli durumlarda Mİ’nin kaydedicilerinin durumlarının geçici olarak depolanacağı bellek kısmının adresini içeren 16 bit’lik bir kaydedicidir. 8085’in bayrak (flag) kaydedicisinin bitlerinin nasıl kullanıldığı aşağıdaki şekilde gösterilmektedir (Şekil 3.2): 7 6 5 4 3 2 1 0 S Z - AC - P - C Şekil 3.2: 8085 (8080) Mİ’nin bayrak kaydedicisi bitleri 7. bit S (Sign) İşaret Bayrağı: İşlem sonucu negatif olduğunda SF=1, pozitif olduğunda ise SF=0 olarak düzenlenmektedir. 8085’de çoğu Mİ’lerde olduğu gibi veri bitleri sağdan sola doğru numaralanmaktadır (Şekil 3.3). İşaretli sayılar için 7. bit işaret biti olarak kullanılır. Eğer sayı pozitifse bu bit “0”, negatifse “1” değeri yer almaktadır. 7 6 5 4 3 2 1 0 + - d6 d5 d4 d3 d2 d1 d0 Şekil 3.3: İşaretli sayıların bitlerinin bir kaydedicide yerleştirilmesi biçimi 6. bit Z (Zero) Sıfır Bayrağı: Bir işlem sonucu sıfır çıktığı durumda ZF=1, aksi halde ZF=0 olur. 5. bit boş (kullanılmıyor). 4. bit AC (Auxiliary Carry) Ek (Onlu) Elde Bayrağı: Bu bayrak onlu (decimal) toplama komutunda (DAA) kullanılır. Toplamanın sonucunda 3. bit’ten 4. bit’e elde (onlu elde) varsa AC bayrağı “1” olur. Aksi halde “0” olur. 3. bit boş (kullanılmıyor). Sayfa 14 / 51 2. bit P (Parity) Eşlik Bayrağı: Bu bayrak akümülatördeki “1” lerin sayısını gösterir. Eğer 1’lerin sayısı çift (even) ise PF=1, aksi halde (tek - odd) PF=0 olur. 1. bit boş (kullanılmıyor). bit C (Carry) Elde Bayrağı: Toplama esnasında elde oluşmuşsa CF=1, 0. olmadığında ise CF=0 olur. Ödev 3.1. 8085 bayraklarını inceleyerek geniş bir rapor yazın. 8085 ve ondan çok az farkı olan bir önceki versiyonu 8080 Mİ’leri zamanında çok popüler oldular ve özellikle kontrol ve otomasyon işlerinde geniş kullanım alanları buldular. Bundan dolayı Intel bir sonraki versiyon olan 16 bit 8086 Mİ’de bu Mİ’lerin bir çok özelliklerini korumuştur. Şimdilerde bile daha ucuz ve verimli bir uygulama için halen Intel’in 8 bit Mİ’leri kullanılmaktadır. 3.2. 6502 Mikroişlemcisi Bu Mİ’nin programcı açısından yapısı Şekil 3.4’te görülmektedir: 7 . . . . . . 0 Bayraklar (8) Akü (8) X (8) Y (8) 15 . . . . . . 8 Yığın Göstergesi (8) ProgramSayacı (16) Şekil 3.4: 6502 mikroişlemcisi iç yapısı Sayfa 15 / 51 X ve Y indeks kaydedicileri genel amaçlar (üzerinde işlem yapılacak verileri tutmak) için kullanılırlar. Fakat bu kaydediciler bir program tarafından denetlenebilen sayaç gibi de kullanılabilirler. Bu, özellikle dizi, matris vb. veriler üzerinde işlem yaparken gerekli olmaktadır. 6502 Mİ’nin Bayrak (flag) kaydedicisinin bitlerinin nasıl kullanıldığı aşağıdaki şekilde gösterilmektedir (Şekil 3.5): 7 6 5 4 3 2 1 0 N V 1 B D I Z C Şekil 3.5: 6502 mikroişlemcisinin bayrak kaydedicisinin bitleri 7. Bit N (Negative) Negatif bayrağı: Verinin işlenmesi sonunda sonucun işaretini belirtmek için Mİ bu bayrağı ya “1” (NF=1, eğer sonucun işareti negatifse) veya “0” (NF=0, eğer sonucun işareti pozitifse) yapar. Diğer bir deyişle N her zaman sonucun işaret bitiyle, yani en büyük basamak bitiyle aynıdır. 6. Bit V (oVerflow) Taşma bayrağı: İşaretli sayılar Mİ tarafından toplanıldığında veya çıkartıldığında bir taşma olup olmadığını V bayrağı gösterir. Taşma olayı genelde işaretli sayılar üzerinde işlemler yapılırken rastlanır. İki pozitif sayının toplanmasıyla negatif sonuç veya iki negatif sayının toplanmasıyla pozitif sonuç alınması taşma olayına örnektir. Burada problem, toplama sonucunun taşarak işaret bitini yanlış bir şekilde etkilemesidir. Taşma baş verdiğinde sonucun doğru olmadığını gösteren V bayrağıdır. Ödev 3.2: Örneklerle taşma olayını anlatın. Ödev 3.2: Çıkarma işleminde taşma ne zaman olur? 5. Bit boş (kullanılmıyor), fakat bir komut çalıştırıldıktan sonra bu bit “1”lenir. Sayfa 16 / 51 4. Bit B (Break) Dur: B bayrağı bir “Dur” komutunun işletildiğini belirtmek için kullanılır. Bu komut olduğunda BF=1, olmadığında ise BF=0’dır. 3. Bit D (Decimal mode) (Ondalık mod): 2. Bit I (Interrupt) Kesme bayrağı: Bu bayrak kesme komutlarında kullanılır. SEI komutu bu bayrağı “1” yapar ve bu, işlemciyi dışarıdan gelen bir kesme sinyaline duyarsız yapar. CLI komutu ise bayrağı “0” yaparak bu engeli aradan kaldırır. 1. Bit Z (Zero) Sıfır bayrağı: Bir aritmetik, mantık veya kaydırma işlemi yaptıran komut çalıştırıldığında işlem sonucunun sıfır olup olmamasına göre Z bayrağı “1” veya “0” olur. Sonuç sıfır ise Mİ Z’yi “1” durumuna (ZF=1), aksi durumda ise Z’yi “0” durumuna (ZF=0) geçirir. 0. Bit C (Carry) Elde bayrağı: Bu bayrağı Mİ birkaç değişik amaç için farklı biçimlerde kullanır: a) 8 bitlik iki sayı toplandığında MSB’den (en büyük basamaktan) sonra bir elde olup olmadığını kontrol edebilmek için; b) işaretsiz sayıların çıkarma işleminde, borç (borrow) olup olmadığını izlemek için. 3.3. 6800 Mikroişlemcisi Bu Mİ’nin programcı açısından yapısı Şekil 3.5’te görülmektedir: 7 0 . . . . . . Bayraklar (8) Akü A (8) 15 . . . . . 8 Akü B (8) İndis Kaydedicisi (16) XH (8) XL (8) Program Sayacı (16) PCH (8) PCL (8) Yığıt Göstergesi (16) SPH (8) SPL (8) Şekil 3.5: 6800 mikroişlemcisinin iç yapısı Bu Mİ’de 2 tane Akü mevcuttur: A ve B. Buna göre komutlarda onların hangisinin kullanılacağı gösterilmelidir. Sayfa 17 / 51 İndis kaydedicisi 16 bit’lik olup, 2 tane ayrı ayrı kaydedici gibi genel amaçlar için de kullanılabilir. Adresleri biçimlendirmede ise 16 bit olarak kullanılır. Program Sayacı (PC) (16 bit) bellekten alınacak bir sonraki byte için adresi içermekte ve bir sonraki adresi oluşturmaktadır. Yani, PC programın sırası ile çalışmasını sağlamak için kullanılır. Yığın Göstergesi (SP) belli durumlarda Mİ’nin kaydedicilerinin durumlarının geçici olarak depolanacağı bellek kısmının adresini içeren 16 bit’lik bir kaydedicidir. 6800’In bayrak (flag) kaydedicisinin bitlerinin nasıl kullanıldığı aşağıdaki şekilde gösterilmektedir (Şekil 3.6) 7 6 5 4 3 2 1 0 1 1 H I N Z V C Şekil 3.6: 6800 mikroişlemcisinin bayrak kaydedicisi bitleri 7. Bit kullanılmıyor (1). 6. Bit kullanılmıyor (1). 5. Bit H (Half Carry)Yarım Elde Bayrağı: ABA, ADC ve ADD komutları çalıştırıldığında bit 3’ten bit 4’e bir elde olduğu zaman H bit’i “1” durumuna geçer. Eğer bit 4’e elde oluşmazsa H biti “0” durumunda olur. 4. Bit I (Interrupt) Kesme bayrağı: Bu bayrak kesme komutlarında kullanılır. SEI komutu bu bayrağı “1” yapar ve bu, işlemciyi dışarıdan gelen bir kesme sinyaline duyarsız yapar. CLI komutu ise bayrağı “0” yaparak bu engeli aradan kaldırır. 3. Bit N (Negative) Eski Sonuç Bayrağı: Sonucun işaretinin eski veya artı olduğunu göstermek için kullanılır. Eğer sonuç eski ise NF=1, aksi durumda NF=0. 2. Bit Z (Zero) Sıfır Bayrağı: Sonuç sıfır ise ZF=1, aksi durumda ZF=0. 1. Bit V (oVerflow) Taşma Bayrağı: Taşmanın olup olmadığını göstermektedir. 0. Bit C (Carry) Elde Bayrağı: Bir toplama esnasında eldenin olup olmadığını göstermektedir. Sayfa 18 / 51 BÖLÜM 4. 8 BİT MİKROİŞLEMCİLERDE ADRESLEME MODLARI 4.1. Adresleme Modu Nedir? Adresleme türleri veya modları, bir komutun veya bir verinin bellekten alınıp getirilmesi veya oraya bir verinin depolanması için bu verinin adresinin belirlenmesi yöntemleridir. Genelde veri, kaydedicide veya bellekte bulunur. Bu verinin adresi komuta direkt olarak dahil edilmiş olabilir veya bu komutun işlem koduna göre belirli kurallara göre hesaplanabilir. Böylece verinin yerinin tespiti için değişik modlar kullanılmaktadır. Adresleme yöntemlerini iyi anlamak için işlemciler için temel kavramlardan olan komut ve işlem kodu kavramlarını iyi bilmek gerekir. Komut (instruction): Mikroişlemcide bir işlemi tanımlayan, bir veya birkaç adresle birlikte yada adres olmaksızın verilen karakter takımıdır. İşlem Kodu (operation code): Bilgisayarın belli bir işlem yapmasını sağlayan ve komutun birinci baytını oluşturan, makine düzeyli koddur. Örneğin, 6502 Mİ’nin 11 farklı adresleme modu vardır. 6502 komutlarının bazıları bu adresleme modlarının birkaçını kullanırlar. Örneğin, STA (Store Accumulator – akümülatöre depola) komutu 7 değişik adresleme modundan birini alabilir, kullanabilir. Yani 7 farklı STA komutu için 7 farklı işlem kodu (op-code) gereklidir. Şekil 4.1’de bir komutun genel yapısı gösterilmektedir. Operand 1 byte’lık bir işlenenin (verinin) genel adıdır. 1, 2 veya 3 byte İşlem Kodu 1. byte Operand veya Adres 2. ve/veya 3.byte Şekil 4.1:Bir komutun genel yapısı Komutların uzunluğu 1, 2 veya 3 byte olabilirler. Örnekler: 6502 Mİ için: İşlem Operand Komut 1: Komut 2: Komut 3: Kodu veya Adres Açıklama Uzunluk TXA ; (A) ← (X) 1 byte LDY # $ 5F; (Y) ← 5F 2 byte STA $ 0200; (0200) ← (A) 3 byte Sayfa 19 / 51 Not: Bu örnekte İşlem kodu kısmı Mnemonik adlanan kısaltmalarla yazılmıştır. Bu, komutun daha kolay hatırlanmasını sağlamaktadır. 4.2. İmalı Veya Doğal Adresleme İmalı adresleme modunda açık şekilde herhangi bir hafıza adresi belirtilmemektedir. Bu adreslemede yalnızca bir byte gereklidir ve bu da yalnızca işlem kodunu içerir. Bu komutlarda bir operandı veya adresini göstermek gerekmez. Çünkü ya yoktur veya MİB’nin iç kaydedicilerinden biridir. Buna göre bu adresleme usulüne kaydedici veya doğal adresleme usulü de denir. Örnekler: 6502 için: 8085 için: 6800 için: TAX MOV A,B TAB ; (X) ← (A) ; (A) ← (B) ; (B) ← (A) 1 byte 1 byte 1 byte İmalı adresleme modunun özel bir durumu da akümülatörü adresleme modudur. Bu durumda operand, akümülatörün içeriğidir. 6502 MİB komut listesinde akümülatördeki veriyi kaydırma komutları vardır (ASL). MİB bu komutu yürüttüğünde akümülatörün içeriğini bir bit sola kaydırır. Görüldüğü gibi bu adreslemede akümülatör veya onun içeriği gösterilmemekte, otomatik olarak ima edilmektedir. 4.3. Hemen Adresleme Bazen Mİ kaydedicisine veya AMB-ye, bilinen sabit bir değer verilmek istenirse bir operand adresi belirlemek gibi uzun işlemler gerekmez. Komutta işlem kodundan hemen sonra operandın kendisi, yani bilinen sabit sayı koyulur. Bu adresleme biçimine hemen, öncel, ivedi veya hazır adresleme modu denir (İmmediate). Örnekler: 6502 için: 8985 için: 6800 için: LDA #$ 7E; (A) ← 7E16 MVI A,7E; (A) ← 7E16 LDAA #$ 7E; (A) ← 7E16 2 byte 2 byte 2 byte Aşağıda bu modun formatı ve 6502 MİB’ne uygun bir örnek daha verilmiştir. 2 byte’lık bu komutun birinci byte’ı A9 işlem kodu yardımıyla hemen adresleme usulü ile komutun ikinci byte’ı olan 24 onaltılık sayısının akü’ye iletilmesini organize eder. Örnekteki birinci bayt işlem kodu, ikinci bayt ise operandın kendisidir, operandın adresi değildir. LDA komutunu çalıştırmakla Mİ 24 sayısını A akümülatörüne yükler. Komutun Assembly diliyle gösteriliş biçimindeki # işareti hemen (öncel) adresleme kullanıldığını göstermektedir. Operandın adresi işlem kodun adresinden hemen bir sonraki hafıza bölümüdür. # işaretinden Sayfa 20 / 51 sonra gelen sayı her zaman veridir. $ işaretinin verinin onaltılık cinsinde olduğunu belirttiğini not edelim. Bayt 1 işlem kodu Bayt 2 operand A9 24 LDA #$ 24 4.4. Mutlak Adresleme Bu adresleme modunda, komutta operandın kendisi değil, bulunduğu adres direkt olarak iki bayt şeklinde verilmektedir. Yani komutta işlem kodundan sonra iki bayt adres yazılır. Örnek olarak LDA (Load Accumulator) komutuyla 021A adresli hafıza bölümünün içeriği akümülatöre yazmak istersek format şöyle olur (6502): LDA $021A AD 1A 02 Bu komut AD işlem koduyla mutlak adresleme moduna göre Mİ 021A adresindeki veriyi alıp akümülatöre yükler. Adres bölümündeki ilk bayt adresin küçük baytıdır (ADL) (0A). İkinci bayt ise adresin yüksek baytını (ADH) (02) gösterir. Assembly dili bölümündeki LDA komutun mnemonic biçimini, $ işareti adresin (021A) onaltılı tabanlı (hexadecimal) cinsinden olduğunu gösterir. Mutlak adresleme modunda bir komut için 3 bayt gereklidir. Bu üç baytlık komutun çalıştırılması için de çoğunlukla 4 saat darbesi gereklidir. Birinci saat darbesi işlem kodunu getirir (Getir evresi), ikinci ve üçüncü saat darbeleri adresi getirirler, dördüncü saat darbesi ise operanddaki işlemi gerçekleştirir (Yürüt evresi). Örnekler: 8085 için: LDA 021Ah*;(A) ← (021A16) 3 byte 6800 için: LDAB #$021A;(B) ← (021A16) 3 byte * h - sayının onaltılı (hexadecimal) olduğunu göstermektedir. 4.5. Sıfır Sayfa Adresleme Bazen bellek, sayfalara ayrılarak kullanılmaktadır. Adres hatlarının sayısı 16 olan mikroişlemciler için adres uzayı 0000 – FFFF’e kadar olur. Bu adres uzayı her biri 255 (FF16) artı 0000 içinde bir bayt ile 256 bayt olan sayfalara bölünür. Bu bölümlemeye sayfalama denir. Bu sayfalardan 0000 ile başlayıp 00FF e kadar olan sayfaya sıfır sayfa (zero-page) denir. Sıfır sayfa adreslemede iki bayt kullanılır. Bir bayt işlem kodu için, bir bayt ADL (adres küçük baytı) için gereklidir. ADH her zaman 00’dır. Bu modu kullanan komutlar çoğunlukla üç saat darbesinde yürütülürler. Sayfa 21 / 51 6800 MİB’deki “Direct Addressing – Doğrudan Adresleme” modu bu adreslemeye benzemektedir. 8085’de bu mod yoktur. Sıfır sayfa adreslemede mutlak adreslemeye göre daha az baytlık yer gerektiği ve daha kısa zamanda çalıştırıldığı için programcılar mümkün oldukça bu adresleme modunu kullanırlar. Tipik olarak sıfır sayfadaki adreslere programın kullandığı veri depolanır. Yani 00XX adresleri genellikle RAM adresleri olurlar. Bu adresleme modu 6502 mikroişlemcisinde çok kullanılmaktadır. Örnek: LDA $2A ;(A) ← (002A16) 2 byte Görüldüğü gibi komutun adres kısmındaki adres bir byte olup (2A), komut yürüdüğünde önüne iki sıfır getirilmekte ve böylece belleğin 002A adresindeki veri akümülatöre iletilmektedir. 4.6. Dolaylı Adresleme Bu adresleme modu normalde deneyimli programcılar içindir. Dolaylı adreslemede komutun adres bölümü operandın bulunduğu adresi değil, adresin adresini gösterir. Bu yüzden diğer adresleme modlarından daha fazla zaman harcar. Sadece gerekli olduğu zaman bu adresleme modu kullanılır. 6502 MİB de yalnız bir tane dolaylı adresleme komutu vardır. Bu JMP (6C)dir. 4.7. İndeks Adresleme İndeksli adresleme modu hafızadaki veri dizinlerini, tablolarını veya bloklarını işlemeyi kolaylaştıran çok güçlü bir adresleme modudur. Bu adreslemede operandın gerçek (fiziksel) veya efektif denen adresi, komuttan sonra gelen operand adres kısmıyla indeks kaydedicisinin içeriğini toplamakla bulunur. Efektif (etkin) operandın adresi = operand adresi + İndeks kaydedicisinin içeriği. İndeks adresleme, mutlak adreslemeyle, sıfır-sayfa adresleme ile ve dolaylı adresleme ile beraber kullanılarak etkili görevler yapar. 6800 MİB de indeksli adresleme biraz farklıdır. Bu Mİ’de “İndeksli Adresleme Modu” 2 byte bilgi kullanır. İşlem kodundan hemen sonraki hafıza bölümünde bir adres meydana getirmek için indeks kaydedicisinin içeriğine eklenen sayı (bazen buna “offset” de denir) bulunur. Burada indeks kaydedicisinin içeriğindeki iki baytlık adresle işlem kodundan Sayfa 22 / 51 hemen sonraki veri toplanarak yeni bir adres oluşturulur. Bulunan yeni adres veriyi taşıyan adrestir. Örnek: Belleğin 2061 adresinden başlayarak 2069 adresine kadar olan 9 tane veriyi toplayıp sonucu 0500 adresine kaydetmeli (6502 için). Adres Açıklama Komut Etiket Mnem. Operand veya Adres 0200 A9 00 LDA #$ 00 (A)←00 0202 A2 09 LDX #$ 09 (X) ←09 0204 7D 60 20 LOOP ADC $2060, X (A) ←(A)+(2060+(X)) 0207 CA DEX 0208 D0 FA BNE LOOP 9 kere LOOP’a git 020A 8D 00 05 STA $0500 (0500) ← (A) 020D 4C 0D 02 END JMP END Son (X) ← (X) - 1 4.8. Göreli Adresleme Bazen bu adresleme moduna “bağıl” veya “izafi” adresleme modu da denir. Bu adresleme modunda bir sonraki çalıştırılacak komut hemen takip eden bölümde değil, başka bir bölümde bulunur. Bu adresleme usulüne sapma, dallanma (branch) komutlarında rastlanır. Sapmanın yapılması için gereken komutlar iki bayt uzunluğundadır. Sapma komutundan bir sonraki bölümde Mİ’nin bir sonraki komutunu nereden alacağı belirlenir. MİB ileriye ve geriye doğru sapma yapabildiğine göre bunları ayrı ayrı inceleyelim: (1) İleriye Doğru Sapma: Bu adresleme modu kullanan komutun 2. baytının işaret biti pozitif (“0”) olduğunda ileriye doğru sapma oluşur. Bunun için 2. byte 16’lı 00 ile 7F arasında bir değer almalıdır.Bu durumda 2. bayt Program sayacının o andaki değerinin üzerine eklenir ve elde edilmiş yeni adrese sapma yapılır. 2. bayt pozitif olduğundan dolayı yeni adres o andaki adresten büyük olacak ve böylece sapma daha ilerideki bir adrese yapılacaktır. Örnek: (6502) 0200 18 0201 90 1A CLC ; BCC $1A; 1 bayt 2 bayt Burada 90, BCC (Branch if CF=0 - eğer CF=0 ise sap) komutunun işlem kodu, 1A ise sapılacak adreslerin sayısını göstermektedir. Sapılacak adres böyle hesaplanılır: Sayfa 23 / 51 Sapılacak Adres = (PC) +2 + 1A = 0201 + 2 + 1A = 021D16. Burada 2 eklenmesi Program Sayacının içeriğinin bir sonraki adımda 0201 değil de, 0203 olacağı için yapılmaktadır. (2) Geriye Doğru Sapma: Bu adresleme modu kullanan komutun 2. baytının işaret biti negatif (“1”) olduğunda geriye doğru sapma oluşur. Bunun için 2. byte 16’lı 80 ile FF arasında bir değer almalıdır.Bu durumda 2. bayt Program Sayacının o andaki değerinden çıkarılır ve elde edilmiş yeni adrese sapma yapılır. 2. bayt negatif olduğundan dolayı yeni adres o andaki adresten küçük olacak ve böylece sapma gerideki bir adrese yapılacaktır. Örnek: (6502) 0200 18 0201 90 FA CLC 1 bayt BCC $FA; 2 bayt Burada 90, BCC (Branch if CF=0 - eğer CF=0 ise sap) komutunun işlem kodu, FA ise sapılacak adreslerin sayısının 2’ye tümleyenidir. Sapılacak adres böyle hesaplanılır: Sapılacak Adres = (PC) +2 - FA = 0201 + 2 + FFFA = 01FD16. Görüldüğü gibi 01FD16 adresi 020216 adresinden küçüktür ve dolayısı ile bu adres 020216 adresinin gerisindedir. Not: Çıkarma yerine toplama kullanıldığına dikkat edin. Sayfa 24 / 51 BÖLÜM 5. 8 BİT MİKROİŞLEMCİLERDE KOMUTLAR 5.1. Genel Bilgiler Genelde komutlar aşağıdaki guruplara ayrılırlar: (1) Veri iletme komutları; (2) Artırma ve azaltma komutları; (3) Aritmetik komutlar; (4) Mantık komutları; (5) Kontrol komutları; (6) Giriş-çıkış komutları; (7) Kaydırma ve döndürme komutları; (8) Diğer komutlar. Bu komutlar 8 bit uzunluklu verileri: (a) Mİ içeriğindeki kaydediciler; (b) Mİ içeriğindeki kaydediciler ve ana bellek (RAM); arasında transfer etmek amacıyla kullanılırlar. Not: Bu bölümde veri iletme komutlarının hepsi verilmemektedir. Bu komutları uygun Mİ’nin komut listesinde görebilirisiniz. 5.2. Veri İletme Komutları 5.2.1. 8085 Mİ Veri Aktarma Komutları: Mİ içeriğindeki kaydediciler arasında 1 bayt veri iletişimini sağlamak için kullanılan komutlar: MOV R1,R2; (R1) (R2) R2’nin içeriği R1’e iletilir (kopyalanır) şeklindedir. Burada R1 ve R2 olarak Mİ’nin 7 kaydedicisinden biri ele alınabilir (A, B, C, D, E, H ve L). Örnekler: MOV A,B; MOV C,D; MOV H,L; (A) (B) (C) (D) (H) (L) Bu komutlar 1 bayt uzunluğunda olup imalı adresleme modu kullanmaktadırlar. Çoğu zaman bu adresleme modu kaydedici-kaydedici (R-R) olarak da adlandırılır. Genelde 8085 Mİ’nin tüm veri iletme komutları bayrakları etkilememektedirler Bellekle kaydedici arasında 1 bayt veri iletme komutları aşağıdakilerdir: Sayfa 25 / 51 MOV R,M; (R) (M) Bellekteki bir hanenin içeriği kaydediciye iletilir. Burada bellek hanesinin adresi, 16 bit olarak HL kaydedici çiftinden götürülür (bu adres önceden ora yazılmış olmalıdır). R olarak 7 kaydediciden biri götürülebilir. Örneğin, D kaydedicisinin içeriğini belleğe aktarmak (kopyalamak) için: MOV D,M; (D) ((HL)) komutu kullanılabilir. Burada iki kat parantez H-L kaydedici çiftinin içeriğine göre bulunmuş bellek hanesinin içeriği anlamında kullanılmaktadır (içeriğin içeriği). Bu komutun tersi kaydedicideki veriyi bir bellek hanesine iletmektedir: MOV M,R; (M) (R) Akü’deki veriyi bellekte bir haneye ilet; Yani: MOV M,R; ((HL)) (R) R kaydedicisindeki veriyi adresi HL kaydedici çiftinde yazılmış olan bellek hanesine ilet. Örnek: MOV M,B; ((HL)) (B) ; B kaydedicisinin içeriğini adresi H-L kaydedici çiftinde olan bellek hanesine ilet. Şimdiye kadar baktığımız 8085 komutları imalı adresleme yöntemi kullanmakta ve uzunlukları 1 bayt olmaktadırlar. Hatırlatma: İmalı adresleme nedir? Bazen elimizde sabit veriler olmaktadır. Biz bu verileri hemen kullanabilmemiz için 8085’te uygun komutlar mevcuttur: MVI R,veri; (R) veri; Komutta 2. bayt olarak yerleştirilmiş olan veri gösterilen kaydediciye aktarılır. Bu komutun uzunluğu 2 bayttır ve hemen adresleme yöntemi kullanmaktadır. Hatırlatma: Hemen adresleme modu nedir? Örnekler: MVI A,23H; (A) 2316 23 onaltılık sayısını A’ya aktar; MVI H,02H; (H) 0216 02 onaltılık sayısını H’ye aktar; MVI L,00H; (L) 0016 00 sayısını L’ye aktar; Ödev 5.1: Aşağıdaki programın her bir komutu çalıştıktan sonra kaydedicilerin durumu ne olur? İlk durumlar belirsizdir (xx ile işaretleyin): Sayfa 26 / 51 (A) (B) (C) (D) (E) (H) (L) MVI A,ABH MOV B,A MOV D,B MOV E,D MOV H,E MOV L,H Ödev 5.2: Aşağıdaki programın her bir komutu çalıştıktan sonra kaydedicilerin durumu ne olur? İlk durumlar belirsizdir (xx ile işaretleyin). Belleğin 0200 adresinde 3A verisinin olduğunu varsayalım : (H) (L) (A) (B) Bellek (0200) Bellek (0301) MVI H,02H MVI L,00H MOV A,M MOV B,A MVI H, 03 MVI L,01H MOV M,A 8085 Mİ’de kaydedicilerin çift olarak 2 bayt veri depolamak için kullanıldığını biliyoruz. Peki 16 bit veriyi bu çift kaydedicilere iletme komutu var mı? Evet. Bu komutlar aşağıdakilerdir: LXI rp,16 bit veri; (rp) 16 bit veri. Burada rp çift kaydedicilerden biri, 16 bit veri ise genelde adrestir. rp (register pair) olarak B (BC), D (DE) ve H (HL) götürüldüğünü hatırlatalım. Örnek: LXI H, 0200H; (HL) 020016 Bu komut 020016 verisini (bu 2 bayt uzunluğu sahip olan bir adrestir) hemen HL kaydedici çiftine iletir. Bu durumda 0216 H, 0016 ise L kaydedicisinde yerleşecektir. Görüldüğü gibi komutun uzunluğu 3 bayt, adresleme modu hemendir 2 bayt veriyi çift kaydediciler arasında karşılıklı ileten komut: XCHG rp ; (HL) ↔ (rp) Sayfa 27 / 51 Örnek: XCHG D ; (HL)↔(DE) Bu komut HL kaydedici çiftinin içeriğindeki 16 bit veriyi DE’ye iletir, kendisi ise DE’nin içeriğindeki 16 bit veriyi alır (karşılıklı mübadele). Uzunluğu 1 bayt, adresleme modu imalıdır. En çok kullanılan kaydedici olan Akü’yü direk bellekten veri ile yükleyen veya ondaki veriyi belleğe ileten komutlar aşağıdakilerdir: LDA adres; (A) (adres) STA adres; (adres) (A) Burada komutta mutlak adres gösterilmekte ve veri iletme işlemi bellekteki bu adresle yapılmaktadır. Bundan dolayı komutun uzunluğu 3 bayt ve adresleme modu mutlaktır. Ödev 5.3: Aşağıda 3 program parçası verilmiştir. Programların ne iş yaptığını ve uzunluklarını (kaç bayt tuttuğunu) belirleyin. Hangisi daha iyi program olarak görülebilir (Bellekte tuttuğu yer ve yürütülme hızı açısından)? Program 1 Program 2 Program 3 MVI H,02H MVI L,01H MOV A,M MOV B,A LXI H,0201H MOV A,M MOV B,A LDA 0201H MOV B,A Uzunluk = bayt; =bayt; =bayt. Bazen bellekten akü’ye veri iletirken (veya tersine) HL çifti değil, diğer kaydedici çiftleri kullanılır. Bu, aşağıdaki komutların yardımıyla yapılabilir: LDAX rp; (A) ((rp)) STAX rp; ((rp)) (A) Bu komutların uzunluğu 1 bayt ve adresleme modu imalıdır Örnek: MVI A, 23H; LXI D, 0205H STAX D (A) 2316 ; (DE) 020516 ; ((DE)) (A) Soru: Bu program parçası kaç bayttır? Her komutun kullandığı adresleme modu hangisidir? Ödev 5.4: Aşağıdaki program parçasının her bir komutu yürütülürken kaydedicilerin durumunu yazın: Sayfa 28 / 51 (A) (H) (L) (B) (E) Bellek (080A) Bellek (0223) MVI A, 23H LXI H, 080AH MOV M,A MVI B,02H MOV E,A XCHG D STAX D 5.2.2. 6502 Mİ Veri Aktarma Komutları: 6502 Mİ’nde Akü’den başka, adları X ve Y olmakla 2 tane kaydedici olduğunu hatırlatalım. Bu Mİ’de kaydediciler ve bellek arasında yalnızca 1 bayt veri aktarılabilmektedir. X ve Y kaydedicileri ile Akü arasında veri iletme komutları aşağıda gösterilmektedir: TAX; (X) (A) TAY; (Y) (A) TXA; (A) (X) TYA; (A) (Y) Bu komutlarda imalı adresleme modu kullanılmaktadır. Uzunlukları 1 bayttır. Bu komutlar N ve Z bayraklarını etkilerler. Ayrıca, Akü ile bellek arasında veri iletimi komutları mevcuttur: LDA adres; (A) (adres) STA adres; (adres) (A) Bu komutlar kullanıldığında eğer veriler 0. sayfada ise adresin büyük baytını göstermeye gerek kalmamaktadır ve böylece adres kısmında 2 bayt değil, 1 bayt yazılmaktadır. Örnek: LDA LDA STA STA $ 02; $ 0200; $ 0A; $ 0203; (A) (000216) (A) (020016) (000A16) (A) (020316) (A) Bu komutlardan LDA komutu hemen adresleme modu kullanılmakla da yürütülebilir. Bu durumda # işareti kullanılır: LDA # $ 23; (A) 2316 Not: STA komutunun hemen adresleme modunda kullanılamayacağı açıktır. Aynı prensiple LDX, LDY ve STX ve STY komutları da kullanılabilir. Bunlar uygun olarak LDA ve STA komutları gibi hemen (yalnızca LDX ve LDY komutlarında), sıfır sayfa ve mutlak adresleme kullanabilirler. Sayfa 29 / 51 Örnekler: LDX #$ 23 ;(X) 2316 LDY $ 23 ;(Y) (002316) STX $ 0203 ;(020316) (X) Ödev 5.5. Aşağıdaki tablodaki komutlar yürütüldükten sonra kaydedicilerin durumlarını yazın (ilk durumlar belirsizdir: xx). (A) (X) (Y) Bell.(0205) Bell.(0206) Bell.(0207) LDA # $ 4A LDX # $ 5B TAY STA $ 0205 STX $ 0206 STY $ 0207 LDX $ 0205 5.2.3. 6800 Mİ Veri Aktarma Komutları: Bu Mİ’de 2 Akü ve 2 tane 8 bit kaydedici olarak ta kullanılabilen bir tane X kaydedicisinin olduğunu hatırlayalım. Bu Akü’ler (A ve B) arasındaki veri iletme komutları (uzunlukları 1 bayt) aşağıda gösterilmektedir: TAB ; (B) (A) TBA ; (A) (B) Soru: Bu komutların adresleme modu nedir? Akü’lerle bellek arasında veri iletimi komutları 3 bayt uzunlukta olup mutlak adresleme modu kullanırlar: LDAA adres; (A) (adres) LDAB adres; (B) (adres) STAA adres; (adres) (A) STAB adres; (adres) (B) 6800’ın veri iletme komutları N ve Z bayraklarını etkilerler. Ayrıca V bayrağını sıfırlarlar. 6800 Mİ’nde de baktığımız LDAA ve LDAB komutları hemen adresleme modu kullanılmakla uygun Akü’ye veriyi hemen iletebilme olanakları mevcuttur: LDAA # $ 23; (A) 2316 LDAB # $ 23; (B) 2316 Sayfa 30 / 51 Ödev 5.6: Her 3 Mİ’nin veri iletme komutlarını analiz edin. Hangi adresleme modları kullandıklarını, uzunluklarının kaç bayt olduğunu ve hangi bayrakları ve nasıl etkilediklerini literatür kullanarak bir tablo şeklinde hazırlayın. Bu tabloyu ileride devam ettirilecek şekilde biçimlendirin. 5.3. Artırma ve Azaltma Komutları Bir program yazıldığında çoğu zaman bir veya birden fazla sayaca ihtiyaç duyulur. Bu ihtiyaçları karşılamak için, yani program yardımı ile sayaç oluşturabilmek için tüm Mİ’lerde Artırma ve Azaltma komutları kullanılmaktadır. Bu komutlar genelde bir kaydedicinin (bazen bir bellek hanesinin) içeriğini 1 artırmakla veya 1 azaltmakla sayaç görevini yapmağa yardımcı olurlar. 5.3.1. 8085’in Artırma ve Azaltma Komutları Bu Mİ’de kaydedicinin içeriğini 1 artıran komut: INC ; (R) (R)+1 R ve 1 azaltan komut: ; (R) (R)-1 DCR R şeklindedirler. Bellekteki bir hanenin içeriğini artıran ve azaltan komutlar aşağıda verilmiştir: M ; ((HL)) ((HL))+1 DCR M ; ((HL)) ((HL))-1 INC Görüldüğü gibi bu komutların uzunluğu 1 bayttır ve imalı adresleme modu kullanmaktadırlar. Şimdiye kadar baktığımız bu 4 komut C (elde) bayrağından başka yerde kalan 4 bayrağı etkiler. 8085 Mİ’si 2 bayt verilerle işlem yapabildiğinden dolayı 2 baytlık veriler üzerinde de artırma ve azaltma komutları mevcuttur: INX rp DCX rp ; (rp) (rp) + 1 ; (rp) (rp) – 1 Bu 2 komut hiçbir bayrağı etkilemezler. Örnekler: MVI C,1FH ; (C) 1F16 INC C ; (C) (C) + 1 MOV B,C ; (B) (C) DCR B ; (B) (B) - 1 DCX B ; (BC) (BC) – 1 Sayfa 31 / 51 Soru: Bu program parçası ne iş yapmakta ve bellekte kaç bayt yer tutmaktadır 5.3.2. 6502’nin Artırma ve Azaltma Komutları 6502 Mİ’nde artırma ve azaltma komutları X ve Y kaydedicileri ile bellekteki bir haneye uygulanabilmektedir: INX ; INY ; DEX ; DEY ; INC adr; DEC adr; (X) (X) + 1 (Y) (Y) + 1 (X) (X) - 1 (Y) (Y) – 1 (adr) (adr) + 1 (adr) (adr) – 1 Son iki komuttan başka diğer komutlar 1 bayt uzunlukta olup imalı adresleme modu kullanmaktadırlar. 2 son komut bellekteki bir hane ile işlem yaptığından dolayı bu komutlarda adresin verilmesi (0 sayfa, yada mutlak olarak) gerekmektedir. Böylece bu komutların uzunluğu 2 veya 3 bayt olmaktadır. Dikkat: Bu işlemcide Akü’deki verinin artırılması veya azaltılması komutları yoktur. Önemli: 6502’nin tüm artırma ve azaltma komutları N ve Z bayraklarını etkilerler. Ödev 5.7: Aşağıdaki programı inceleyin ve uygun kaydedicilerin ve bellek hanelerinin içeriklerini her komuttan sonra nasıl olacağını yazın: Açıklama Komut LDX #$AF (X) (X) + 1 TXA (A) (X) TXY (Y) (X) DEY INC $0205 (A) (Y) Bell. (X) AF16 INX STA (X) (020516) (A) (Y) (Y) - 1 $0205 (020516) (020516) + 1 5.3.3. 6800’ın Artırma ve Azaltma Komutları 6800 Mİ’nde 2 Akü olduğu için bu Akü’lerin her biri için ayrı ayrı artırma ve azaltma komutları vardır. Ayrıca 16 bit X kaydedicisi için de bu komutlar mevcuttur. Bellekte herhangi bir hanenin de içeriği ile bu işlemleri yapan komutlar mevcuttur Sayfa 32 / 51 Örnekler: 1. INCA ; (A)(A) +1 2. INCB ; (B)(B) +1 3. DECA ; (A)(A) -1 4. DECB ; (B)(B) -1 5. INX ; (X)(X) +1 6. DEX ; (X)(X) -1 7. INC adr ; (adr)(adr) +1 8. DEC adr ; (adr)(adr) -1 Bu örneklerde 1. - 6. komutların uzunluğu 1 bayt olup imalı adresleme modu kullanmaktadırlar. Kalan 7. ve 8. komutlar mutlak (uzunluğu 3 bayt) ve genişletilmiş (uzunluğu 2 bayt) adresleme modu kullanmaktadırlar. Dikkat: Bu komutlar hepsi N ve Z bayraklarını etkilerler, V bayrağını ise sıfırlarlar. Ödev 5.8: Belleğin 0203, 0204 ve 0205 hanelerinde yerleşmiş olan verileri uygun olarak 0306, 0307 ve 0308 bellek hanelerine ileten program parçalarını her üç Mİ için yazın. 5.4. Aritmetik Komutlar 8 bit Mİ komut listelerinde genelde toplama ve çıkarma gibi işlemler için komutlar bulunmaktadır (çarpma ve bölme işlemleri program yazarak gerçekleştirilir). Bu komutlar 8 bit veriyi toplarlar veya çıkarırlar. 16 bit toplama komutu yalnızca 8085 Mİ’de vardır. Genelde aritmetik işlemler ikili (16’lı) sayılar üzerinde yapılmaktadır. Fakat bu Mİ’lerde 10’lu sayılar üzerinde de aritmetik işlemler yapılabilmektedir. Dikkat: Aritmetik komutların birçok bayrağı etkilediğini unutmayın. Aritmetik işlemlerin nasıl yapıldığını anlamak için 16’lı sayılar üzerinde toplama ve çıkarma işlemlerinin nasıl yapıldığını bilmek gerekmektedir. Dikkat: Bütün aritmetik komutlar, verilerden birisinin Akü’de olduğunu ve genelde cevabın da Akü’de birikeceğini öngörmektedir. 5.4.1. 8085 Mİ Aritmetik Komutları Bu Mİ komutları verilerden birinin önceden Akü’ye yerleştirilmiş olmasını öngörmektedirler. Cevabın da Akü’de alınacağı sabit olarak bilinmektedir. Önce Toplama komutlarına bakalım. Veriler kaydedicilerde ise: ADD R ; (A)(A)+(R) Bu komut Akü’deki veri ile R kaydedicisindeki veriyi toplayarak toplamı yine Akü’ye aktarır. Sayfa 33 / 51 R olarak B, C, D,E, H, L ve M (Bellek - Memory) götürülebilir. Komutun uzunluğu 1 bayt, adresleme modu imalıdır. R yerine Bellek (M) olduğunda, bellekteki verinin adresi HL kaydedici çiftinden götürülür (bu adres önceden oraya yüklenmiş olmalıdır). Örnekler: ADD B ; (A)(A)+(B) ADD M ; (A)(A)+(M) ; (A)(A)+((HL)) Ödev 5.9: MVI A,39H; MVI C,FAH; ADD C ; programı Mİ tarafından yürütüldükten sonra Akü’de hangi sayı olacaktır? Elimizde 8 bit sabit veriler olduğunda bu verilerin kendilerini hemen adresleme modu kullanarak toplama (veya çıkarma) işleminde işlemine sokabiliriz: ADI veri; (A)(A)+veri Görüldüğü gibi komutun uzunluğu 2 bayttır. İkinci bayt olarak 8 bit veri yazılmaktadır. Örnek: ADI 2DH ; (A)(A)+2D16 Bakılan komutlarda Elde bayrağının (CF) iştirak etmediği görülmektedir. Bazen, toplama esnasında bu bayrağın değerinin dikkate alınması istenmektedir. Bunun için bakılan komutlar değişik bir şekilde kullanılmaktadır: ADC R ACI veri Örnekler: ; (A)(A)+(R)+(CF) ; (A)(A)+veri+(CF) ADC B ; (A)(A)+(B)+(CF) ACI 85H ; (A)(A)+8516+(CF) Ödev 5.10: Belleğin 0200, 0201 ve 0202 adreslerinde önceden yazılmış olan baytları toplayan programı bellekte en az yer tutacak şekilde yazın. Ödev 5.11: Doğum gününüz, doğum ayınız ve öğrenci numaranızın son 2 rakamını 16’lı sayılar olarak kabul edin ve onların toplamını bulan program parçası yazın. Ödev 5.12: Aşağıdaki program parçasının her bir komutu çalıştıktan sonra uygun kaydedicilerin ve bayrakların durumunu yazın: (A) (B) (SF) (ZF) (AC) CLC MVI A,23H ADI 87H MVI B,FFH ADD B ACI 99H Sayfa 34 / 51 (PF) (CF) Çıkarma komutlarında Azalan önceden Akü’ye yerleştirilmiş olmalıdır ve farkın da Akü’ye atılacağı bilinmelidir. SUB r ; (A)(A)-(R) Burada R olarak 7 kaydediciden biri ve bellek (M olarak) götürülebilir. R’in bellek olması durumunda azaltanın adresi otomatikman HL kaydedici çiftinden götürülecektir. Hemen adresleme modu kullanan ve uzunluğu 2 bayt olan çıkarma komutu: SUI veri ; (A)(A)-veri şeklindedir. Çıkarma esnasında borç alma imkanı tanıyan komutlar: SBB R ; (A)(A)-(R)-(CF) SBI veri ; (A)(A)-veri –(CF) Ödev 5.13: Ödev 10’daki bellek adreslerindeki verilerin çıkarılması (yani (0200)(0201)-(0202) ) programını yazın. Ödev 5.14: Doğum yılınızın son 2 rakamından doğum gününüzü ve bu farktan da öğrenci numaranızın son 2 rakamını (16’lı sayılar olarak) çıkaran program yazın. Ödev 5.15: Aşağıdaki program parçasının her bir komutu çalıştıktan sonra uygun kaydedicilerin ve bayrakların durumunu yazın: (A) (C) (SF) (ZF) (AC) (PF) (CF) CLC MVI A,87H SUI 23H MVI C,54H SBB C Ödev 5.16: 041F ve 0420 adresli bellek hanelerinde olan sayıları toplayan, toplamdan 0306 adresli bellek hanesindeki sayıyı çıkaran, farkın üzerine 5416 ekleyen ve sonucu 0204 adresine gönderen programı yazın. Veriler 8 bittir. Ödev 5.17: Ödev 5.16’daki problemi 16 bit sayılar için yapın. 16 bit 1. sayının küçük baytı 041F, büyük baytı 0420 adreslerinde, 2. sayının küçük baytı 0421, büyük baytı ise 0422 adreslerinde olduğunu varsayın. Toplamdan 0306 ve 0307 adreslerindeki sayı çıkarılacaktır. Eklenen sayı 545416 olacaktır. Sonuç 0204 ve 0205 adreslerine gönderilmelidir. 8085 Mİ’si 8 bit Mİ’ler arasında 16 bit verileri direk toplamaya olanak tanıyan tek bir komuta sahiptir: Sayfa 35 / 51 DAD rp ; (HL)(HL)+(rp) Burada rp (register pair – kaydedici çifti) olarak BC, DE, HL veya SP 16 bit kaydedicilerinden birisi götürülebilir. Komut 1 bayt uzunluklu, adreslemesi imalıdır. Örnek: DAD B ; (HL)(HL)+(BC) Ödev 5.18: Ödev 17’yi DAD komutu kullanarak yeniden düzenleyin. Onlu toplama yapabilmek için önce 16’lı toplama yapılmalıdır. Yani, 10’lu sayılar 16’lı olarak 8 bit toplama komutlarından birisinin yardımıyla toplanır. Sonra DAA 10’lu tashih komutunun yardımıyla bu 16’lı toplam 10’lu sonuca dönüştürülür. Uzunluğu 1 bayttır. Hatırlatma: DAA komutunun nasıl çalıştığını anlamak için 2-10’lu toplama kurallarını bilmek gerekir: (Kural 1: Eğer toplamdaki yarımbayt 9’dan büyükse bu yarımbayta 6 eklenir; Kural 2: Eğer toplama zamanı bir yarımbayttan elde varsa bu yarımbayta 6 eklenir). Örnek: (A) (B) (AC) (CF) MVI A, 38 38 xx xx xx MVI B, 47 38 47 xx xx ADD B 7F 47 0 0 DAA 85 47 0 0 5.4.2. 6502 Mİ’nin Aritmetik Komutları Bu Mİ’de 8 bit veriler üzerinde hem toplama, hem de çıkarma komutları elde bayrağını direk olarak kullanmaktadırlar. Bu yüzden bu işlemler yapılmazdan önce bu bayrağın durumuna dikkat edilmelidir. Genelde toplama işleminden önce elde bayrağını “0”lamak, çıkarma işleminden önce ise bu bayrağı “1”lemek gerekir. Toplama komutları: ADC veri ;(A)(A)+veri+(CF) ADC adr. ;(A)(A)+(M)+(CF) Burada 1. komutun uzunluğu 2 bayt (hemen adresleme modu), 2. komutun uzunluğu ise adresleme moduna bağlı olarak 2 (0 sayfa adreslemede) veya 3 bayt (mutlak adreslemede) olur. Sayfa 36 / 51 Örnek: Açıklama (A) (CF) CLC (CF)0 xx 0 LDA #$ 28 (A)2816 2816 0 ADC #$ 85 (A)(A)+8516+0 AD16 0 Bu program 5 bayt uzunluğa sahiptir. Ödev 5.19: Aşağıdaki programı inceleyin ve tabloyu doldurun. Bunun için belleğin aşağıdaki adreslerinde gösterilen 16’lı verilerin olduğunu varsayın: [0040]=61 [0050]=39 [0041]=B5 [0051]=3F [0080]=… [0081]=… Cevabı aşağıdaki tabloya yazın. Açıklama (A) (CF) CLC LDA $ 40 ADC $50 STA $ 80 LDA $ 41 ADC $ 51 STA $ 81 Çıkarma komutu da aynen toplama komutuna benzer çalışmaktadır. Fakat bu komutu çalıştırmazdan önce elde bayrağının SEC komutu ile “1”lendiğini unutmayın. Bu, gerektiğinde borç almak için kullanılır. SBC veri ; (A)(A)-veri- (CF) SBC adr. Örnek: ; (A)(A)-(M)- (CF) SEC ; (CF)1 LDA #$ AA ; (A)AA16 SBC #$ 86 ; (A)(A)-8616-0 Onlu sayılar üzerinde aritmetik işlemler yapabilmek için 6502 Mİ’de onlu mod bayrağı kullanılır. Eğer bu bayrak “1” durumunda ise, işlemler onlu modda yapılır. Sayfa 37 / 51 Örnek: Komutlar Açıklama (A) SEC (DF)1 xx 1 x CLC (CF) xx 1 0 LDA #$ 69 (A)6916 6916 1 0 ADC #$ 95 (A)(A)+9516 +0 6416 1 1 SBC #$ 47 (A)(A)- 4716 - 0 1716 1 1 (DF) (CF) Ödev 5.20: Aşağıdaki tabloyu doldurun: Komutlar (A) (DF) (CF) (NF) SEC SED LDA #$ 69 SBC #$ 73 ADC #$ 85 CLD 5.4.3. 6800 Mİ’nin Aritmetik Komutları 6800 Mİ’de 2 Akü olduğundan dolayı bu Akü’lerle ayrı ayrı aritmetik işlemler yapılmaktadır. Komutlara bakalım: ADDA veri veya adres A ile topla ADDB veri veya adres B ile topla SUBA veri veya adres A’dan çıkar SUBB veri veya adres B’den çıkar Bu komutlarda toplananlardan biri (veya azalan) önceden uygun Akü’ye yerleştirilmelidir. Görüldüğü gibi komutlar 2 veya 3 bayt uzunluğunda olurlar. Ayrıca, ABA ;(A)(A)+(B) komutu A ile B’nin içeriklerini toplar ve toplamı A’da tutar. Ve: SBA ;(A)(A)-(B) komutu da A’dan B’nin içeriğini çıkarır ve farkı A’ya aktarır. Bu komutlar elde bayrağını dikkate almamaktadırlar. Elde bayrağını da dikkate alan komutlar aşağıda gösterilmektedir: Sayfa 38 / 51 ADCA veri veya adres ADCB veri veya adres SBCA veri veya adres SBCB veri veya adres 6800 Mİ’nde onlu sayılar üzerinde toplama, düzeltme (tashih) komutu olan DAA ile yapılmaktadır. 5.5. Mantık Komutları 8 bit Mİ’lerde mantık komutları 8 bit ikili (binary) veriler üzerinde VE, VEYA, ÖZEL VEYA, DEĞİL ve diğer işlemleri yapmaktadırlar. Burada dikkat edilmesi gereken nokta, bu işlemlerin bit bit yapılması, yani komşu bitlere hiçbir eldenin söz konusu olmadığıdır. VE, VEYA ve ÖZEL VEYA gibi 2 tane veri talep eden işlemlerde verilerden biri her zaman önceden Akü’de olmalıdır. Sonucun da her zaman Akü’de olacağını bilmek gerekir. Mantık komutları genelde bazı bayrakları, özellikle Sıfır bayrağını (ZF) etkilemektedir. Tek bir veri üzerinde işlem yapılacaksa (DEĞİL gibi) bu veri Akü’de yerleştirilmiş olmalıdır. 5.5.1. 8085 Mİ Mantık Komutları 8085 Mİ’de 3 mantıksal komut çeşitli kombinasyonlarda kullanılır. Bunlar VE (AND), VEYA (OR) ve ÖZEL VEYA (XOR) işlemlerini yapan komutlardır. ANA R; (A)←(A) & (R) ORA R; (A)←(A) (R) XRA R; (A)←(A) (R) Burada R yerine 7 kaydediciden birisinin kullanılabileceğini hatırlatalım. Ayrıca, R yerine M (Bellek) de kullanılabileceğini tahmin ediyorsunuz (bu durumda bellekteki adres HL’dedir). Bu komutların uzunluğu 1 bayt, adresleme yöntemi ise imalıdır. Sabit verilerle mantıksal işlem yapan komutlar: ANI veri; (A)(A) & veri ORI veri; (A)(A) veri XRI veri; (A)(A) veri Bu komutlar hemen adresleme yöntemi kullanırlar ve uzunlukları 2 bayttır. Sayfa 39 / 51 Örnek: Komutlar (A) (B) (SF) (ZF) (PF) MVI A, 01010101B 5516 xx x x x MVI B, 11100010B 5516 E216 x x x ORA B F716 E216 1 0 0 ANI A, 01010010B 5216 E216 0 0 0 XRA B B016 E216 1 0 0 Ödev 5.21: Aşağıda verilmiş olan program parçasını yorumlayın: Komutlar (A) (C) (SF) (ZF) (PF) MVI A, 37H MVI C, 6AH ORA C ANA C XRA C 5.5.2. Maskeleme İşlemleri Mantıksal işlemlerinin en büyük kullanım alanları otomasyon ve kontrol problemleridir. Bu problemlerde çoğu zaman bir veya birkaç bit üzerinde işlem yapılması istenmektedir. Bunlar ayrı ayrı bitlerin “1”e, “0”a veya tersine dönüştürülmesi işlemleridir. Böyle problemleri yalnız maske (örtü) denilen ikinci bir baytla mantık işlemleri yürütmekle yapmak mümkündür. Maskelerin oluşturulması kuralları şöyledir: (1) Eğer bir veya birkaç bit “1”e dönüştürülecekse oluşturulacak maskenin bu bitlerine “1”, diğer bitlerine “0” yazmak gerekir; (2) Eğer bir veya birkaç bit “0”a dönüştürülecekse oluşturulacak maskenin bu bitlerine “0”, diğer bitlerine “1” yazmak gerekir; (3) Eğer bir veya birkaç bit tersine dönüştürülecekse oluşturulacak maskenin bu bitlerine “1”, diğer bitlerine “0” yazmak gerekir. 1. durumda dönüştürülecek olan bayt uygun maske ile VEYA işlemine tabi tutulmalı, 2. durumda verilen bayt uygun maske ile VE işlemine ve 3. durumda da verilen bayt oluşturulmuş uygun maske ile ÖZEL VEYA işlemine tabi tutulmalıdır. Örnek: Verilmiş bir baytın 2. ve 3. bitlerini “1”leyen; 4. ve 7. bitlerini “0”layan ve 5., 6. ve 0. bitlerini tersleyen program parçasını yazın. Sayfa 40 / 51 Önce maskeleri oluşturmak gerekir. Verilmiş baytın xxxx xxxx (x={0;1}) olduğunu varsayalım. Bu durumda: 7654 3210 xxxx xxxx M1 = 0000 11002=0C16 M0 = 0110 11112=6F16 MT = 0110 00012=6116 Girilen verinin B216 olduğunu varsayalım: Komutlar (A) (SF) (ZF) (PF) MVI A, B2H B216 x x x ORI 0CH BE16 1 0 1 ANI 6FH 2E16 0 0 1 XRI 61H 4F16 0 0 0 En son elde ettiğimiz bayta (sonuç) dikkat edelim: Bitlerin numaraları: 7654 3210 İlk veri = B216 = 1011 0010 Sonuç = 4F16 = 0100 1111 Görüldüğü gibi sonuçta: 2. ve 3. bitler “1”lenmiş; 4. ve 7. bitler “0”lanmış ve 0., 5. ve 6. bitler terslenmiştir. Ödev 5.22: 3316 baytının 3. ve 5. bitlerini “0”a; 2. ve 6. bitlerini “1”e; 4. ve 7. bitlerini ise tersine dönüştürmek için gereken maskeleri oluşturun ve program parçasını yazın. 5.5.3. 6502 Mİ Mantıksal Komutları Bu Mİ’de de mantıksal işleme tabi tutulacak baytlardan biri önceden Akü’ye yerleştirilmelidir. Sonuç Akü’de olacaktır. 6502 Mİ mantıksal komutları yalnızca 2 bayrağı (N ve Z) etkilemektedirler. 6502 mantık komutlarının kısaltılmış biçimi: AND (VE) ORA (VEYA) XRA (ÖZEL VEYA) şeklindedir. Bu komutlar hemen, sıfır ve mutlak adresleme yöntemleri olmakla 3 modifikasyonda kullanılırlar. Sayfa 41 / 51 Örnek: Komutlar Açıklama (A) LDA # $ 45 (A)4516 4516 0 0 AND # $ BA (A)(A) & BA16 0016 0 1 ORA # $ 86 (A)(A) 8616 8616 1 0 XRA # $ 79 (A)(A) 7916 FF16 1 0 AND # $ 53 (A)(A) & 5316 5316 0 0 (NF) (ZF) Ödev 5.23: Ödev 5.22’deki koşullar için 6502 Mİ programını yazın. Bu Mİ’de ikili baytları karşılaştırmak için yalnızca sıfır bayrağını etkileyen bir komut daha var: BIT adres; (A) & (M) Komut, bellekteki baytla Akü’nün içeriğini mantıksal çarparak ZF’i düzenler. Sonucun hiçbir yere gönderilmediğine dikkat edin. 5.5.4. 6800 Mİ Mantıksal Komutları Bu Mİ’de 2 akü olduğundan dolayı burada mantıksal komutlar ikişerdir: ANDA ANDB ORAA ORAB EORA EORB Tabii ki bu komutlar hemen, mutlak ve diğer adresleme yöntemleri kullanarak çeşitli modifikasyonlarda karşımıza çıkabilirler. Bunlardan başka 6800 Mİ’nde mantıksal çarpma yapan, fakat sonucu hiçbir yere göndermeyen 2 komut daha vardır: BITA veri veya adr.; (A) & veri veya (adr.) BITB veri veya adr.; (B) & veri veya (adr.) Bu komutlar özel olarak Akü’lerin içeriklerini etkilemeden N ve Z bayraklarını düzenlemek için kullanılırlar. Genelde 6800 mantık komutları N ve Z bayraklarını etkiler, V bayrağını ise “0”larlar. Ödev 5.24: Ödev 5.22’deki koşullar için 6800 Mİ programını yazın. Sayfa 42 / 51 5.6. Kontrol Komutları Kontrol (dallanma veya sapma, döngü) komutları olmadan programlamanın da bir anlamı olmazdı. Bu komutların sayesinde programlarda çeşitli döngüler ve dallanmalar sağlanarak belirli koşullar oluştuğu sürece programların belirli kısımlarının tekrar yapılması sağlanmakta ve bu da programlamanın verimliliğini sağlamaktadır. Kontrol komutları belirli bayrakların durumuna göre çalışırlar. Bu bayrakların durumları programın gidişatı süresince oluşmakta ve yapılan hesaplamanın o andaki durumunu göstermektedir. Yapılan hesaplama sonucunu değiştirmeden bayrakları düzenlemek için en çok kullanılan komutlar genelde bütün Mİ’lerde bulunan karşılaştırma komutlarıdır. Bu komut Mİ’ye göre değişik yerlerdeki baytları karşılaştırır ve sonuç olarak yalnızca bayrakları (özellikle, ZF ve NF veya SF) düzenler. 8085’de bu komut: CMP adres; CPI veri; 6502’de: CMP veri veya adres; CPX veri veya adres; CPY veri veya adres; ve 6800’da ise: CMPA veri veya adres; CMPB veri veya adres şeklindedirler. Dikkat: Kontrol komutları hiçbir bayrağı etkilemezler. Kontrol komutları koşulsuz ve koşullu olmakla 2 yere bölünürler. 5.6.1. Koşulsuz Dallanma Komutları Bu komutlar hiçbir koşula bakmazsızın komutta gösterilen veya hesaplanan bir adrese dallanma yaparlar. Sapılan adres bu komuttan ileride veya geride olabilir. 8085’te bu komut: JMP adr. şeklindedir ve komut yürütüldüğünde adres kısmında gösterilen mutlak adrese dallanılır. Komutun uzunluğu 3 bayttır. 6502’de bu komut: JMP adres veya JSR veri Sayfa 43 / 51 şeklindedirler. Burada adres olarak ya sıfır sayfa, yada mutlak adres olmalıdır. Veri olarak ise bir bayt götürülür ve bu baytın negatif veya pozitif olmasına bağlı olarak geriye veya ileriye göreli adresleme yapılır (Bknz: 4.8. Göreli adresleme). 6800 Mİ’deki koşulsuz dallanma komutları 6502 Mİ’dekine benzer şekildedir (JMP adres ve JSR veri). Kontrol komutları arasında koşullu dallanma komutlarının büyük önemi vardır. Bunlar Mİ’ye göre değişiklikler gösterdiği için ayrı ayrı bakılacaktır. 5.6.2. Koşullu Dallanma Komutları 8085 Mİ’de kullanılan 4 bayrağın (ZF, CF, SF ve PF) durumuna göre 8 koşullu dallanma komutu kullanılır. Bu komutlar aşağıda gösterilmektedir: JZ adres; Eğer (ZF)=1 ise adres JNZ adres; Eğer (ZF)=0 ise adres JC adres; Eğer (CF)=1 ise adres JNC adres; Eğer (CF)=0 ise adres JP adres; Eğer (SF)=0 ise adres JN adres; Eğer (SF)=1 ise adres JPE adres; Eğer (PF)=1 ise adres JPO adres; Eğer (PF)=0 ise adres Tüm bu komutların uzunluğu 3 bayttır. Örnek: M1: M2: MVI DCR JNZ MOV A,05H A M1 B,A ; (A)05 ; (A)(A)-1 ; Eğer (ZF)=0 ise, M1 ; (B)(A) Bu örnekte (ZF)=0 olduğu sürece program M1’e geri dönecektir (yani 4 kez). DCR A komutu 5. kez yürütüldüğünde (A)=0 olacak ve bu (ZF)=1 yapacak. Bunun sonucunda ise M2 etiketindeki komut yürütülecektir. Ödev 5.25: Aşağıdaki program parçası çalıştıktan sonra en sonunda nerede duracaktır (INT 20 “dur” komutudur): MVI M1: M2: M3: M4: M5: M6: M7: M8: A,21H MVI D,65H SUB D ADD D JNZ M1 JC M2 JP M7 JMP M8 INT 20 INT 20 Sayfa 44 / 51 6502 Mİ’deki 8 koşullu dallanma komutları 4 bayrağı (ZF, CF, NF ve VF) kullanırlar: BEQ veri; Eğer (ZF)=1, veri kadar sap BNE veri; Eğer (ZF)=0, veri kadar sap BCS veri; Eğer (CF)=1, veri kadar sap BCC veri; Eğer (CF)=0, veri kadar sap BMI veri; Eğer (NF)=1, veri kadar sap BPL veri; Eğer (NF)=0, veri kadar sap BVS veri; Eğer (VF)=1, veri kadar sap BVC veri; Eğer (VF)=0, veri kadar sap Bu komutlar göreli adresleme yöntemi kullanırlar (Bknz: 4.8). Eğer komutun ikinci baytı olan veri pozitif bir sayı ise (yani veri 7F ise) bu durumda dallanma programdaki ileri bir adrese, veri negatif olduğunda (yani veri 80 ise) dallanma programdaki gerideki bir adrese olacaktır. Örnek: 0200 CLC 0201 LDA # $ 01 0203 ADC # $ 05 0205 BCC # $ 1A 0207 BRK Bu örnekte önce Elde bayrağı sıfırlanır, sonra Akü’ye 01 aktarılır ve sonra 01+05 toplama işlemi yapılır. Toplam (06) elde oluşturmadı ve Elde bayrağı “0” durumunda kaldı. BCC komutu (CF)=0 ise 1A kadar sap demektedir. (CF)in içeriği “0“ olduğundan dolayı bu dallanma oluşacak. Dallanılacak adres böyle hesaplanılacaktır: 1A sayısı pozitif olduğundan dolayı: Dallanılacak Adres= (PC)+1+1A16= 020616+1+1A16=022116. 020716 001A16 + 022116 Eğer verilmiş örnekte 1A16 yerine EA16 verilmiş olsaydı hesaplama böyle yapılacaktı: Dallanılacak Adres= (PC)+1+EA16 = 020616+1+FFEA16=01F116. 020716 FFEA16 + (Elde atılır) 101F116 Sayfa 45 / 51 Probleme ters yönden bakalım. Diyelim ki dallanma 0206 adresinden geriye 01FF) adresine yapılmalıdır. Bu durumda koşullu dallanma komutunun ikinci baytı olarak yazılacak veri nasıl hesaplanır? Veri = 020616 – 01FF16 = 716 Yani dallanma 7 bayt geriye yapılmalıdır. Bu durumda dallanma komutunun 2. baytına yazılacak olan veri - 07’nin 2’ye tümleyen kodu olmalıdır: -07 10000111(11111001)2’ye tümleyen F916 (Komuttaki 2. bayt = F916 olacaktır). Ödev 5. 26: Aşağıdaki programı analiz edin. Hangi dallanma komutu sağlanacaktır ve sapma en son nereye olacaktır? 0301 0302 0305 0308 030A 030C 030D 030E 030F S1 M1 M2 S2 SEC LDA SBC BCC BCS BRK # $ 80 # $ 40 BRK M1 M2 $ 02 $ 03 6800 Mİ’de kontrol komutları 6502’ninkine benzerler, fakat bu Mİ komut listesinde farklı kontrol komutları da vardır. ZF, CF, NF ve VF bayrakları üzere dallanma yapan komutlar aynen kalırlar. Fakat bu Mİ’de diğer dallanma komutları da mevcuttur ve bu komutlar birden fazla bayrağın durumuna göre dallanma yapabilirler: BGE veri; Eğer (NF) (VF)=0 ise veri kadar dallan BLT veri; Eğer (NF) (VF)=1 ise veri kadar dallan BHI veri; Eğer (CF) (ZF)=0 ise veri kadar dallan BLS veri; Eğer (CF) (ZF)=1 ise veri kadar dallan BGT veri; Eğer (ZF) ((NF) (VF))=0 ise veri kadar dallan BLE veri; Eğer (ZF) ((NF) (VF))=1 ise veri kadar dallan 5.7. Giriş Çıkış Komutları Bu komutlar bir bayt verinin çevre cihazlarından Mİ’ye dahil edilmesi ve Mİ’den çevre cihazlarına çıkarılması için kullanılmaktadırlar. 8085 Mİ’de bu amaçla iki komut kullanılır: Giriş Komutu: IN çevre cihazı adresi; Sayfa 46 / 51 Çıkış komutu: OUT çevre cihazı adresi; Burada “Çevre cihazı adresi” 00 ile FF arasında bir bayttır ve çevre cihazına atanmış olan adresi göstermektedir. Birinci komut (IN komutu) ikinci bayt olarak gösterilen adresi temsil eden çevre cihazının çıkışındaki bir bayt veriyi alarak Akü’ye kopyalar. İkinci komut (OUT komutu) bunun tersini yapar, yani Akü’nün içeriğini gösterilen adresi temsil eden çevre cihazına kopyalar. Görüldüğü gibi bu komutlar Mİ’de çevre birimleri ile veri alış verişi Akü’yü kullanarak yapmaktadır. Bu komutların uzunluğu 2 bayttır. Örnekler: IN 02H; (A)(0216) OUT 03H; (0316)(A) Burada birinci komut adresi 0216 olan çevre birimindeki bir bayt veriyi Akü’ye kopyalamakta, ikinci komut ise Akü’deki baytı adresi 0316 olan çevre birimine kopyalamaktadır. 6502 Mİ’de özel giriş çıkış komutları yoktur. Bunun yerine belleğin bazı adresleri sabit olarak bu işler için ayrılmıştır. Bu adresler ve LDA ile STA komutu kullanılarak giriş çıkış işlemleri yapılabilir. Mİ’den dışarıya bir bayt iletmek için: STA $0401 veya STA $0403 Dışarıdan Mİ’ye bir bayt iletmek için: LDA $0400 veya LDA $0402 komutları örnek olabilirler. Fakat burada Mİ’nin çevre birimleri ile direkt bağlanmadığı, bu bağlantının bir çevresel arayüz yardımı ile yapıldığı öngörülmektedir. Baktığımız örneklerde arayüz olarak 6520 arayüzü kullanıldığı varsayılmıştır. Diğer arayüzleri farklı adresler kullanabilirler. 6800 Mİ’de giriş çıkış işlemleri 6502 Mİ’ne benzer şekilde yapılmaktadır. 5.8. Kaydırma ve Döndürme Komutları Bu komutlar genelde Akü’de yerleşmiş olan baytı bir bit ya sağa, yada sola kaydırır. Herhangi bir sayının bir bit sola kaydırılması bu sayının 2 ile çarpılması, sağa bir bit kaydırılması ise 2’ye bölünmesini sağlamaktadır. Örneğin, 000001002=0416 sayısı bir bit sola kaydırıldıktan sonra 000010002=0816 olmaktadır. 8085 Mİ’de kaydırma komutları yoktur. Bunun yerine daha ileride göreceğimiz döndürme komutları kullanılır. Sayfa 47 / 51 6502 Mİ’de 2 tane kaydırma komutu vardır: ASL akü veya ASL adres LSR akü veya LSR adres Birinci komut Akü’nün içeriğini 1 bit sola, ikinci komut ise 1 bit sağa kaydırır. Sola kaydırma esnasında Akü’nün 7. biti Elde bayrağına kaydırılır, Elde bayrağının önceki durumu ise kayıp olur. Örneğin, Akü’nün önceki durumu= 1000 0001 ve (CF)= 0 olsun. Akü’nün ASL komutu yürütüldükten sonraki durumu= 0000 0010 ve (CF)=1 olacaktır. Aynı veriler için LSR komutu yürütülürse son durum=0100 0000 ve (CF)=1 şeklinde olacaktır. 6800 Mİ’de her Akü için kaydırma komutları ve ayrıca bellekteki bir veriyi kaydıran komutlar mevcuttur. Bundan başka burada sağa ve sola aritmetik ve mantıksal olmakla 4 çift komut kullanılır: ASLA ASLB ASRA ASRB LSRA LSRB Dikkat: Sağa aritmetik kaydırma (ASRA ve ASRB) komutları yürütülürken verinin 7. biti 6. bite kaydırılırken kendi değerini koruyor. Örnek: ASRA komutu için: (Akü A)=10011001; (CF)=0 (kaydırmadan önce) (Akü A)=11001100; (CF)=1 (kaydırmadan sonra) 6800 Mİ’de bellekteki veriyi kaydıran komutlar: ASL adres LSR adres şeklindedirler. Kaydırma komutları verinin bitlerini kayıp olmasına neden olur. Bu bitleri kaybetmemek için döndürme komutları kullanılır. 8085’te 4 tane kaydırma komutu vardır. Verilerin Akü’de yerleşmiş olduğu ve 1 bit döndürüldüğü varsayılır. Bu komutlarda ya 8 bit ((CF)’siz), yada 9 bit ((CF) ile) döndürülür: RLC; Akü’yü 1 bit sola döndürür (8 bit) RRC; Akü’yü 1 bit sağa döndürür (8 bit) Sayfa 48 / 51 RAL; Akü’yü 1 bit sola döndürür (9 bit) RAR; Akü’yü 1 bit sağa döndürür (9 bit) Örnek: CLC MVI A,10100011B RLC Bu program parçası çalıştıktan sonra (A)=110100012 ve (CF)=1 olacaktır. Aynı veriler için RLC yerine RAL komutu olsaydı bu program parçası çalıştıktan sonra (A)=010001102 ve (CF)=1 olacaktır. Ödev 5.27: X/2+8*Z işlemini yapan programı yazın. X’in belleğin 1024, Z’in 1025 adresli hanelerinde olduğunu varsayalım. Sonucu 1025 adresine gönderilmesi gerekir (Çarpma ve bölme işlemleri için kaydırma komutları kullanılacaktır). 6502 Mİ’de iki tane döndürme komutu var: ROL ;Sola döndür RAR ;Sağa döndür. Her iki komut Elde bayrağını da içeren 9 bit döndürme yapmaktadır. Komutlar hemen, mutlak ve sıfır sayfa adresleme kullanabilmektedirler. Ödev 5.28: Ödev 5.27’yi 6502 için yapın. 6800 Mİ’de her iki aküyü ve bellekteki veriyi sağa ve sola döndüren komutlar bunlardır: RORA; A’yı sağa döndür RORB; B’yi sağa döndür ROR ; Bellekteki veriyi sağa döndür ROLA ; A’yı sola döndür ROLB ; B’yı sola döndür ROL ; Bellekteki veriyi sola döndür Bu komutların çalışması 6502’nin uygun komutlarına benzemektedir. Döndürme Elde bayrağını da içerir. Ödev 5.29: Ödev 5.27’yi 6800 için yapın. 5.9. Diğer Komutlar Bayrakları Etkileyen Komutlar: Bu komutlar bayrakları “1” veya “0” durumuna getirerek onları gerektiğinde uygun şekilde kullanmaya yararlar. 8085’de bu komutlar: Sayfa 49 / 51 STC ; Elde bayrağını “1” yap CLC ; Elde bayrağını “0” yap CMC ; Elde bayrağının tümleyenini al. 6502 ve 6800’da de bu komutlar: SEC ; Elde bayrağını “1” yap CLC ; Elde bayrağını “0” yap SED ; Onlu bayrağı “1” yap CLD ; Onlu bayrağı “0” yap SEI ; Kesme bayrağını “1” yap CLI ; Kesme bayrağını “0” yap ve diğerleridir. Yığınla İşlem Komutları. Her bir Mİ’de yığınla (stack) işlem komutları vardır. 8085’de bu komutlar: PUSH rp ; (rp)’yi yığın kaydedicisinin içeriğindeki bellek adresine it POP rp ; Yığın kaydedicisi içeriğindeki adresten 2 baytı (rp)’ye çek. 6502’de bu komutlar: PHA ; Aküyü Yığın Göstergesindeki bellek adresine yükler PLA ; Yığın Göstergesindeki adresten veriyi Aküye yükler. Ayrıca bayrakları da yığına yükleyen ve oradan geri çeken komutlar (PHP ve PLP) mevcuttur. 6800’da bu komutlar uygun olarak: PSHA PSHB PULA PULB şeklindedirler. Yani A ve B akülerinin içeriklerini yığına yüklerler ve oradan geriye çekerler. Kesme Komutları. Mİ’lerde kullanılan komut türlerinden biri de Kesme Komutlarıdır. Bu komutlar dışarıdan gelen kesmeleri etkisiz kılar veya bu etkisizliği kaldırır. 8085’de bu komutlar: DI ; Kesmeyi etkisiz kıl Sayfa 50 / 51 SI ; Kesmeyi etkili kıl şeklindedirler. 6502’de bu işlemler uygun olarak Kesme bayrağını “1” yapmakla (Kesmeyi etkisiz kıl) ve “0” yapmakla (Kesmeyi etkilendir) şeklinde kesme bayrağını etkilemekle elde edilir: SEI ; (IF)1 CLI ; (IF)0 6800 ‘de de aynı komutlar aynı anlamda kullanılırlar. Alt Programla Çalışma Komutları. Herhangi bir programlama dilinde alt programlar daima kullanılmaktadırlar. Bundan dolayı Mİ’lerin komutları listesinde bu işlemleri yapabilen komutlar mutlaka vardır. 8085’de bu komut: CALL adr. şeklinde, 6502 ve 6800 Mİ’lerinde JSR veri şeklindedir. Bununla birlikte alt programda ana programa dönebilmek için Dönüş komutu olan RET (8085’te) ve RTS (6502 ve 6800’da) komutları kullanılmalıdır. Burada bakılan Mİ’lerin bütün komutlarına göz atılmamaktadır. Biz yalnız temel komutları ele aldık. Eğer öğrenci bu komutların nasıl çalıştığını benimserse yerde kalan diğer komutları kolaylıkla anlayacak ve kullanabilecektir. Sayfa 51 / 51