Adresleme modu - Addressing mode

Adresleme modları , çoğu merkezi işlem birimi (CPU) tasarımında komut seti mimarisinin bir yönüdür . Belirli bir komut seti mimarisine tanımlanan çeşitli adresleme modları nasıl tanımlamak makine dili talimatları o mimaride tespit işlenen her öğretim (ler). Bir adresleme modu, bir makine talimatında veya başka bir yerde bulunan kayıtlarda ve/veya sabitlerde tutulan bilgileri kullanarak bir işlenenin etkin bellek adresinin nasıl hesaplanacağını belirtir .

Gelen bilgisayar programlama , adresleme modları öncelikle yazanlar ilgilendiren montaj dilleri ve derleyici yazarlar. İlgili bir kavram için , herhangi bir talimatın herhangi bir adresleme modunu kullanma yeteneği ile ilgilenen ortogonal talimat setine bakın .

uyarılar

Çeşitli adresleme modlarını adlandırmanın genel kabul görmüş bir yolu olmadığını unutmayın. Özellikle, farklı yazarlar ve bilgisayar üreticileri, aynı adresleme kipine farklı adlar verebilir veya farklı adresleme kiplerine aynı adları verebilir. Ayrıca, belirli bir mimaride tek bir adresleme modu olarak ele alınan bir adresleme modu, başka bir mimaride iki veya daha fazla adresleme modu tarafından kapsanan işlevselliği temsil edebilir. Örneğin , Digital Equipment Corporation (DEC) VAX gibi bazı karmaşık komut seti bilgisayar (CISC) mimarileri, yazmaçları ve değişmez veya anlık sabitleri yalnızca başka bir adresleme modu olarak ele alır. IBM System/360 ve onun ardılları ve çoğu azaltılmış komut seti bilgisayarı (RISC) tasarımları gibi diğerleri, bu bilgiyi talimat içinde kodlar. Bu nedenle, ikinci makineler, bir kaydı diğerine kopyalamak, değişmez bir sabiti bir kayıt defterine kopyalamak ve bir bellek konumunun içeriğini bir kayıt defterine kopyalamak için üç farklı talimat koduna sahiptir, oysa VAX'ın yalnızca tek bir "MOV" talimatı vardır.

"Adresleme modu" teriminin kendisi farklı yorumlara tabidir: "bellek adresi hesaplama modu" veya "işlenen erişim modu". İlk yoruma göre, bellekten okumayan veya belleğe yazmayan ("kaydede sabit değer ekleme" gibi) komutların bir "adresleme modu"na sahip olmadığı kabul edilir. İkinci yorum, VAX gibi, bir yazmaç veya değişmez bir işlenene izin vermek için işlenen modu bitlerini kullanan makinelere izin verir. "Yük etkin adres" gibi talimatlar için yalnızca ilk yorum geçerlidir.

Aşağıda listelenen adresleme modları, kod adresleme ve veri adresleme olarak ikiye ayrılır. Çoğu bilgisayar mimarisi bu ayrımı korur, ancak (neredeyse) tüm adresleme modlarının herhangi bir bağlamda kullanılmasına izin veren bazı mimariler vardır (veya olmuştur).

Aşağıda gösterilen talimatlar, adresleme modlarını göstermek için tamamen temsilidir ve herhangi bir bilgisayar tarafından kullanılan anımsatıcıları yansıtmak zorunda değildir.

Adresleme modlarının sayısı

Farklı bilgisayar mimarileri, donanımda sağladıkları adresleme modlarının sayısına göre büyük farklılıklar gösterir. Karmaşık adresleme modlarını ortadan kaldırmanın ve yalnızca bir veya birkaç basit adresleme modunu kullanmanın, birkaç ekstra talimat ve belki de fazladan bir kayıt gerektirmesine rağmen bazı faydaları vardır. Mevcut tek adresleme modları basit olanlar ise, ardışık CPU'ları tasarlamanın çok daha kolay olduğu kanıtlanmıştır .

Çoğu RISC mimarisinde sadece beş basit adresleme modu bulunurken, DEC VAX gibi CISC mimarilerinde bazıları oldukça karmaşık olan bir düzineden fazla adresleme modu bulunur. IBM System/360 mimarisinde yalnızca üç adresleme modu vardı; System/390 için birkaç tane daha eklendi .

Yalnızca birkaç adresleme modu olduğunda, gereken belirli adresleme modu genellikle talimat kodu içinde kodlanır (örneğin, IBM System/360 ve ardılları, çoğu RISC). Ancak birçok adresleme modu olduğunda, talimatta adresleme modunu belirtmek için genellikle belirli bir alan ayrılır. DEC VAX, hemen hemen tüm komutlar için birden fazla bellek işlenenine izin verdi ve bu nedenle , her işlenen belirtecinin ilk birkaç bitini , o belirli işlenen için adresleme modunu belirtmek için ayırdı . Adresleme modu belirteci bitlerini işlem kodu işlem bitlerinden ayrı tutmak, ortogonal bir komut seti üretir .

Birçok adresleme modu olan bir bilgisayarda bile, gerçek programların ölçümleri, aşağıda listelenen basit adresleme modlarının, kullanılan tüm adresleme modlarının yaklaşık %90'ını veya daha fazlasını oluşturduğunu gösterir. Bu tür ölçümlerin çoğu, derleyiciler tarafından üst düzey dillerden oluşturulan koda dayandığından, bu, bir dereceye kadar kullanılan derleyicilerin sınırlamalarını yansıtır.

Faydalı yan etki

Intel x86 ve IBM/360 ve onun ardılları gibi bazı komut seti mimarileri, yükte etkin bir adres talimatına sahiptir. Bu, etkin işlenen adresinin bir hesaplamasını gerçekleştirir, ancak bu bellek konumu üzerinde hareket etmek yerine, erişilecek olan adresi bir kayıt defterine yükler. Bu, bir dizi öğesinin adresini bir alt programa geçirirken faydalı olabilir. Aynı zamanda, bir komutta normalden daha fazla hesaplama yapmanın biraz sinsi bir yolu olabilir; örneğin, "base+index+offset" (aşağıda ayrıntılı olarak açıklanmaktadır) adresleme moduyla böyle bir komutun kullanılması, bir komutta iki kayıt ve bir sabitin birlikte eklenmesine izin verir.

Kod için basit adresleme modları

Mutlak veya doğrudan

   +----+------------------------------+
   |jump|           address            |
   +----+------------------------------+

   (Effective PC address = address)

Mutlak talimat adresi için etkin adres, değişiklik yapılmayan adres parametresinin kendisidir.

PC'ye göre

   +----+------------------------------+
   |jump|           offset             |    jump relative
   +----+------------------------------+

   (Effective PC address = next instruction address + offset, offset may be negative)

PC'ye bağlı talimat adresi için etkin adres, bir sonraki komutun adresine eklenen ofset parametresidir. Bu ofset genellikle, hem talimattan önce hem de sonra koda referansa izin vermek için imzalanır.

Bu, özellikle atlamalarla bağlantılı olarak yararlıdır, çünkü tipik atlamalar yakındaki talimatlara yapılır (yüksek seviyeli bir dilde, çoğu if veya while ifadeleri oldukça kısadır). Gerçek programların ölçümleri, koşullu atlamaların yaklaşık %90'ı (kabaca ±128 veya ±512 bayt) için 8 veya 10 bitlik bir ofsetin yeterince büyük olduğunu göstermektedir.

PC'ye göre adreslemenin bir başka avantajı, kodun konumdan bağımsız olabilmesidir , yani herhangi bir adresi ayarlamaya gerek kalmadan bellekte herhangi bir yere yüklenebilir.

Bu adresleme modunun bazı versiyonları, iki kayıt ("reg1=reg2 ise atla"), bir kayıt ("reg1=0 olmadıkça atla") veya kayıt yok, durum kaydında önceden ayarlanmış bazı bitlere dolaylı olarak atıfta bulunarak koşullu olabilir. . Ayrıca aşağıdaki koşullu yürütmeye bakın.

Dolaylı kayıt

   +-------+-----+
   |jumpVia| reg |
   +-------+-----+

   (Effective PC address = contents of register 'reg')

Bir Kayıt dolaylı talimatının etkin adresi, belirtilen kayıttaki adrestir. Örneğin, (A7), A7 adres kaydının içeriğine erişmek için.

Etki, kontrolü, adresi belirtilen kayıt defterinde bulunan talimata aktarmaktır.

Birçok RISC makinesinin yanı sıra CISC IBM System/360 ve ardılları, dönüş adresini bir adres kaydına yerleştiren alt rutin arama talimatlarına sahiptir - bu alt program çağrısından geri dönmek için kayıt dolaylı adresleme modu kullanılır.

Sıralı adresleme modları

sıralı yürütme

   +------+
   | nop  |              execute the following instruction
   +------+

   (Effective PC address = next instruction address)

CPU, sıralı bir talimatı yürüttükten sonra, hemen aşağıdaki talimatı yürütür.

Sıralı yürütme, bazı bilgisayarlarda bir adresleme modu olarak kabul edilmez.

Çoğu CPU mimarisindeki yönergelerin çoğu sıralı yönergelerdir. Çoğu talimat sıralı talimatlar olduğundan, CPU tasarımcıları genellikle bu sıralı talimatların daha hızlı çalışmasını sağlamak için diğer talimatların (dal talimatlarının) performansını kasıtlı olarak feda eden özellikler ekler.

Koşullu dallar, duruma bağlı olarak bilgisayarı 2 olası sonuçtan biriyle yükler; çoğu CPU mimarisi "alınan" dal için başka bir adresleme modu ve "alınmayan" dal için sıralı yürütme kullanır.

Modern CPUs- birçok özellik talimat prefetch ve daha karmaşık pipelineing , out-of-order yürütme , yanılsama vs.-korumak her talimat bitirir sonraki o içten olur tam olarak ne olmadığı halde, aynı kesin sonuçları veren başlamadan önce .

Bu tür sıralı talimatların her " temel bloğu " , referansın hem zamansal hem de uzaysal konumunu sergiler .

Sıralı yürütme kullanmayan CPU'lar

Bir program sayacıyla sıralı yürütme kullanmayan CPU'lar oldukça nadirdir. Bazı CPU'larda, her talimat her zaman bir sonraki talimatın adresini belirtir. Bu tür CPU'lar, belirtilen adresi tutan bir talimat işaretçisine sahiptir; bu bir program sayacı değildir, çünkü onu artırmak için herhangi bir hüküm yoktur. Bu tür CPU'lar , IBM 650 , SECD makinesi ve RTX 32P gibi bazı tambur bellek bilgisayarlarını içerir .

Diğer bilgi işlem mimarileri , program sayacına çeşitli alternatifler kullanarak von Neumann darboğazını aşmaya çalışarak çok daha ileri gider .

koşullu yürütme

Bazı bilgisayar mimarilerinde koşullu yönergeler (örneğin, ARM gibi , ancak artık 64 bit modundaki tüm yönergeler için değil) veya koşullu yükleme yönergeleri (x86 gibi) bulunur; bu yönergeler, bazı durumlarda koşullu dalları gereksiz kılabilir ve yönerge ardışık düzenini boşaltmaktan kaçınabilir . Bir koşul kodu ayarlamak için 'karşılaştır' gibi bir talimat kullanılır ve sonraki talimatlar, bunlara uyulup uyulmadığını görmek için bu koşul kodu üzerinde bir test içerir.

Atlamak

   +------+-----+-----+
   |skipEQ| reg1| reg2|      skip the next instruction if reg1=reg2
   +------+-----+-----+

   (Effective PC address = next instruction address + 1)

Atlamalı adresleme, sabit bir "+1" ofseti ile özel bir tür PC'ye bağlı adresleme modu olarak düşünülebilir. PC'ye göre adresleme gibi, bazı CPU'larda bu adresleme modunun yalnızca bir kayıt ("reg1=0 ise atla") veya kayıt içermeyen, örtük olarak durum kaydında önceden ayarlanmış bazı bitlere atıfta bulunan sürümleri vardır . Diğer CPU'ların test etmek için belirli bir bayttaki belirli bir biti seçen bir sürümü vardır ("reg12'nin 7. biti 0 ise atlayın").

Diğer tüm koşullu dallardan farklı olarak, bir "atlama" talimatının hiçbir zaman talimat ardışık düzenini temizlemesi gerekmez, ancak bir sonraki talimatın yok sayılmasına neden olması gerekebilir.

Veriler için basit adresleme modları

Kaydolun (veya Doğrudan Kaydolun)

   +------+-----+-----+-----+
   | mul  | reg1| reg2| reg3|      reg1 := reg2 * reg3;
   +------+-----+-----+-----+

Bu "adresleme modu"nun etkin bir adresi yoktur ve bazı bilgisayarlarda bir adresleme modu olarak kabul edilmez.

Bu örnekte, tüm işlenenler kayıtlardadır ve sonuç bir kayıt defterine yerleştirilir.

Baz artı ofset ve varyasyonlar

Buna bazen 'taban artı yer değiştirme' denir.

   +------+-----+-----+----------------+
   | load | reg | base|     offset     |  reg := RAM[base + offset]
   +------+-----+-----+----------------+

   (Effective address = offset + contents of specified base register)

Ofset (bu da genellikle işaretli bir 16-bit değeri olan 80386 32 bite genişletilmiş).

Ofset sıfır ise, bu, kayıt dolaylı adreslemenin bir örneği olur ; etkin adres sadece temel kayıttaki değerdir.

Birçok RISC makinesinde kayıt 0, sıfır değerinde sabitlenir. Temel kayıt olarak kayıt 0 kullanılırsa, bu bir mutlak adresleme örneği olur . Ancak, belleğin yalnızca küçük bir bölümüne erişilebilir ( ofset 16 bit ise 64 kilobayt ).

16-bit ofset, mevcut bilgisayar belleklerinin boyutuna göre çok küçük görünebilir ( 80386'nın bunu 32-bit'e genişletmesinin nedeni budur ). Daha da kötüsü olabilirdi: IBM System/360 ana bilgisayarlarında yalnızca imzasız 12 bitlik bir kayma bulunur. Bununla birlikte, referans yerelliği ilkesi geçerlidir: kısa bir zaman aralığında, bir programın erişmek istediği veri öğelerinin çoğu birbirine oldukça yakındır.

Bu adresleme modu, indekslenmiş mutlak adresleme modu ile yakından ilgilidir.

Örnek 1 : Bir alt program içinde, bir programcı esas olarak , bir temel kayıt ( çerçeve işaretçisi ) için yeterli olan 64 KB'yi nadiren aşacak olan parametreler ve yerel değişkenlerle ilgilenecektir . Bu rutin nesne yönelimli bir dilde bir sınıf yöntemiyse, mevcut nesnenin niteliklerine işaret eden ikinci bir temel kayıt gereklidir ( bu veya bazı yüksek seviyeli dillerde self ).

Örnek 2 : Temel kayıt bir bileşik türün (bir kayıt veya yapı) adresini içeriyorsa, ofset o kayıttan bir alan seçmek için kullanılabilir (çoğu kayıt/yapının boyutu 32 kB'den küçüktür).

Anında/gerçek

   +------+-----+-----+----------------+
   | add  | reg1| reg2|    constant    |    reg1 := reg2 + constant;
   +------+-----+-----+----------------+

Bu "adresleme modu"nun etkin bir adresi yoktur ve bazı bilgisayarlarda bir adresleme modu olarak kabul edilmez.

Sabit imzalı veya imzasız olabilir. Örneğin, move.l #$FEEDABBA, D0"FEEDABBA"nın hemen hex değerini D0 kaydına taşımak için.

Bir işleneni bellekten kullanmak yerine, işlenenin değeri talimatın kendisinde tutulur. DEC VAX makinesinde, değişmez işlenen boyutları 6, 8, 16 veya 32 bit uzunluğunda olabilir.

Andrew Tanenbaum , bir programdaki tüm sabitlerin %98'inin 13 bite sığacağını gösterdi (bkz. RISC tasarım felsefesi ).

örtük

   +-----------------+
   | clear carry bit |
   +-----------------+

   +-------------------+
   | clear Accumulator |
   +-------------------+

Örtük adresleme modu ( x86 derleme dili ) olarak da adlandırılan örtük adresleme modu , kaynak veya hedef (veya bazen her ikisi) için açıkça etkin bir adres belirtmez.

Kaynak (varsa) veya hedef etkin adres (veya bazen her ikisi) işlem kodu tarafından belirtilir.

Zımni adresleme eski bilgisayarlarda (1970'lerin ortalarına kadar) oldukça yaygındı. Bu tür bilgisayarlar tipik olarak, aritmetiğin gerçekleştirilebileceği tek bir kayıt defterine sahipti: akümülatör. Bu tür akümülatör makineleri , hemen hemen her talimatta bu akümülatöre dolaylı olarak atıfta bulunur. Örneğin < a := b + c işlemi; > dizisi kullanılarak yapılabilir < yük b; c'yi ekleyin; bir depolayın; > -- hedef (akümülatör) her "yükleme" ve "ekleme" talimatında belirtilir; kaynak (akümülatör) her "mağaza" talimatında belirtilir.

Daha sonraki bilgisayarlar genellikle aritmetik için kaynak veya hedef veya her ikisi olabilen birden fazla genel amaçlı kayıt veya RAM konumuna sahipti ve bu nedenle daha sonraki bilgisayarların aritmetiğin kaynağını ve hedefini belirtmek için başka bir adresleme moduna ihtiyacı vardı.

x86 komutları arasında, bazıları işlenenlerden veya sonuçlardan biri için örtük kayıtlar kullanır (çarpma, bölme, koşullu atlama sayma).

Birçok bilgisayarda (x86 ve AVR gibi) yığın işaretçisi adı verilen ve yığından veri gönderirken veya çıkarırken dolaylı olarak artan veya azalan bir özel amaçlı yazmaç bulunur ve kaynak veya hedef etkin adres (dolaylı olarak) bu adreste depolanan adrestir. yığın işaretçisi.

Çoğu 32 bit bilgisayarda (68000, ARM veya PowerPC gibi) yığın işaretçisi olarak kullanılabilecek birden fazla kayıt vardır ve bu nedenle, bu kayıtlardan hangisinin kullanılacağını belirlemek için "otomatik artış dolaylı kaydı" adresleme modunu kullanın. bir yığından veri itme veya patlatma.

Bazı güncel bilgisayar mimarileri (örneğin IBM/390 ve Intel Pentium), önceki tasarımlarla geriye dönük uyumluluğu korumak için örtük işlenenlere sahip bazı talimatlar içerir.

Birçok bilgisayarda, kullanıcı/sistem modu bitini, kesme etkinleştirme bitini vb. çeviren talimatlar, bu bitleri tutan özel kaydı dolaylı olarak belirtir. Bu, Popek ve Goldberg sanallaştırma gereksinimlerini karşılamak için bu talimatları yakalamak için gerekli donanımı basitleştirir — böyle bir sistemde tuzak mantığının herhangi bir işlenene (veya nihai etkin adrese) bakması gerekmez, yalnızca işlem koduna bakması gerekir. .

Her işlenenin her komutta her zaman dolaylı olarak belirtildiği birkaç CPU tasarlanmıştır - sıfır işlenen CPU'lar.

Kod veya veri için diğer adresleme modları

mutlak/doğrudan

   +------+-----+--------------------------------------+
   | load | reg |         address                      |
   +------+-----+--------------------------------------+

   (Effective address = address as given in instruction)

Bu, oldukça büyük bir adres için bir talimatta yer gerektirir. Genellikle x86 gibi değişken uzunluklu komutlara sahip CISC makinelerinde bulunur .

Bazı RISC makineleri , bir kaydın üst yarısına 16 veya 20 bitlik bir sabit yerleştiren özel bir Load Upper Literal komutuna sahiptir. Bu, daha sonra düşük dereceli 16 veya 12 bit sağlayan bir baz artı ofset adresleme modunda temel kayıt olarak kullanılabilir. Kombinasyon, tam bir 32-bit adrese izin verir.

Endekslenmiş mutlak

   +------+-----+-----+--------------------------------+
   | load | reg |index|         address                |
   +------+-----+-----+--------------------------------+

   (Effective address = address + contents of specified index register)

Bu aynı zamanda oldukça büyük bir adres için bir talimatta yer gerektirir. Adres, bir dizinin veya vektörün başlangıcı olabilir ve dizin, gereken belirli dizi öğesini seçebilir. İşlemci , her bir dizi öğesinin boyutuna izin vermek için dizin kaydını ölçeklendirebilir .

Bu durumda ofsetin herhangi bir bellek konumunu adresleyecek kadar büyük olması dışında, bunun taban artı ofset adresleme modu ile aşağı yukarı aynı olduğuna dikkat edin.

Örnek 1 : Bir alt program içinde, bir programcı bir dizgiyi yerel sabit veya statik değişken olarak tanımlayabilir . Dizenin adresi, talimattaki değişmez adreste saklanır. Bir döngünün bu yinelemesinde dizenin hangi karakterinin kullanılacağı ofset, indeks kaydında saklanır.

Örnek 2 : Bir programcı birkaç büyük diziyi globaller veya sınıf değişkenleri olarak tanımlayabilir . Dizinin başlangıcı, ona başvuran talimatın değişmez adresinde (belki de program yükleme zamanında yeniden konumlandırılan bir yükleyici tarafından değiştirilir ) saklanır . Bir döngünün bu yinelemesinde diziden hangi öğenin kullanılacağı ofset, dizin kaydında depolanır. Genellikle bir döngüdeki talimatlar, döngü sayacı ve birkaç dizinin ofsetleri için aynı kaydı yeniden kullanır.

Baz artı indeks

   +------+-----+-----+-----+
   | load | reg | base|index|
   +------+-----+-----+-----+

   (Effective address = contents of specified base register + contents of specified index register)

Temel kayıt, bir dizinin veya vektörün başlangıç ​​adresini içerebilir ve dizin, gereken belirli dizi öğesini seçebilir. İşlemci , her bir dizi öğesinin boyutuna izin vermek için dizin kaydını ölçeklendirebilir . Bu, parametre olarak iletilen bir dizinin öğelerine erişmek için kullanılabilir.

Baz artı indeks artı ofset

   +------+-----+-----+-----+----------------+
   | load | reg | base|index|         offset |
   +------+-----+-----+-----+----------------+

   (Effective address = offset + contents of specified base register + contents of specified index register)

Temel kayıt, bir dizi veya kayıt vektörünün başlangıç ​​adresini içerebilir, indeks, gereken belirli kaydı seçebilir ve ofset, bu kayıt içindeki bir alanı seçebilir. İşlemci , her bir dizi öğesinin boyutuna izin vermek için dizin kaydını ölçeklendirebilir .

Ölçekli

   +------+-----+-----+-----+
   | load | reg | base|index|
   +------+-----+-----+-----+

   (Effective address = contents of specified base register + scaled contents of specified index register)

Temel kayıt, bir dizinin veya vektör veri yapısının başlangıç ​​adresini içerebilir ve dizin, gereken belirli bir dizi öğesinin ofsetini içerebilir.

Bu adresleme modu, her bir dizi öğesinin boyutuna izin vermek için dizin kaydındaki değeri dinamik olarak ölçeklendirir, örneğin dizi öğeleri, her biri 8 bayt kaplayan çift kesinlikli kayan noktalı sayılar ise, o zaman dizin kaydındaki değer, oluşturulmadan önce 8 ile çarpılır. etkin adres hesaplamasında kullanılır. Ölçek faktörü, normal olarak, bir varlık ile sınırlıdır iki gücü böylece, kaydırma çarpma yerine kullanılabilir.

Dolaylı kayıt

   +------+------+-----+
   | load | reg1 | base|
   +------+------+-----+
 
   (Effective address = contents of base register)

Birkaç bilgisayar bunu ayrı bir adresleme modu olarak kullanır. Pek çok bilgisayar , 0 ofset değeriyle yalnızca taban artı ofseti kullanır. Örneğin, (A7)

Otomatik artış dolaylı kaydı

   +------+-----+-------+
   | load | reg | base  |
   +------+-----+-------+

   (Effective address = contents of base register)

Etkin adresi belirledikten sonra, temel kayıttaki değer, erişilecek veri öğesinin boyutuyla artırılır. Örneğin, (A7)+, A7 adres kaydının içeriğine erişir, ardından A7'nin adres işaretçisini 1 (genellikle 1 kelime) artırır. Bir döngü içinde, bu adresleme modu, bir dizinin veya vektörün tüm öğelerinde gezinmek için kullanılabilir.

Üst düzey dillerde, sonuç döndüren işlevlerin yan etkileri olmamasının genellikle iyi bir fikir olduğu düşünülür ( yan etkilerin olmaması, programın anlaşılmasını ve doğrulanmasını çok daha kolay hale getirir). Bu adresleme modunun, baz kaydının değiştirilmesi gibi bir yan etkisi vardır. Sonraki hafıza erişimi bir kesintiye yol açan bir hataya (örneğin sayfa hatası, veri yolu hatası, adres hatası) neden olursa, talimatın yeniden başlatılması çok daha problemli hale gelir çünkü bir veya daha fazla kaydın daha önce bulundukları duruma geri ayarlanması gerekebilir. talimat başlangıçta başladı.

Bu adresleme modu kullanıldığında kesintilerden kurtarmaya ilişkin uygulama sorunları yaşayan en az iki bilgisayar mimarisi olmuştur:

  • Motorola 68000 (adres 24 bit olarak gösterilir). Bir veya iki otomatik artış kayıt işleneni olabilir. 68.010 + üzerine işlemcinin iç durumunu kaydederek sorunu çözüldü otobüs veya adres hataları.
  • DEC VAX. 6 adede kadar otomatik artış kayıt işleneni olabilir. Her işlenen erişimi iki sayfa hatasına neden olabilir (işlenenler bir sayfa sınırını aşmışsa). Tabii ki talimatın kendisi 50 baytın üzerinde olabilir ve bir sayfa sınırını da aşabilir!

Otomatik azalmayı dolaylı olarak kaydet

   +------+-----+-----+
   | load | reg | base|
   +------+-----+-----+

   (Effective address = new contents of base register)

Etkin adresi belirlemeden önce, temel kayıttaki değer, erişilecek veri öğesinin boyutu kadar azaltılır.

Bir döngü içinde, bu adresleme modu, bir dizinin veya vektörün tüm öğelerinde geriye doğru adım atmak için kullanılabilir. Bu mod, önceki adresleme moduyla (otomatik artış) bağlantılı olarak kullanılarak bir yığın uygulanabilir.

Otomatik artış adresleme modu altındaki yan etkiler tartışmasına bakın .

dolaylı bellek

Bu makalede bahsedilen adresleme modlarından herhangi biri dolaylı adreslemeyi belirtmek için fazladan bir bit içerebilir, yani bazı modlar kullanılarak hesaplanan adres aslında fiili etkin adresi içeren bir konumun adresidir (tipik olarak tam bir kelime ).

Dolaylı adresleme, kod veya veri için kullanılabilir. Bu uygulanmasını yapabilir işaretçiler , referanslar veya tutamaklar çok daha kolay, hem de daha kolay aksi adreslenebilir olmayan altyordamlarını aramaya yapabilirsiniz. Dolaylı adresleme, ilgili ekstra bellek erişimi nedeniyle bir performans cezası taşır.

Bazı eski mini bilgisayarlar (örneğin DEC PDP-8 , Data General Nova ) yalnızca birkaç kayıt ve yalnızca sınırlı bir adresleme aralığına (8 bit) sahipti. Bu nedenle, bellek dolaylı adreslemenin kullanımı, herhangi bir önemli miktarda belleğe atıfta bulunmanın neredeyse tek yoluydu.

PC'ye göre

   +------+------+---------+----------------+
   | load | reg1 | base=PC |     offset     |
   +------+------+---------+----------------+

   reg1 := RAM[PC + offset]
   (Effective address = PC + offset)

PC'ye bağlı adresleme modu, mevcut talimattan kısa bir mesafede program belleğinde saklanan bir değere sahip bir kaydı yüklemek için kullanılabilir. Program sayacını (PC) "temel kayıt" olarak seçen "baz artı ofset" adresleme modunun özel bir durumu olarak görülebilir.

Bilgisayara bağlı veri referanslarını destekleyen birkaç CPU vardır. Bu tür CPU'lar şunları içerir:

MOS 6502 ve türevleri göre bütün adresleme kullanılan dal talimatlar . Sadece bu komutlar bu modu kullandı, atlamalar çeşitli diğer adresleme modlarını kullandı.

X86-64 mimarisi ve 64-bit ARMv8-A mimarisi PC göreli adresleme x86-64 yılında "RIP-akraba" olarak adlandırılan modları ve ARMv8-A'da "literal" var. Motorola 6809 aynı zamanda bir bilgisayara göreli adresleme modunu destekler.

PDP-11 mimarlık, VAX mimarisi ve 32 bit ARM mimarileri PC nispi sicil dosyasında PC alarak adresleme desteği.

IBM z / Mimarlık Genel-Talimatlar-Uzatma Tesisi aktifse PC-göreli adresleme ile örneğin özel talimatlar, Yük Bağıl Uzun içerir.

Bu adresleme modu kullanıldığında, derleyici tipik olarak sabitleri, yanlışlıkla talimat olarak çalıştırmayı önlemek için, onları kullanan alt programdan hemen önce veya hemen sonra bir hazır bilgi havuzuna yerleştirir .

Her zaman bellekten veri çeken veya verileri belleğe depolayan ve ardından sıralı olarak bir sonraki komutu yürütmek için geçen bu adresleme modu (etkin adres verilere işaret eder), veri getirmeyen "PC'ye göre şube" ile karıştırılmamalıdır. verileri belleğe kaydeder veya belleğe depolar, ancak bunun yerine verilen ofsette başka bir talimata dallanır (etkin adres, yürütülebilir bir talimata işaret eder).

Eski adresleme modları

Burada listelenen adresleme kipleri 1950–1980 döneminde kullanıldı, ancak artık mevcut bilgisayarların çoğunda mevcut değil. Bu liste hiçbir şekilde eksiksiz değildir; zaman zaman kullanılan birçok başka ilginç ve özel adresleme modu olmuştur, örneğin iki veya üç indeks kaydının mutlak-eksi-mantıksal-OR.

Çok seviyeli bellek dolaylı

Sözcük boyutu adresten daha büyükse, bellek-dolaylı adresleme için başvurulan sözcüğün kendisi, başka bir bellek dolaylı döngüsünü belirtmek için ayarlanmış bir dolaylı işarete sahip olabilir. Bu bayrağa bir dolaylı işaretçi denir ve ortaya çıkan işaretçi etiketli bir işaretçidir , dolaylı işaretçi ister doğrudan ister dolaylı bir işaretçi olsun etiketlemedir. Dolaylı adresler zincirinin kendisine atıfta bulunmamasını sağlamak için özen gösterilmelidir; eğer öyleyse, bir adresi çözmeye çalışırken sonsuz bir döngü elde edilebilir .

IBM 1620 , Veri Genel Nova , HP 2100 serisi ve NAR 2 tür her bir çok düzeyli bellek dolaylı sahiptir ve böyle sonsuz bir adres hesaplama döngüye girebilir. Nova'daki bellek dolaylı adresleme modu, dolaylı iş parçacıklı kodun icadını etkilemiştir .

18-bit adresli ve 36-bit word'lü DEC PDP-10 bilgisayarı , her aşamada bir indeks kaydı kullanma imkanı ile çok seviyeli dolaylı adreslemeye izin verdi. Öncelikli kesme sistemi, her adres kelimesinin kodu çözülmeden önce sorgulandı. Bu nedenle, dolaylı bir adres döngüsü, herhangi bir önleyici çoklu görev zamanlayıcısının zaman dilimi süre sonu işleyicisi dahil olmak üzere, cihaz hizmeti rutinlerinin yürütülmesini engellemez . Bir döngü talimatı, diğer herhangi bir hesaplamaya bağlı iş gibi ele alınacaktır.

Bellek eşlemeli kayıtlar

Bazı bilgisayarlarda, kayıtların hafızanın ilk 8 veya 16 kelimesini işgal ettiği kabul edildi (örn. ICL 1900 , DEC PDP-10). Bu, ayrı bir "kayıt eklemek için kayıt" talimatına gerek olmadığı anlamına geliyordu - sadece "kaydetmek için hafıza ekle" talimatı kullanılabilir.

PDP-10'un önbelleğe sahip olmayan ilk modellerinde, belleğin ilk birkaç kelimesine yüklenen sıkı bir iç döngü (kuruluysa hızlı yazmaçların adreslenebilir olduğu yer) bu modelde olduğundan çok daha hızlı çalıştı. manyetik çekirdek bellek

DEC PDP-11 serisinin sonraki modelleri , kayıtları giriş/çıkış alanındaki adreslerle eşleştirdi, ancak bu öncelikle uzaktan tanılamaya izin vermek için tasarlandı. Şaşırtıcı bir şekilde, 16 bitlik kayıtlar ardışık 8 bitlik bayt adreslerine eşlendi.

Bellek dolaylı ve otomatik artış

DEC PDP-8 mini bilgisayarının sekiz özel konumu vardı (8 ile 15 arasındaki adreslerde). Bellek dolaylı adresleme yoluyla erişildiğinde, bu konumlar kullanımdan sonra otomatik olarak artacaktır. Bu, adımları işlemek için herhangi bir kayıt kullanmaya gerek kalmadan bir döngüde bellekte ilerlemeyi kolaylaştırdı.

Veri Genel Nova 16 23 aracılığıyla otomatik olarak kullanım öncesi artırmak olur, adresleme hafıza üzerinden erişilebilir, ve 31 ile 24, otomatik olarak, kullanımdan önce azaltma ne zaman mini bilgisayar 31 arasında adresleri 16, 16 özel bir bellek konumlarını vardı.

sıfır sayfa

Veri Genel Nova , Motorola 6800 ailesi ve MOS Technology 6502 işlemci ailesi çok az dahili kayıtlarını vardı. Aritmetik ve mantıksal komutlar, dahili kayıtların aksine çoğunlukla bellekteki değerlere karşı gerçekleştirildi. Sonuç olarak, birçok talimat, belleğe iki baytlık (16 bit) bir konum gerektirdi. Bu işlemcilerdeki işlem kodlarının yalnızca bir bayt (8 bit) uzunluğunda olduğu göz önüne alındığında, bellek adresleri kod boyutunun önemli bir bölümünü oluşturabilir.

Bu işlemcilerin tasarımcıları, "sıfır sayfa" adresleme olarak bilinen kısmi bir çözüm içeriyordu. İlk 256 bayt belleğe ($0000 – $00FF; aka, sayfa "0") bir baytlık mutlak veya dizine alınmış bellek adresi kullanılarak erişilebilir. Bu, talimat yürütme süresini bir saat döngüsü ve talimat uzunluğunu bir bayt azalttı. Sık kullanılan verileri bu bölgede depolayarak programlar daha küçük ve daha hızlı hale getirilebilir.

Sonuç olarak, sıfır sayfası bir kayıt dosyasına benzer şekilde kullanıldı. Ancak birçok sistemde bu, işletim sistemi ve kullanıcı programları tarafından sıfır sayfa bellek alanının yüksek oranda kullanılmasıyla sonuçlandı ve boş alan sınırlı olduğundan kullanımını sınırladı.

Doğrudan sayfa

Sıfır sayfa adres modu, WDC 65816 , CSG 65CE02 ve Motorola 6809 dahil olmak üzere birçok geç model 8 bit işlemcide geliştirildi . "Doğrudan sayfa" adresleme olarak bilinen yeni mod, 256 baytlık sıfır sayfa bellek penceresini belleğin başlangıcından (offset adresi $0000) ilk 64 KB bellek içindeki yeni bir konuma taşıma yeteneğini ekledi.

CSG 65CE02, yeni temel sayfa (B) kaydında 8 bitlik bir ofset değeri depolayarak doğrudan sayfanın ilk 64 KB bellek içindeki herhangi bir 256 baytlık sınıra taşınmasına izin verdi. Motorola 6809, doğrudan sayfa (DP) kaydı ile aynı şeyi yapabilir. WDC 65816 bir adım daha ileri gitti ve yeni doğrudan (D) yazmaçta 16 bitlik bir ofset değeri depolayarak doğrudan sayfanın ilk 64 KB bellek içindeki herhangi bir konuma taşınmasına izin verdi.

Sonuç olarak, daha fazla sayıda program, yalnızca sıfır sayfa adresleme modunu içeren eski işlemcilere kıyasla gelişmiş doğrudan sayfa adresleme modunu kullanabildi.

Sınır denetimi ile ölçeklenmiş dizin

Bu, talimatın fazladan iki işlenene (tipik olarak sabitler) sahip olması ve donanımın indeks değerinin bu sınırlar arasında olduğunu kontrol etmesi dışında, ölçeklenmiş indeks adreslemeye benzer.

Başka bir varyasyon, sınırları tutmak için vektör tanımlayıcılarını kullanır; bu, dinamik olarak ayrılmış dizileri uygulamayı kolaylaştırır ve yine de tam sınır denetimine sahip olur.

Word içindeki bit alanına dolaylı

Bazı bilgisayarlarda sözcüklerin içindeki alt alanlar için özel dolaylı adresleme modları vardı.

GE / Honeywell 600 serisi dolaylı kelime ele karakter kendi içinde ya da 6-bit ya da 9-bit karakter alanları belirtilen 36 bit sözcük.

DEC PDP-10 , ayrıca 36-bit, belleğin 1 bitten 36 bite kadar herhangi bir boyuttaki sabit boyutlu bit alanları veya bayt dizisi olarak ele alınmasına izin veren özel talimatlara sahipti. Bellekte "bayt işaretçisi" olarak adlandırılan tek sözcüklü bir dizi tanımlayıcısı, dizi içindeki geçerli sözcük adresini, bir sözcük içindeki bir bit konumunu ve her bir baytın boyutunu tutar.

Bu tanımlayıcı aracılığıyla baytları yüklemek ve depolamak ve tanımlayıcıyı bir sonraki bayta işaret edecek şekilde artırmak için talimatlar mevcuttu (baytlar kelime sınırları arasında bölünmedi). Çoğu DEC yazılımı, kelime başına bir bit kullanılmadan, kelime başına beş 7 bit bayt (düz ASCII karakterleri) kullandı. Uygulamaları C C 'malloc işlevi boyutu varsayar, çünkü 9 bitlik kelime için bayt dört kullanmak zorunda int bir büyüklüğü kadar katı olan kömürün ; gerçek kat, sisteme bağlı derleme zamanı operatörü sizeof tarafından belirlenir .

Sonraki talimatı indeksle

Elliott 503 , Elliott 803 ve Apollo Rehberlik Bilgisayar sadece adresleme mutlak kullanılır ve herhangi bir indeks kayıtları yoktu. Bu nedenle, dolaylı atlamalar veya kayıtlar aracılığıyla atlamalar, komut setinde desteklenmedi. Bunun yerine, mevcut bellek kelimesinin içeriğini bir sonraki talimata eklemesi istenebilir . Yürütülecek bir sonraki talimata küçük bir değer eklemek, örneğin, a'yı a'ya JUMP 0dönüştürebilir JUMP 20, böylece indekslenmiş bir atlama efekti yaratabilir. Talimatın anında değiştirildiğini ve bellekte değişmeden kaldığını, yani kendi kendini değiştiren kod olmadığını unutmayın . Bir sonraki talimata eklenen değer yeterince büyükse, adresin yanı sıra veya onun yerine o talimatın işlem kodunu değiştirebilir.

Sözlük

Dolaylı
Bir işaretçi veya adres aracılığıyla başvurulan veriler .
acil
Doğrudan bir talimat veya komut listesine gömülü veriler .
dizin
Tipik olarak bir dizin kaydında tutulan , muhtemelen bir nesne boyutuna göre ölçeklenen dinamik bir kayma .
Telafi etmek
Bir adrese anında eklenen değer; örneğin, C programlama dilinde yapı alanı erişimine karşılık gelir .
Akraba
Başka bir adrese göre oluşturulmuş bir adres.
Artış sonrası
Yığın pop işlemleri için kullanılan C programlama diline benzer şekilde *p++, kullanılan veriyi geçmiş bir adresin adımlaması .
Ön azalma
Yığın itme işlemleri için kullanılan *--p, C programlama dilinde olduğu gibi , kullanımdan önce bir adresin azaltılması .

Ayrıca bakınız

Referanslar

Dış bağlantılar