Bilgisayar Mimarisi Yığın ve Alt Programlar

YIĞIN ve ALTPROGRAMLAR

Amaç: Bu uygulamada; yığın (stack) üzerinde yapılan işlemler, altprogramların (subrotine) yazılması ve çağırılması tanıtılacaktır. Bu programlarda özellikle geri dönüş adresinin yığında ne şekilde yer aldığı ve altprogramlara parametre aktarımının nasıl yapıldığı incelenecektir. Uygulamadan önce, altprograma dallanmayı sağlayan BSR, JSR komutları, altprogramdan geri dönüşü sağlayan RTS komutu ve yığına adres yazmayı sağlayan PEA komutu incelenmelidir.

Ön Bilgi: Yığın (stack); belleğin “son giren ilk çıkar” (Last In First Out – LIFO) prensibine göre kullanılmasıdır. Yığın olarak tanımlanan bellek bölgesine yazılan veriler yazıldıkları sıranın tersine göre okunurlar (İlk yazılmış olan veri en son okunur). MC68000 mikroişlemcisinin A7 adres saklayıcısı aynı zamanda yığın işaretçisidir. Yığına veri yazmak ve yığından veri okumak için özel komutlar (push, pull gibi) yoktur. Örneğin D0 saklayıcısının  içeriğini yığına yazmak için MOVE.W D0,-(A7) komutu kullanılır. Bu komuttan da anlaşıldığı gibi yığın azalan adreslere doğru ilerlemektedir. Bu işlemin tersi olarak yığındaki veriyi D0 saklayıcısına almak için MOVE.W (A7)+,D0 komutu kullanılır. Yığının önemli bir kullanım yeri de altprogramlara gidilirken dönüş adresinin saklanmasıdır. JSR veya BSR komutu çalıştırıldığında bir sonraki komutun adresi (altprogramdan sonra geri dönülecek yer)  yığında saklanır. Altprogramın sonunda RTS komutu yürütüldüğünde ise yığındaki geri dönüş adresi program sayacına (program counter – PC) yüklenir ve ana program kaldığı yerden devam eder. Bu nedenle altprogramın içinde yığın kullanılırken dikkatli olunmalıdır. Altprogramın sonuna gelindiğinde yığın işaretçisi geri dönüş adresine işaret etmelidir. Aksi durumda ana programa geri dönmek mümkün olmaz.

Özet olarak, altprogram çağrılarında yığın kullanımının 4 temel işlevi vardır:

1. Geri dönüş adresinin saklanması
2. Saklayıcıların değerlerinin korunması
3. Parametre aktarımı
4. Yerel değişkenlerin tanımlanması

Altprograma parametreler yığın üzerinden iki farklı şekilde aktarılabilir:

a) Parametrelerin değerleri aktarılır (call by value),
b) Parametrelerin adresleri aktarılır (call by reference).

İkinci yöntemin birinciye göre bazı üstünlükleri vardır. Özellikle dizi (array) gibi büyük boyutlu verilerin sadece adreslerinin aktarılması yer ve zaman tasarrufu sağlar. Diğer bir yararı ise adresi gönderilen verinin altprogramda değiştirilebilmesidir.

Örnek 7.1:
Örnek 7.1’de bir altprograma yığın üzerinden parametre gönderilmesi gösterilmiştir. Örneğin anlaşılır olması için sadece iki sayıyı toplayan basit bir altprogram seçilmiştir. Ana programda sayı1 daha sonra da sayı2 yığına yazılmaktadır. Ardından topla adlı altprogram çağırılır.  Altprogram kendisine yığın üzerinden gönderilmiş olan iki sayıyı toplar ve sonucu d0  saklayıcısına yazarak ana programa döner. Ana program d0’daki sonucu sonuc adlı bellek gözüne yazar. Burada dikkat edilmesi gereken nokta, altprogramda parametreleri yığından okurken yığın işaretçisinin gösterdiği yeri (geri dönüş adresi) bozmamaktır. Topla adlı altprogramın başında 1.parametre (sayı2) yığın işaretçisi a7’nin gösterdiği adresin 4 ilerisinden okunmaktadır. O anda yığın işaretçisi 4 sekizli uzunluğundaki geri dönüş adresine işaret etmektedir. Bu nedenle 4(a7) adresleme modu kullanılmıştır. İkinci parametreye  erişmek için ise a7’nin 6 ilerisine gitmek gerekir. Altprogramın gelindiğinde yığının durumu Şekil 7.1’de gösterilmiştir. Emülatör programında yığın işaretçisi A7, SP (Stack Pointer) olarak da gösterilmektedir

opt cre
org $400
start
move.l #$600,a7 ;Yığın işaretçisinin başlangıç değeri
move.w sayi1,-(a7) ;Sayı1 yığına yazıldı
move.w sayi2,-(a7) ;Sayı2 yığına yazıldı
jsr topla ;Topla adlı altprogram çağırıldı
move.w d0,sonuc ;Altprogramdan d0’da gelen sonuç belleğe yazıldı
stop #$2000
topla move.w 4(a7),d0 ;Yığın işaretçisinin 4 ilerisinden sayı2 alındı
add.w 6(a7),d0 ;Yığın işaretçisinin 6 ilerisinden sayı1 alındı
rts ;Ana programa dönüş. Toplam d0’da
sayi1 dc.w $11
sayi2 dc.w $22
sonuc ds.w 1
end start

Örnek 7.1 Altprograma yığın üzerinden parametre aktarımı

Şekil 7.1 Altprograma gelindiğinde yığının durumu

Örnek 7.2:

Örnek 7.2’de ise verilen bul_poz adlı altprogram giriş parametresi olarak bir dizinin başlangıç adresini ve dizideki eleman sayısını almakta, dizideki pozitif eleman sayısını hesaplayarak sonucu kendisine çıkış parametresi olarak gönderilen adrese yazmaktadır. Buna göre altprograma üç parametre verilmektedir: 1. Dizinin adresi (adres), 2. Dizinin boyu
(değer), 3. Sonucun yazılacağı adres (adres). Ana programda gerekli görülen yerlerde altprogram çağırılabilir. Örnekte 3 ayrı dizideki pozitif elemanların sayısı hesaplatılarak ilgili
bellek gözlerine yazılmıştır. Diziler 8 bitlik elemanlardan oluşmaktadır.

opt cre
org $400
start lea stack,a7 a7’ye stack adresi atanıyor
adda.l #30,a7 a7 stack bölgesinin sonuna işaret ediyor
move.w boy1,d0 1. dizinin boyu
pea dizi1 1. dizinin başlangıç adresi yığına
move.w d0,-(a7) 1. dizinin boyu yığına
$600
$5FF
$5FD
$5FE
$5FB
$5FC
$5F9
$5F8
$5FA
Kullanılmadı
ADRES BELLEK
$22
$04
$11
$00
$18
$00
$00
$00
SAYI1 $0011 (16 bit)
GERİ DÖNÜŞ ADRESİ $00000418 (32 bit)
SP+4 SAYI2 $0022 (16 bit)
SP
SP+6
pea sonuc1 1. sonucun adresi yığına
jsr bul_poz Altprogram çağırılıyor
adda.l #10,a7 Yığın temizleniyor
move.w boy2,d0
pea dizi2
move.w d0,-(a7)
pea sonuc2
jsr bul_poz Altprogram 2. dizi için çağırılıyor
adda.l #10,a7
move.w boy3,d0
pea dizi3
move.w d0,-(a7)
pea sonuc3 Altprogram 3. dizi için çağırılıyor
jsr bul_poz
adda.l #10,a7
stop #$2000
org $500 Altprogram $500 adresinden başlıyor
bul_poz movem.l d0/a0/a1,-(a7) Saklayıcılar yığında korunuyor
move.w 20(a7),d0 Dizinin boyu d0’a
move.l 22(a7),a0 Dizinin başlangıç adresi a0’a
move.l 16(a7),a1 Sonucun yazılacağı adres a1’e
sub.w #1,d0 DBF için sayaç 1 azaltıldı
clr.w (a1) Sonucun başlangıç değeri sıfır
loop tst.b (a0)+ Dizinin elemanları test ediliyor
bmi devam
addi.w #1,(a1) Pozitifse sonuç 1 arttırılıyor
devam dbf d0,loop
movem.l (a7)+,d0/a0/a1 Korunan saklayıcılar yığından geri alındı
rts
org $600
dizi1 dc.b 0,15,-4,11,-50 1.dizi
boy1 dc.w 5
dizi2 dc.b -5,25,-34,101,-50,45,89 2.dizi
boy2 dc.w 7
dizi3 dc.b 24,-2,-3,10,-105,-43 3.dizi
boy3 dc.w 6
sonuc1 ds.w 1
sonuc2 ds.w 1
sonuc3 ds.w 1
stack ds.b 30 Yığın için 30 byte yer ayrılıyor
end start

Benzer Yazılar
Circuit Analysis node analysis method example question
Find the current environment, the analysis of the circuit I0.
What should be the RL for maximum power transfer Answer:
Örnek1: Bir su tankının seviyelerini kontrol eden A ve B olmak üzere iki adet algılayıcı
Meslek liselerinde Elektrik-Elektronik alanında bilgisayar destekli uygulamalar dersinde kullanılabilecek 40 adet uygulama. Proteus programında İSİS
Yeni teknoloji, iki boyutlu yüzeyler üzerinde görüntü alıcıları üretilmesine kapı aralayacak. Mühendisler ışığı, tek odaklı
Thevenin analizi ile V0 geilimini bulma Çevre Akımları tekniği Maksimum ortalama güç akımlarını bulma Güç
Please follow and like us:
0

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir