BÖLÜM 4 BELLEK ADRESLEME VE EMÝR TÜRLERÝ CPU emirlerinin belirttiði iþlemler, bellekte veya CPU kaydedicilerinde saklanan veriler üzerinde icra edilir. Bellekte oturan veriler kendi adresleriyle gösterilir. CPU kaydedicilerinde oturan veriler ise kaydedici adresiyle belirtilir. Kaydedici adresi, CPU içindeki 2n kaydediciden birini gösteren n-bitlik ikili koddur. Bu yüzden mikroiþlemcisinde 16 kaydedici bulunan bir bilgisayarda, emir kodlarý 4-bitlik kaydedici adres alanýna sahip olmalýdýr. Bilgisayarlar, deðiþik sayýda adres içeren birkaç farklý uzunluklu emirlere sahip olabilir. Emirdeki adres alanlarýn sayýsý CPU içindeki kaydedicilerin iç organizasyonuna baðlýdýr. Ticari bilgisayarlarda iki adresli emirler oldukça yaygýndýr. Her adres alaný ya bir CPU kaydedicisini veya bir bellek adresini gösterir. Örnek olarak bir yerden baþka bir yere veri transferi yapan LOAD (LD) emrini inceleyelim. LD R1, ADDR emiri ADDR adres alanýnda saklanan veriyi R1 kaydedicisine taþýr, yani R1←M [ADDR] iþlemini yapar. Burada M[ADDR] sembolü ADDR adresindeki kelimeyi gösterir. 4.1. ADRESLEME MODLARI Emir kodu, gerçekleþtirilecek iþlemi gösterir. Bu iþlem CPU kaydedicilerinde veya bellekte saklanan bir veri üzerinde gerçekleþtirilir. Program icrasý esnasýnda verilerin seçilmesi yolu, emirin adresleme moduna baðlýdýr. Veri referanslanmadan önce, emir adres alanýnýn yorumlanmasý veya deðiþtirilmesi kuralý adresleme modunu belirtir. Bilgisayarlar, aþaðýdaki koþullardan birini veya her ikisini kapsamak amacýyla adresleme tekniklerini kullanýr. 1. Bellek göstericileri (pointers), döngü denetleme sayýcýlarý, veri indeksleme, ve programý yeniden yükleme (relocation) gibi kolaylýklar saðlayarak kullanýcýya programlama esnekliði vermek 2. Emirin adresleme alanýndaki bitlerin sayýsýný azaltmak. Adresleme modlarý, emirlerin sayýsý ve icra süresi bakýmýndan programlarý daha verimli yazabilmek için programcýya esneklik kazandýrýr. Bazý bilgisayarlarda emirin adresleme modu açýk ikili kod kullanýlarak belirtilir. Bazýlarýnda ise emirin hem iþlem hem de adresleme modunu gösteren ortak ikili kod kullanýlýr. Emirler çeþitli adresleme modlarýna sahip olacak þekilde tanýmlanabilir, ve bazen iki veya daha fazla adresleme modu bir emirde biraraya getirilebilir. Emir kodu çözülerek, gerçekleþtirilecek iþlem türü ve emirin adresleme modu belirlenir. Açýk adresleme moduna sahip bir emirin biçimi Þekil 4.1’deki örnekte gösterilmiþtir. Ýþlem kodu gerçekleþtirilecek iþlemi belirtir. Mod alaný ise iþlem için gerekli verilerin nasýl adresleneceðini gösterir. Emirde adres alaný bulunabilir veya bulunmayabilir. Eðer adres alaný varsa, bu alan bir bellek adresini veya CPU kaydedicileri için bir kodu gösterebilir. Ayrýca bir emirde birden çok adres alaný bulunabilir. Bu durumda her adres alaný kendine özgü adresleme moduna iliþkin olur. Ýþlem kodu Mod Adres Þekil 4.1. Mod alanýna sahip emirin biçimi. 4.1.1 Ýmalý Bellek Adresleme Ýmalý bellek adresleme tekniðini kullanan bir emir veri sayýcýnýn içeriðini bellek adresi olarak yorumlar. Bu mod, adres alaný gerektirmez. Veri yeri, iþlem kodunun tanýmýnda kapalý olarak belirtilir. Belleði adreslemek için veri sayýcýyý kullanmak iki adýmlýk iþlemdir: 1. Gerekli bellek adresi veri sayýcýya yüklenir. 2. Veri sayýcýnýn içeriðini bellek adresi olarak yorumlayan bir baytlýk bir bellek referanslama emiri icra edilir. CPU yapýsýný incelerken verilen toplama örneðindeki ilk iki adýmý tekrar inceleyelim. Birinci emir mnemonik biçimi ( LD DC, ADDR) olan ve (A3 0A 20) makina koduna karþý düþen veri sayýcýyý yükleme emiridir. Ýkinci emir ise mnemonik biçimi (LD A, [DC] ) ve makina kodu (38) olan imalý adresleme yaparak akümülatörü bellekten yükleyen bir yükleme emiridir, Þekil 4.2. Burada bellek referanslama emiri bellek adresini belirlemez. Bu emir daha ziyade veri sayýcý tarafýndan adresi ima edilen bellek adresinin referanslanacaðýný gösterir. Bir adres defalarca kulanýlacaksa veya küçük deðiþikliklerle defalarca kullanýlacaksa bu adresleme modu çok elveriþlidir. Veri sayýcýdaki adres, yeniden yükleme yapýlmadýðý sürece orada sabit kalýr. 0100 0101 0102 0103 0104 0A1 F 0A20 0A21 A3 0A 20 38 LD DC, ADDR 0A20 3B Veri sayýcý Akümülatör LD A,[DC] 3B Þekil 4.2. Ýmalý adresleme ile verinin akümülatöre taþýnmasý. 4.1.2 Yakýn Bellek Adresleme Yakýn adreslemede veri, emir ile beraberdir. Diðer bir deyiþle yakýn modlu emir, adres alanýndan ziyade veri alanýna sahiptir. Veri alaný, emirde belirtilen iþlemde kullanýlacak gerçek veriyi içerir. Bu adresleme moduna sahip emirler, kaydedicileri sabit deðerlerle yüklemek için çok yararlýdýr. Yakýn mod bir bakýma imalý adreslemedeki iþlemlerin birincisine karþý düþer. Þekil 4.2’deki ilk emir, veri sayýcýyý emir kodundan sonra gelen yakýn deðer (0A 20) ile yüklediðinden bir yakýn adresleme yapýlmýþ olur. 4.1.3 Doðrudan Bellek Adresleme Bu modda emirin adres alaný bellekteki verinin adresini gösterir. Ýmalý adreslemede kullanýlan (LD DC, ADDR) ve (LD A, [DC] ) emirleri doðrudan bellek referans emiri oluþturacak biçimde Þekil 4.3’deki gibi birleþtirilebilir. Adres kaydedici veri sayýcý ile ayný görevi gerçekler, ama bu kaydedici çok kýsa süreli çalýþýr. Doðrudan bellek referans emiri, hesaplanýp adres kaydediciye yüklenen bir bellek adresi ile baþlar. Bu adres, eriþilecek bellek alanýnýn adresi haline gelir. 0202 0203 0204 0205 61 0B 20 0B20 3B LD A, [ADDR] 0B20 3B Adres kaydedici Akümülatör Þekil 4.3. Doðrudan adresleme ile verinin akümülatöre taþýnmasý. 4.1.4 Göreceli Bellek Adresleme Bazý adresleme modlarý etkin adresi hesaplamak için CPU içindeki belirli bir kaydedici içeriðine emir adres alanýnýn eklenmesini gerektirir. Göreceli adresleme modunda etkin adres aþaðýdaki biçimde hesaplanýr: Etkin adres = Emirin adres kýsmý (öteleme) + PC içeriði Emirin adres kýsmý, pozitif veya negatif olabilen iþaretli bir sayýdýr. Bu sayý PC içeriðine eklendiði zaman, elde edilen sonuç programdaki bir sonraki emirin adresine göre etkin adresin bellekteki konumunu verir. Programa göre adresleme, her iki yönde olmak üzere bir sayfanýn yarýsý kadar, emirlerin bellek adreslemesine izin verir. Bu adresleme modu çoðunlukla dallanma emirlerinde kullanýlýr. Adres alaný iþaretli çok büyük öteleme bilgisi oluþturamadýðýndan dolayý, dallanma emirin yakýn civarýna olmalýdýr. Bu sakýncasýna raðmen, küçük adres vererek program sayýcýya göre program bellekte sýnýrlý dallanma imkaný saðladýðýndan çok kullanýþlý bir adresleme türüdür. Durumu daha iyi açýklamak için, 24AE bellek alanýnda göreceli adresleme yapan ve öteleme bilgisi 7A olan bir emirin olduðu örneði inceleyelim. O zaman etkin adres aþaðýdaki þekilde hesaplanýr 0010010010101110 0000000001111010 24 AE 7A 0010010100101000 Ýþaret biti uzantýsý 25 28 Belleðin ilerisini adreslemeye iliþkin bu örnek assembli dili emirler kullanýlarak aþaðýdaki þekilde gösterilebilir: Bellek adresi 24AD ----2528 Amaç (object) kodu BC 7A ----- Kaynak program emiri JMP HERE HERE LD A, THERE Yukarýdaki gösterimde BC sembolü JMP emirin kodunu gösterir. (LD A, THERE emirinin iþlem kodu bu incelemede önemli olmadýðý için verilmemiþtir.) JMP emiri CPU’ya alýndýktan sonraki PC içeriðini assembler HERE etiketine iliþkin deðerden çýkararak JMP emirinin öteleme bilgisini hesaplar. HERE etiketinin eþdeðeri = 2528 JMP emiri alýndýktan sonra PC içeriði = 24AF Fark = 0079 Assembler 7F’den büyük deðer bulursa, JMP emiri yasal deðildir, ve assembler tarafýndan programcýya bir mesaj gönderilir. JMP ve LD emirleri kendi aralarýnda yer deðiþtirseydi geriye dallanma yapýlacaktý. Assemblerin yaptýðý iþ deðiþmeyecekti ve HERE etiketine ait deðerden PC içeriði çýkarýlarak öteleme hesaplanacaktý. HERE etiketinin eþdeðeri = 24 AD Emir yüklendikten sonra PC içeriði = 25 2A Fark = -7D 4.1.5 Otomatik Artýrma ve Azaltma Yaparak Ýmalý Bellek Adresleme Veri dizisini belleðin bir bölgesinden baþka bir bölgesine taþýmak için iki veri sayýcýdan yararlanýlýr. Bu sayýcýlarda saklanan adresler her bellek eriþiminden sonra artýrýlýr. Veri dizisinin diðer ucundan baþlayan bir program lojiði tasarlamak mümkündür, o zaman bellek adresi her bellek eriþiminden sonra bir azaltýlmalýdýr. Her iki durumda da bellek referanslama iþlemini yapan ve bellek adresini bir artýran veya azaltan tek baytlýk emir yapýlabilir, Þekil 4.4. Veri sayýcýlardan birine okumanýn yapýlacaðý bellek adresi, diðerine de okunan verinin yazýlacaðý bellek adresi saklanýr ve her iki sayýcý ya artýrýlýr veya azaltýlýr. Böylece bir veri dizisi bir yerden baþka bir yere taþýnmýþ olur. (4) Akümülatörü DC1 üzerinden yükle (5) Akümülatörü DC2 üzerinden sakla (4) (6) Akümülatörü DC1 üzerinden yükle ve DC1 sayýcýsýný 1 artýr (5) (7) Akümülatörü DC2 üzerinden sakla ve DC2 sayýcýsýný bir artýr. (6) DC1 sayýcýsýný bir artýr (7) DC2 sayýcýsýný bir artýr Þekil 4.4. Bellek referanslayan ve veri sayýcý içeriðini bir artýran emirler kullanarak veri dizilerin bellekte taþýnmasý. 4.1.6 Yýðýn Bellek Adresleme Çoðu bilgisayarda bulunan çok yararlý bir özellik yýðýn bellektir. Bu yýðýn songiren ilk- çýkar (last-in fýrst-out, LIFO) bellek olarak da bilinir. Yýðýn, son saklanan bilginin ilk olarak alýndýðý bir saklama cihazýdýr. Yýðýn çoðu uygulama için yararlý olan ve veri iþleme görevini kolaylaþtýracak özellikler taþýyan bir yapýya sahiptir. Aritmetik iþlemleri kolaylaþtýrmak için elektronik hesap makinalarýnda ve bilgisayarlarda verimli bir þekilde kullanýlmaktadýr. Yýðýn bellek, her bellek eriþiminden sonra artýrýlan veya azaltýlan bir adres yardýmýyla kendisine eriþilen bir bellek parçasýdýr. Yýðýnýn adresini tutan kaydediciye yýðýn gösterici (SP) denir, çünkü onun içeriði daima yýðýnýn tepesindekini gösterir. Yýðýnýn tepesine yazmak ve yýðýnýn tepesinden okumak yýðýn üzerinde yapýlan iki yýðýn iþlemidir. Yýðýna yazma itme (push) ve yýðýndan okuma çekme (pop) olarak adlandýrýlýr. Ama fiziksel olarak itilen veya çekilen birþey yoktur. Bu iþlemler yýðýn gösterici artýrýlarak veya azaltýlarak benzetimlenir (simulate). Yýðýn gösterici yýðýnýn baþlangýç deðeriyle yüklenir. Baþlangýç deðeri yýðýnýn bellekteki taban (bottom) adresi olmalýdýr. Daha sonra her itme veya çekme iþlemi yapýldýðý zaman SP otomatik olarak artýrýlýr veya azaltýlýr. Bellek yýðýnýn üstünlüðü adres belirtmeden mikroiþlemcinin kendisine eriþebilmesidir, çünkü adres SP’de daima vardýr ve otomatik olarak güncelleþtirilir. Ýtme iþlemi yýðýn gösterici tarafýndan adreslenen bellek alanýna CPU kaydedicilerinden birinin içeriðini yazar. Önce yýðýnýn yeni tepesini adreslemek için yýðýn göstericinin (SP) içeriði otomatik olarak bir azaltýlýr, ve daha sonra belirtilen kaydedicinin içeriði yýðýnýn tepesine yazýlýr, Þekil 4.5. Yýðýn bellek A SP 8F F023 ? ? 65 08 F021 F022 F023 F024 (a) Ýtme iþleminden önce Yýðýn bellek A SP 8F F022 ? 8F 65 08 A:Akümülatör SP:Yýðýn Gösterici F021 F022 F023 F024 (b) Ýtme iþleminden sonra Þekil 4.5. Ýtme iþleminin yapýlýþý. Çekme iþlemi itmenin tam tersidir. Yýðýn göstericinin içeriði ile adreslenen yerden bilgi alýnarak akümülatöre veya CPU’nun diðer kaydedicilerine taþýnýr ve yýðýnýn yeni tepesini göstermek amacýyla yýðýn gösterici içeriði otomatik olarak artýrýlýr, Þekil 4.6. A SP ? F022 F021 8F F022 65 F023 08 F024 (a) Çekme iþleminden önce A SP 8F F023 F021 8F F022 65 F023 08 F024 (b) Çekme iþleminden sonra Þekil 4.6. Çekme iþleminin yapýlýþý. Veri sayýcý kullanýlarak yapýlan imalý bellek adresleme ile yýðýn gösterici kullanýlarak yapýlan bellek adresleme arasýndaki paralelllik açýktýr. Aralarýndaki tek fark, yýðýn bellek içeriðinin her yazmadan sonra azaltýlmasý ve her okumadan sonra artýrýlmasýdýr. Yýðýn gösterici içeriðinin ne kadar artýrýlacaðý veya azaltýlacaðý çekilen veya itilen kaydedicinin büyüklüðüne baðlýdýr. Örneðin veri kaydedici içeriði yýðýna itileceði zaman, yýðýn gösterici içeriði iki azaltýlýr, ve böylece yýðýn derinliði iki bayt büyür. Yýðýnýn nasýl kullanýldýðýný açýklayabilmek için altprogramlý bir çalýþmayý inceleyelim. Çoðu programlar sýk sýk tekrarlanan emir dizilerinden oluþmuþtur. Bu dizilerin herbiri program belleðin bir yerine yalnýz bir kere yazýlýr ve her istendiðinde oradan çaðrýlýp icra edilirse, böyle dizilere altprogram denir. Çok baytlý sayýlar üzerinde dört iþlem yapabilen emirler bazý CPU’larda yoktur. Bu tür iþlemler birden çok emir kullanýlarak altprogramlar sayesinde gerçekleþtirilir. Toplama, çýkarma, çarpma, ve bölme altprogramlarý bellekte ayrý ayrý bölgelerde oturur ve gerektiðinde ana program içinden CALL emiri ile çaðrýlarak koþturulur. Bu çaðýrma biçimi Þeki 4.7’deki gibi gösterilebilir. Ana programýn kullandýðý program bellek Alt programýn kullandýðý program bellek Þekil 4.7. Ana program tarafýndan altprogramýn çaðrýlmasý. Altprogramlý çalýþma kullanýlmasaydý, ana program içinde ihtiyaç duyulan her noktada altprogramýn tekrarlanmasý zorunlu olacaðýndan program bellek büyüyecekti. Altprogram çaðrýldýðý zaman, PC içeriði yýðýn belleðe itilir ve altprogramýn baþlangýç adresi PC’ye yerleþtirilir. Ayrýca PC içeriði iki bayt olduðundan, yýðýnýn yeni tepesini göstermek üzere yýðýn gösterici 2 azaltýlýr. Altprogramdan geri dönebilmek için altprogramýn sonuna bir RET geridön emri konulmalýdýr. Bu emir PC’nin eski içeriðini yýðýndan CPU’ya taþýr ve yýðýn göstericiyi 2 artýrýr. Altprogramlarý koþullu çaðýrmak ve altprogramlardan koþullu geri dönmek için CPU’larýn özel emirleri mevcuttur. Yuvalý (nested) altprogram, bir altprogramýn baþka bir altprogramýn tarafýndan çaðrýlmasý olarak tanýmlanýr. Bir altprogramýn diðeri tarafýndan çaðrýlmasýnda olaðan olmayan herhangi birþey yoktur. Gerçekte altprogramlar çok kere içiçe girebilir. Bazý matamatiksel iþlerde program yazmanýn en etkin yolu kendi kendini çaðýran altprogramlarýn olmasýdýr. Kendi kendini çaðýran altprograma yinelemeli (recursive) altprogram denir. Geri dönüþ adresleri yýðýnda saklandýðý sürece, altprogramlar yuvalanabilir ve kendi kendilerini çaðýrabilir. Geri dönüþ sýrasý, çaðrýlma sýrasýný tam tamýna izlemek koþulu ile, doðru geri dönüþ adresi daima yýðýnýn tepesinde bulunacaktýr. Yýðýn bellek kesmeli G/Ç iþleminde de kullanýlýr. Bu çalýþmanýn nasýl yapýldýðý ilerideki bölümlerde anlatýlacaðýndan burada bu konuya deðinilmeyecektir. 4.1.7 Dolaylý Bellek Adresleme Dolaylý adres, gerekli etkin adresin tutulduðu yerin adresidir. CPU program bellekten emiri aldýktan sonra, etkin adresi okumak için alýnan emirin adres kýsmýný kullanarak tekrar belleðe eriþir, Þekil 4.8. Etkin adres eriþilecek yerin adresidir. Bellek XX YY XXYY XXYY + 1 AA BB AABB 3E Dolaylý adresleyen emirin kodu Dolaylý adres Þekil 4.8. Dolaylý adresleyen emirin çalýþmasý. LD A, [[ Adres]] emirini inceleyelim. Çift parantez içeriðin içeriði anlamýndadýr. Bu emir icra edildiði zaman akümülatörde 3E deðeri oluþur. Dolaylý adreslemede etkin adres EA = [XXYY] baðýntýsýyla verilir. Dolaylý adresleme sýnýrlý alaný adresleyen emirlere sahip sayfalý bilgisayarlarda çok yararlý olabilir. Çünkü emirin bulunduðu sayfanýn dýþýndaki bellek bölgesine, programýn eriþmesini saðlayan en etkin yoldur. Sayfalý bilgisayarlarda dolaylý adresli bir emir, sayfa içinde etkin adresin tutulduðu yerin adresini taþýr, Þekil 4.9. Bellek PPQQ PPQQ + 1 PPYY YY Dolaylý adresleyen emir kodu Emirin saðladýðý sayfa adresi AA BB AABB Adreslenen bellek alaný Þekil 4.9. Sayfalý bilgisayarlarda dolaylý bellek adresleme. 4.1.8 Ýndeksli Bellek Adresleme Ýndeksli adres, doðrudan ve imalý adresin toplamýdýr. Ýndeksli adresleme modunda indeks kaydedicinin içeriði etkin adresi elde etmek için emirin adres kýsmýna eklenir, Þekil 4.10. Ýndeks kaydedici, indeks deðerini içeren CPU’nun özel bir kaydedicisidir. Emirin adres alaný bellekteki veri dizisinin baþlangýç adresini tanýmlar. Dizideki her bir eleman bu baþlangýç adresine göre bellekte saklanýr. Baþlangýç adresi ile elemanýn adresi arasýndaki uzaklýk, kaydedicide saklanan indeks deðerini oluþturur. Ýndeks kaydedici doðru indeks deðerini içermek koþuluyla, dizinin herhangi bir elemanýna ayný emirle eriþilebilir. Peþpeþe sýralanmýþ dizi elemanlarýna eriþimi kolaylaþtýrmak için indeks kaydedici artýrýlabilir. Zaten indeks adý, bu kaydedici içeriðinin deðiþme olasýlýðýnýn fazla olmasýndan gelmektedir. Ýndeks kaydedici XXYY Bellek AA Ýndeksli adresleyen emir kodu Öteleme baytý 8E Adreslenen bellek alaný + XXYY + AA Þekil 4.10. Ýndeksli bellek adresleme. 4.2 EMÝR TÜRLERÝ Bilgisayarlar çeþitli hasaplama iþlerini yürütmek için kullanýcýya esneklik saðlayan büyük bir emir takýmý içerir. Bilgisayarlarýn emir takýmý bilgisayardan bilgisayara deðiþir. Bu farklýlýk daha çok adres ve mod alanlarýndan yararlanarak operandlarýn belirlenmesi yönteminde olur. Emir takýmlarýn yaptýðý gerçek iþlemler bir bilgisayardan diðerine çok fark etmez. Emirler ayný görevi yapsalar dahi, iþlem kodlarý genellikle farklý bilgisayarlarda farklý yapýdadýr. Ayrýca emirlere verilen sembolik adlar da farklý olur. Buna raðmen çoðu bilgisayarlarda emirlerin dayandýrýldýðý temel iþlemler vardýr. Bilgisayar emirleri üç sýnýfa ayrýlabilir: 1. Veri transfer emirleri 2. Veri iþlem (manipulation) emirleri 3. Program denetleme emirleri Veri transfer emirleri, veriyi deðiþtirmeden bir yerden baþka bir yere taþýr. Veri iþlem emirleri veriler üzerinde aritmetik, lojik, ve kaydýrma iþlemleri gerçekler. Program denetleme emirleri ise karar verme olanaðý saðlar ve programýn icra yönünü deðiþtirir. Bu emir türlerine ilaveten bazý bilgisayarlar özel uygulamalar için bazý özel emirlere sahip olabilir. 4.2.1 Veri Transfer Emirleri Veri transfer emirleri veriyi dðiþtirmeden bir yerden baþka bir yere taþýmaya yarar. Çoðu transferler belek ile CPU kaydedicileri arasýnda, CPU kaydedicilerin kendi arasýnda, veya CPU kaydedicileri ile giriþ ve çýkýþ arasýnda olur. Bilgisayarlarda kullanýlan sekiz veri transfer emirinin listesi Tablo 4.1’de verilmiþtir. Her emire iliþkin mnemonik sembol bu tabloda gösterilmiþtir. Farklý bilgisayarlar ayný tür emir için farklý mnemonik kullanabilir. Yükleme emiri bellekten veriyi alýp CPU kaydedicilerine yükler. Saklama emiri yükle emirinin tersini yapar ve CPU kaydedicilerinden veri alýp bellek adresine depolar. Taþý emiri ise çok kaydedicili mikroiþlemcilerde bir kaydediciden diðerine veri taþýmak için kullanýlýr. Ama taþý emiri ayný zamanda CPU kaydedicileri ile bellek arasýnda, veya farklý bellek alanlarý arasýnda veri transferi yapmak için de kullanýlabilir. Takas emiri iki kaydedici veya bir kaydedici ile bellek adresi arasýnda bilgi deðiþ-tokuþu yapar. Ýtme ve çekme emirleri yýðýn bellek ile CPU kaydedicileri arasýnda veri transferi yapar. Giriþ ve çýkýþ emirleri ise CPU kaydedicileri ile giriþ ve çýkýþ arayüz cihazlarý arasýnda veri transferi yapar. Tablo 4.1. Veri transfer emirleri. Adý Yükleme(Load) Saklama (Store) Taþýma (Move) Takas (exchange) Ýtme (Push) Çekme (Pop) Giriþ (Ýnput) Çýkýþ (Output) Mnemonik LD ST MOVE XCH PUSH POP IN OUT Giriþ/Çýkýþ (G/Ç) emirleri yükle ve sakla emirlerine benzerdir; aralarýndaki fark bellek adresleri yerine dýþ kaydedicilerden transferin yapýlmasýdýr. Bilgisayarlar dýþ dünya ile haberleþmek için belirli sayýda kapýya (port) sahiptir. Bir dýþ cihaza bir veya daha çok kapý ayrýlabilir. Her kapý bir dýþ kaydediciye eþdeðerdir. Bellek alaný seçmede olduðu gibi, her kapý kendine özgü bir adresle seçilir. G/Ç emirleri, veri transferi için seçilen kapýyý belirlemek amacýyla emir yapýsýnda bir adres alaný içerir. Bellek alanlarýný ve G/Ç kapýlarýný seçmek için iki ayrý adres tahsis biçimi vardýr. Birincisi baðýmsýz G/Ç sistemini kullanýr, ikincisi ise bellek-izdüþümlü yapýdan yararlanýr. Baðýmsýz G/Ç sisteminde, belleðe ve G/Ç kapýlarýna tahsis edilen adresler birbirinden baðýmsýzdýr. Böyle bilgisayarlar ayrý G/Ç emirlerine sahiptir. Bellek adres alaný, kapý adresleri tahsisinden etkilenmez. Ýkinci alternatifte bellek adresleri G/Ç kapýlarýna tahsis edilir. Bu yapý bellekizdüþümlü G/Ç olarak bilinir. G/Ç transferleri yürütmek için ayrý adresler yoktur, çünkü G/Ç kapýlarý bellek alanlarý olarak düþünülür. Her G/Ç kapýsý ayrý bir bellek alaný olarak yorumlanýr. Bellek-izdüþüm yöntemini benimseyen bilgisayarlarda özel G/Ç emirleri yoktur. Bellek iþlemleri ve G/Ç veri iþlemleri için ayný emirler kullanýlýr. 4.2.2 Veri Ýþlem Emirleri Veri iþlem emirleri veriler üzerinde iþlemler gerçekleþtirir ve bilgisayara hesaplama yeteneði saðlar. Bu emirler üç sýnýfa bölünebilir. 1. Aritmetik emirler 2. Lojik ve bit iþlem emirleri 3. Kaydýrma emirleri 4.2.2.1 Aritmetik Emirler Dörtiþleme iliþkin toplama, çýkarma, çarpma, ve bölme aritmetik iþlem emirleri çoðu bilgisayarda vardýr. Buna raðmen bazý mikroiþlemciler yalnýz toplama ve çýkarma emirlerine sahiptir. O zaman çarpma ve bölme iþlemleri özel programlar vasýtasýyla gerçekleþtirilir.Bu dört temel iþlem, herhangi bir sayýsal problemin çözümünü formüle etmek için yeterlidir. Aritmetik emirlerin listesi Tablo 4.2’de verilmiþtir. Artýrma (increment) emiri bellekte veya kaydedicide saklanan deðere bir ekler. Azaltma (decrement) emiri ise bellekte veya kaydedicide saklanan deðerden bir çýkarýr. FFH deðerine sahip bir sayýyý bir artýrmak 00H, ve 00H deðerine sahip bir sayýyý bir azaltmak ise FFH sonucunu doðurur. Tablo 4.2. Aritmetik emirler. Adý Artýrma (increment) Azaltma (Decrement) Toplama (Add) Çýkarma (Subract) Çarpma (Multýply) Bölme (Divide) Elde ile topla Ödünç ile çýkarma Olumsuz (2’li tümleme) Mnemonik INC DEC ADD SUB MUL DIV ADDC SUBB NEG Toplama, çýkarma, çarpma, ve bölme emirleri dört tür veri için mevcut olabilir. Bu aritmetik iþelmlerin icrasý esnasýnda kaydedicide olduðu varsayýlan veri türü, iþlem kodunda kapsatýlmýþtýr.. Bir aritmetik emir iþaretli veya iþaretsiz tamsayýlarý, ikili veya onlu sayýlarý, veya kayan-noktalý verileri belirtebilir. 4.2.2.2 Lojik ve Bit Ýþlem Emirleri Lojik emirler kaydedici veya bellekte saklanan bit dizileri üzerinde ikili iþlemleri gerçekleþtirir. Bu emirler ikili kodlayan biligiyi gösteren bitleri veya bit gruplarýný iþlemek için çok yararlýdýr. Lojik emirler operandýn her bitini ayrý ayrý ele alýr ve Boole deðiþkeni olarak iþleme tabi tutar. Lojik emirler kullanýlarak kaydedici veya bellekte saklanan operandlardaki bit deðerlerini deðiþtirmek, bir bit grubunu silmek, veya yeni bit deðerlerini operanda sokmak mümkündür. Bazý lojik ve bit iþleme emirleri Tablo 4.3’te listelenmiþtir. Silme emiri belirli bir operandýn tüm bitlerini sýfýrlar. Birleme emiri ise tersine operandýn tüm bitlerini birler. Tümleme emiri operand bitlerinin tersini alýr. AND, OR, ve XOR emirleri operand bitleri üzerinde bu emirlere karþý düþen lojik iþlemleri gerçekler. Bu emirler Boole iþlemlerini gerçeklemelerine raðmen, bilgisayarda kullanýldýklarý zaman bit iþleme emirleri olarak kabul edilirler. Seçilen bitin sýfýrlanmasý; birlenmesi, veya tümlenmesi olmak üzere gerçekten üç bit iþleme emiri vardýr. Tablo 4.3. Lojik ve bit iþleme emirleri. Adý Silme (Clear) Birleme (Set) Tümleme (Complement) AND’leme OR’lama XOR’lama Elde sýfýrlama Elde birleme Elde tümleme Mnemonik CLR SET COM AND OR XOR CLRC SETC COMC 4.2.2.3 Kaydýrma Emirleri Operand içeriðini kaydýran emirler çok çeþitlidir. Kaydýrma, operand bitlerinin saða veya sola kaydýrýldýðý iþlemlerdir. Kelimenin sonundan içeriye kaydýrýlan bit, kullanýlan kaydýrmanýn türünü belirler. Kaydýrma emirleri lojik kaydýrmayý, aritmetik kaydýrmayý, veya döndürme türü iþlemleri ifade eder. Tablo 4.4’te dört cins kaydýrma emiri listelenmiþtir. Lojik kaydýrma, kaydýrma iþlemi sonunda son bit konumuna sýfýr sokar. Son bit konumu, saða kaydýrma için en soldaki bit ve sola kaydýrma için en saðdaki bit konumudur. Aritmetik kaydýrmalar, iþaretli sayýlarýn kaydýrýlmasý kuralarýna uyar. Aritmetik saða kaydýrma emiri en sol konumdaki iþaret bitinin konumunu korur. Ýþaret biti, geriye kalan bitlerle birlikte saða kaydýrýlýr, ama iþaret bitin kendisi deðiþmeden kalýr. Aritmetik sola kaydýrma emiri, en saðdaki son bit konumuna sýfýr koyar ve lojik sola kaydýrma emirine denktir. Bu yüzden lojik sola kaydýrma emirinin bulunduðu çoðu bilgisayarlarda aritmetik sola kaydýrma emiri yoktur. Tablo 4.4. Kaydýrma emirleri. Adý Lojik saða kaydýrma Lojik sola kaydýrma Aitmetik saða kaydýrma Aritmetik sola kaydýrma Saða döndürme Sola döndürme Elde üzerinden saða döndürme Elde üzerinden sola döndürme Mnemonik SHR SHL SHRA SHLA ROR ROL RORC ROLC Döndürme emirleri dairesel kaydýrma saðlar. Kelime sonundan dýþarý kaydýrýlan bitler, lojik kaydýrmada olduðu gibi, kaybolmaz, ama diðer sondan içeri alýnýrlar. Elde üzerinden döndür emirleri, elde bitini içeriði döndürülecek kaydedicinin uzantýsý olarak görür. Bu yüzden elde üzerinden sola döndür emiri, elde bitini kaydedicinin en saðdaki bit konumuna, en soldaki bitini ise eldeye transfer eder, ve tüm kaydediciyi bir bit sola kaydýrýr. 4.2.3 Program Denetleme Emirleri Program emirleri ardýþýl bellek alanlarýna yerleþtirilir. Denetleme birimi tarafýndan program iþlendiði zaman, emirler ardýþýl bellek alanlarýndan okunur ve birer birer icra edilir. Bellekten her emir alýnýþýnda PC içeriði bir sonraki emirin adresini içerecek þekilde artýrýlýr. Veri transfer veya veri iþlem emirlerinin icrasýndan sonra, denetim tekrar emir alma dönemine geçer ve PC kullanýlarak bir sonraki emir alýnýr. Bunun tersine, program denetleme emirleri PC’deki adres deðerini deðiþtirebilir ve program icrasý yönünün saptýrýlmasýna sebep olabilir. Program denetleme emirin icrasý sonucunda PC’de meydana gelen deðiþme emir icrasýnýn sýrasýnda deðiþikliðe yol açar. Bu özellik, farklý program dilimlerine dallanma yeteneði verir. Bazý program denetleme emirleri Tablo 4.5’te listelenmiþtir. Dallanma ve atlama emirleri ayný þeyi ifade edecek biçimde kullanýlýr, ama bazen farklý adresleme modlarýný göstermek için kullanýlabilirler. Dallanma emirleri genellikle bir adresli emirlerdir. Tablo 4.5. Program denetleme emirleri. Adý Dallanma Atlama Sýçrama (Bir sonraki emiri atla) Altprogramý çaðýrma Altprogramdan geridönme Karþýlaþtýrma (Çýkarma yaparak) Test etme (AND’leyerek) Mnemonik BR JMP SKP CALL RET CMP TEST Dallanma ve atlama emirleri koþullu veya koþulsuz olabilir. Koþulsuz dallanma emiri herhangi bir koþul olmadan belirtilen etkin adrese dallanmayý saðlar. Koþullu dallanma emiri ise pozitif veya negatif sonucun olmasý durumunda dallan gibi bir koþulu beraberinde taþýr. Ýstenilen koþul saðlanýrsa, PC etkin adres ile yüklenir ve bir sonraki emir bu adresten alýnýr. Koþul saðlanmaz ise, PC içeriði deðiþmez ve bir sonraki emir icra edilir. Sýçrama (skip) emiri adres alaný gerektirmez. Koþullu sýçrama emiri, koþul saðlanýnca bir sonraki emire atlar.Bu iþ, alma dönemindeki artýrmaya ilaveten icra döneminde de PC artýrýlarak baþarýlýr. Koþul saðlanmaz ise, icra bir sonraki emirle devam eder. Bir sonraki emir koþulsuz bir dallanma emiri ise, o zaman koþul saðlanmazsa dallan iþlemi gerçekleþtirilmiþ olur. Halbuki koþullu dallanma emiri koþul saðlanýnca atlama saðlýyordu. Karþýlaþtýr ve test et emirleri gerçekte program denetleme emirleri deðildir, çünkü programýn icra sýrasýný kendileri doðrudan doðruya deðiþtiremezler. Tablo 4.5’te bulunmalarýnýn nedeni, kendilerinden sonra gelen dallanma emirleri için bayrak oluþturmada kullanýlmalarýdýr. Karþýlaþtýrma emiri iki operandýn farkýný hasaplar, ama fark deðer saklanmaz. Ama durum bayraklarý iþlemin sonucuna göre güncelleþtirilir. Benzer þekilde, test etme emiri iki operandýn lojik olarak AND’lenmesini saðlar ve sonucu saklamadan veya operandlarý deðiþtirmeden sadece belirli bazý bayraklarý güncelleþtirir. Programýn icrasýný altprogramlara yönlendiren emirlere deðiþik adlar verilmektedir. En yaygýn olan adlar altprogramý çaðýr, altiþlemi çaðýr, altprograma atla, veya altprograma dallan adlarýdýr. Altprograma dallan emirin bir adres alaný vardýr. Altprogram çaðýrma emiri aþaðýdaki mikroiþlemlerle gerçeklenir: SP ← SP -1 Yýðýn göstericiyi azalt M[SP] ← PC Dönüþ adresini yýðýnda sakla PC ← Etkin adres Denetimi altprograma ver Her altprogram çaðýran programa geridönme emiriyle sonlanýr. Altprogramdan geridönme emiri, yýðýndan dönüþ adresini çekip PC’ye transfer ederek gerçekleþtirir. PC ← M [SP] Dönüþ adresini PC’ye taþý SP ← SP +1 Yýðýn göstericiyi artýr Programýn icrasýný normal sýrasýndan saptýrýp baþka noktalara yönlendiren bazý önemli olaylar vardýr. Bu olaylar kesmeli çalýþmayý oluþturur. Kesme, donaným veya yazýlýlmla gerçekleþtirilebilir. Donanýmlý kesmede icra sýrasýnýn deðiþtirilme anýný dýþ cihazlar belirler. Bu konu daha sonra anlatýlacaktýr. Bazý CPU’lar yazýlým kesme emirlerine (SWI) sahiptir. Ýcra sýrasýnýn hangi noktaya yönlendirileceðini bu emirin ima ettiði bellek alanýnda bulunan etkin bellek adresi gösterir. 4.3. BAZI ÖRNEK PROGRAMLAR Asseembli dili emirlerinin nasýl kullanýldýðýný göstermek amacýyla bazý örnek programlar yapýlacaktýr. Yukarda anlatýlan emir türlerine uyduðu halde, çoðu bilgisayarýn emirlerinin mnemonikleri birbirinden farklýdýr. Ayrýca ayný görevi gerçekleyen emirlerin bile etkiledikleri durum bayraklarý farklý olabilir. Bu yüzden tüm bilgisayarlarý kapsayacak ortak bir programlama dili mümkün deðildir. Buradaki örnek programlar 6802 CPU emir takýmýna dayanýlarak yazýlacaktýr. Örnek 4.1. BCD (Ýkili Kodlanmýþ Onlu)-Binary (ikili) sayý dönüþümü yapýlmak isteniyor. BCD sayý iki haneli (örneðin 0110 0010 = 62 gibi) olup E000H adresinde tutulmaktadýr. Dönüþüm kuralý aþaðýdaki gibidir. 1. Tamsayý bölmesi yaparak BCD sayý 2’ye bölünür. 2. Kaydýrma ile yapýlan 1. maddedeki bölme iþleminde, onlar hanesinden birler hanesine bir 1 geçiþi olmuþ ise, anlamsýz (birler) haneden 3 çýkararak düzeltme yapýlýr. 3. Kalan bir yerde saklanýp, elde edilen bölüm tekrar tamsayý bölmesi yapýlarak 2’ye bölünür. 4. Bu bölme iþlemi bölüm hanesinde tamsayý çýkmayýncaya kadar tekrarlanýr. 5. Kalanlar uygun sýrada dizilir. Çözüm. Bu örnekte BCD sayý 2 haneli iþaretsiz bir sayý olduðundan, deðeri en fazla 99 olabilir. Bu yüzden saf ikili karþýlýðý için 7-bitlik bir alan yeterlidir. E001H adres alaný saf ikili sayýnýn, diðer bir deyiþle kalanlarýn tutulduðu yerdir. Programda kullanýlan # iþareti yakýn (immediate) veriyi ve $ iþareti ise saðýndaki sayýnýn onaltýlý tabanda yazýldýðýný göstermektedir. Program Þekil 4.11’de verilmiþtir. BAÞ DÜZ DUR LDA B # $ 08 LDA A$ E000 LSR A ROR $ E001 BIT A # $ 08 BEQ DÜZ SUB A # $ 03 DEC B BNE BAÞ JMP DUR BCD sayýdaki bit uzunluðunu belirle BCD sayýyý A’ya taþý ve 2’ye böl Kalaný sakla Birler hanesinin en anlamlý biti 1 midir ? Düzeltme yap Bütün bitler için iþlem tekrarlandý mý ? Bekle Þekil 4.11. Ýkili Kodlanmýþ Onlu-ikili dönüþümü. Örnek 4.2. 6802 CPU çarpma emirlerine sahip deðildir. Bu cins CPU’larda çarpma iþlemi altprogram olarak kullanýlan özel bir yazýlým ile saðlanýr. Bu örnekte 16-bitlik iþaretsiz saf ikili sayýlarý çarpabilen bir program yazýlacaktýr. Çarpýlan 0104-0105H adreslerinde, çarpan ise 0106-0107H adreslerinde tutulmaktadýr. Çarpým 32-bit olup 0100H, 0101H, 0102H, ve 0103H adreslerinde tutulacaktýr. Çözüm. Çarpma iþleminin gerçeklenmesinde kullanýlacak algoritmanýn çalýþmasý aþaðýda verilmiþtir. 1. Çarpan bitini test et. Eðer bit 1 ise, çarpýlaný kýsmi çarpýma ekle. Sýfýr ise, çarpýlaný kýsmi çarpýma ekleme. 2. Kýsmi çarpýmý bir bit saða kaydýr. 3. 1. ve 2. adýmdaki iþlemleri tüm çarpan bitleri için tekrarla. Kýsmi çarpýmlardaki anlamsýz bitler yalnýz bir kere toplama iþlemine girdiðinden, çarpýlan kýsmý çarpýma eklenirken 16-bitlik toplama yapmak yeterli olmaktadýr. Kýsmi çarpýmýn her kaydýrýlýþý, en anlamsýz bitten baþlayarak, çarpýmýn yeni bir bitini verir. 16 defa kaydýrma yapýldýðýndan, çarpým kaydedicinin anlamsýz yarýsýndaki çarpmaya baþlamadan önceki deðer tamamen atýlmýþ olur. Bu yüzden çarpým kaydedicinin anlamlý yarýsý programýn baþlangýcýnda sýfýrlandýðý halde anlamsýz yarýsý temizlenmemiþtir. Program Þekil 4.12’de verilmiþtir. KAY1 LDA CLR CLR ROR ROR B # $ 10 $ 0102 $ 0103 $ 0107 $ 0106 BCC $ KAY2 CLC LDA A $ 0102 ADC A $ 0104 STA A $ 0102 LDA A $ 0103 ADC A $ 0105 STA A $ 0103 KAY2 SON ROR ROR ROR ROR $ 0103 $ 0102 $ 0101 $ 0100 DEC B BEQ $ SON JMP $ KAY1 WAI Operandlarýn uzunluðunu belirle Çarpým kaydedicinin anlamlý yarýsýný sýfýrla Çarpaný elde üzerinden döndür Çarpanýn test edilen biti = 0 mýdýr? Çarpan biti = 1 ise çarpýlan kýsmi çarpýma ekle. Yeni kýsmi, çarpýmý çarpým kaydedicide sakla Çarpým kaydediciyi 1-bit saða kaydýr. Tüm çarpým bitleri için iþlemler tekrarlandý mý ? Þekil 4.12. 2-baytlýk sayýlarýn çarpýmý. Örnek 4.3. B001H adresinden baþlayan ve uzunluðu B000H adresinde tutulan, küçükten büyüðe doðru sýralanmýþ, ve elemanlarý bir bayt büyüklüðünde pozitif tamsayýlar olan bir sýralý dizi veriliyor. 2111H adresinde oturan bir giriþ cihazýndan alýnan bir baytlýk pozitif tamsayýnýn bu dizide bulunup bulunmadýðýný test ettikten sonra, eðer dizide yoksa, dizinin sýralý oluþunu bozmadan dizide uygun yere koyulmasýný saðlayacak ve dizi uzunluðunu bir artýracak bir program yazýnýz. Çözüm. Giriþ cihazýndan alýnan bilgi dizinin tüm elemanlarýyla sýrayla karþýlaþtýrýlýr. Karþýlaþtýrma CMP emiriyle yapýlýr. Eþitliðe rastlanýrsa, giriþ cihazýndan alýnan deðer dizide vardýr, dolayýsýyla program sonuna atlanýr. Eðer girilen bayt dizi elemanlarýnýn birinden küçük kalýyorsa, girilen baytý bu noktada diziye sokmalýyýz. Dizede yer açmak amacýyla dizinin bu noktadan sonraki elemanlarý bir bayt ileri kaydýrýlýr. Girilen bayt dizinin tüm elemanlarýndan büyükse, elemanlarýn yerlerinde bir deðiþiklik yapýlmayacak, sadece girilen bayt dizinin sonuna eklenecektir. Girilen bayt dizeye ilave edilince, dizi boyu mutlaka bir artýrýlacaktýr. Program Þekil 4.13’de verilmiþtir. Dizinin baþlangýcýný belirle Dizi uzunluðu izlemek için bellekte sayýcý yap Dýþardan bilgiyi al [Akü]-[Bellek] iþlemini yaparak karþýlaþtýr. Bilgi dizide vardýr. [Akü] < [Bellek] dir. Bilgi dizide yoktur. LDX # $ B001 LDA B $ B000 STA B $ AFFF LDA A $ 2111 BAÞ CMP A $ 00,X BEQ SON BMI YERLEÞ INX DEC $ AFFF BNE BAÞ YERLEÞ LDA B $ 00, X STA A $ 00, X TBA ÝNX DEC $ AFFF BGE YERLEÞ INC $ B000 SON WAI Tüm elemanlar için karþýlaþtýrma yapýldý mý ? Alýnan bilginin koyulacaðý yer belirlenmiþtir. Kaydýrmayý yap ve bilgiyi belleðe yerleþtir. [Akü] > [Bellek] ise alýnan bilgiyi dizi sonuna yerleþtirmeye yarar Þekil 4.13. verilen bir baytlýk bilginin sýralý bir dizide bulunup bulunmadýðýný araþtýran program. Örnek 4.4. Ýþaretsiz ikili sayýlardan oluþan bir sayý dizisi azalan sýrada tasnif edilmek isteniyor. Dizi uzunluðu 0040H adresinde tutulmaktadýr. Dizinin kendisi 0041H adresinden baþlamaktadýr. Bu sayý dizisi sýralama programýný yazýnýz. 2111 AFFF B000 B001 B002 : (2) 39 Uzunluk kopyasý Uzunluk 10 22 36 38 45 Dizi (3) (1) 56 72 . . Þekil 4.13’ün devamý. Çözüm. Örnek dizi 25 12 86 69 10 70 olsun. Sayý dizisini sýralayabilmek için etkin bir algoritmanýn kurulmasý gerekir. Dizilerin sýralanmasýnda genellikle yuvalý (nested) döngüler kullanýlýr. Döngülerin her ikisi FOR...NEXT biçiminde seçilirse dizinin sýralama süresi sabit olur. Ama döngülerden biri FOR...NEXT diðeri WHILE...WEND kuralýna göre yapýlýrsa, sýralý bir dizi verildiði zaman, dizinin sýralanmasý için yalnýz bir tarama iþlemi yeterli olur. Aksi halde dizideki eleman sayýsý kadar tarama iþlemi gerekli olur. Þekil 4.14’teki programda FOR...NEXT ve WHILE...WEND döngüleri kullanýlmýþtýr, ve her taramada dizinin en küçük elemanlarýndan birinin belirlenmesi amaçlanmýþtýr. Bir tarama iþlemi esnasýnda iki komþu sayýnýn yerleri deðiþtirilmiþ ise yeni bir taramanýn daha yapýlmasý zorunlu olmaktadýr. Bu yer deðiþtirme takas bayraðýnýn birlenmiþ olmasýndan anlaþýlmaktadýr. Örnek dizi sýralandýðý zaman 86 70 69 25 12 10 biçimini alýr. BAÞ KARÞ CLR $ 0038 LDA A$ 0040 STA A$ 0039 DEC $ 0039 BEQ SON LDX #$ 0041 LDA A$ 0,X CMP A$ 1,X BPL TEKR LDA B$ 1,X Takas bayraðýnýn yerini belirle Dizi uzunluðunun kopyasýný çýkar (Eleman sayýsý-1) karþýlaþtýrma yap ve tek elemanlý dizi olduðunu belirle Dizinin baþlangýcýný belirle Komþu iki sayýyý karþýlaþtýr Önceki sayý sonrakinden büyükse yer deðiþtir Önceki sayý küçük ise TEKR SON STA STA LDA STA INX DEC BNE DEC BEQ WAI A$ 1,X B$ 0,X A #$ 01 A$ 0038 $ 0039 KARÞ $ 0038 BAÞ takas yap Takas bayraðýný birle Dizi sonuna varýldý mý ? Yeni tarama gerekiyor mu ? Þekil 4.14. Sayý dizisini büyükten küçüðe doðru sýralama programý.