Yığın kaydı - Stack register

Bir yığın kayıt bir bilgisayar merkezi işlemcinin kayıt Amacı bir takip etmektir çağrı yığını . Üzerinde akümülatör tabanlı mimari makinesi, bu tür bir SP olarak özel bir kayıt olabilir , Intel x86 makine. Genel bir kayıt makinesinde , PDP-11 veya RISC makinelerinde olduğu gibi, konvansiyonla ayrılmış bir kayıt olabilir . Data General Eclipse gibi bazı tasarımların adanmış bir kaydı yoktur, ancak bu işlev için ayrılmış bir donanım bellek adresi kullanır.

1960'ların sonundan önceki makinelerde ( PDP-8 ve HP 2100 gibi) özyinelemeyi destekleyen derleyiciler yoktu . Alt rutin talimatları tipik olarak mevcut konumu atlama adresine kaydeder ve ardından program sayacını sonraki adrese ayarlar . Bu, bir yığının sürdürülmesinden daha basit olsa da, alt rutin kod bölümü başına yalnızca bir dönüş konumu olduğu için, programcı tarafında önemli bir çaba olmaksızın özyineleme olamaz.

Bir yığın makinesinin 2 veya daha fazla yığın kaydı vardır - bunlardan biri bir çağrı yığınını izler, diğeri (ler) diğer yığınları izler .

X86'da yığın yazmaçları

Gelen 8086 , ana yığın yazmacı yığın işaretçisi olarak adlandırılır - SP. Yığın bölüm kaydı (SS), genellikle halihazırda yürütülen programın çağrı yığınını depolayan bellek bölümü hakkındaki bilgileri depolamak için kullanılır . SP mevcut yığının tepesine işaret ediyor. Varsayılan olarak, yığın bellekte aşağı doğru büyür, bu nedenle daha yeni değerler daha düşük bellek adreslerine yerleştirilir. Yığına bir değer göndermek için komut kullanılır. Yığından bir değer çıkarmak için talimat kullanılır. PUSHPOP

Örnek : SS = 1000h ve SP = 0xF820 olduğunu varsayarsak. Bu, geçerli yığının tepesinin fiziksel adres 0x1F820 olduğu anlamına gelir (bu, 8086'daki bellek bölümlemesinden kaynaklanmaktadır ). Programın sonraki iki makine talimatı:

PUSH AX
PUSH BX
  • Bu ilk komut, AX'te (16 bitlik kayıt) depolanan değeri yığına itecektir. Bu, SP'den 2 (2 bayt) bir değer çıkararak yapılır.
  • SP'nin yeni değeri 0xF81E olur. CPU daha sonra AX'in değerini fiziksel adresi 0x1F81E olan bellek sözcüğüne kopyalar.
  • "PUSH BX" yürütüldüğünde, SP 0xF81C'ye ayarlanır ve BX, 0x1F81C'ye kopyalanır.

Bu, PUSH'nin nasıl çalıştığını gösterir. Genellikle, çalışan program, yazmaçların mevcut değerlerini değiştirebilecek bir yordamı çağırmak gibi başka amaçlar için yazmaçları kullanmak için kayıtları yığına iter. Yığın içinde depolanan değerleri geri yüklemek için, program aşağıdaki gibi makine talimatları içermelidir:

POP BX
POP AX
  • POP BX 0x1F81C'deki kelimeyi (BX'in eski değeri) BX'e kopyalar, sonra SP'yi 2 artırır, SP artık 0xF81E'dir.
  • POP AX 0x1F81E'deki kelimeyi AX'e kopyalar, sonra SP'yi 0xF820'ye ayarlar.

Yığın motoru

Daha basit işlemciler, yığın işaretçisini normal bir donanım kaydında saklar ve değerini değiştirmek için aritmetik mantık birimini (ALU) kullanır. Tipik olarak push ve pop , yığın işaretçisini ayrı ayrı eklemek / çıkarmak ve bellekte yükleme / depolamayı gerçekleştirmek için birden çok mikro işlem olarak çevrilir .

Daha yeni işlemciler, yığın işlemlerini optimize etmek için özel bir yığın motoru içerir . Pentium M , yığın motorunu tanıtan ilk x86 işlemcisiydi. Uygulamasında, yığın işaretçisi iki yazmaç arasında bölünmüştür: 32 bitlik bir kayıt olan ESP O ve yığın işlemleriyle doğrudan güncellenen 8 bitlik bir delta değeri olan ESP d . PUSH, POP, CALL ve RET işlem kodları doğrudan ESP d yazmacıyla çalışır . ESP d dolmak üzereyse veya ESP kaydı diğer talimatlardan referans alınıyorsa (ESP d ≠ 0 olduğunda), ALU kullanarak ESP O'yu güncelleyen ve ESP d' yi 0'a sıfırlayan bir senkronizasyon mikro işlemcisi eklenir. Bu tasarım büyük ölçüde kalmıştır. ESP O 64 bite genişletilmesine rağmen, daha sonraki Intel işlemcilerinde değiştirilmemiştir .

AMD K8 mikro mimarisinde Intel'inkine benzer bir yığın motoru da benimsendi . Gelen Buldozerin , senkronizasyon mikro ops olan ihtiyaç ortadan kaldırılmış, ancak yığın motorun iç tasarım bilinmemektedir.

Notlar

Referanslar