Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
1
8086 Programlama – Kısım IV Stack’ler, Makro’lar
Mikroişlemciler 8086 Programlama – Kısım IV Stack’ler, Makro’lar
2
İçerik Stack’ler Makro’lar
3
Stack Stack: geçici verilerin tutulduğu bir hafıza alanıdır
Stack, CALL komutu tarafından, geri dönüş adresinin saklanması için çağrılır. RET komutu, stack’ten bu adresi alır. Stack, diğer verilerin geçici olarak saklanması için de kullanılabilir. Stack ile çalışan iki adet komut bulunmaktadır: PUSH - 16 bitlik bir veriyi stack’e yazar. POP -16 bitlik veriyi stack’ten okur.
4
PUSH PUSH komutunun yapısı: REG: AX, BX, CX, DX, DI, SI, BP, SP
PUSH REG PUSH SREG PUSH hafıza PUSH ivedi (80186 ve sonrası işlemcilerde desteklenir) REG: AX, BX, CX, DX, DI, SI, BP, SP SREG: DS, ES, SS, CS hafıza: [BX], [BX+SI+7], 16 bit değişken, vb. ivedi: 5, -24, 3Fh, b, vb.
5
POP POP komutunun yapısı: REG: AX, BX, CX, DX, DI, SI, BP, SP
POP REG POP SREG POP hafıza REG: AX, BX, CX, DX, DI, SI, BP, SP SREG: DS, ES, SS, (CS hariç) hafıza: [BX], [BX+SI+7], 16 bit değişken, vb.
6
LIFO Stack, LIFO (Last In First Out – Son Giren İlk Çıkar) algoritmasını kullanır. Bunun anlamı şudur: Eğer 1, 2, 3, 4, 5 değerlerini stack’e yazar isek, ilk önce 5, sonra 4, sonra 3, sonra 2, sonra 1 çıkar.
7
Stack’i kullanmak Aynı sayıda push ve pop komutu kullanmak önemlidir. Aksi durumda, stack kullanılamaz duruma gelebilir ve işletim sistemine dönmek imkansız hale gelebilir. PUSH ve POP komutları, özellikle, kullanmaya hazır register sayısı az olduğu durumlarda çok işe yarar: Orijinal değer stack’e kaydedilir. Register, başka amaçlar için kullanılır. Stack’ten register’da bulunan orijinal değer geri yüklenir.
8
Basit bir stack örneği ORG 100h MOV AX, 1234h PUSH AX ; AX değerini stack’e yaz. MOV AX, 5678h ; AX değerini değiştir. POP AX ; AX’in orijinal değerini geri yükle. RET END
9
Stack kullanarak değer değiştirmek
ORG 100h MOV AX, 1234h ; AX’e 1234h kaydet. MOV BX, 5678h ; BX’e 5678h kaydet. PUSH AX ; AX değerini stack’te kaydet. PUSH BX ; BX değerini stack’te kaydet. POP AX ; BX’in orijinal değerin AX’e kaydet. POP BX ; AX’in orijinal değerini BX’e kaydet. RET END
10
SS ve SP Stack hafıza alanı, SS (Stack Segment) ve SP(Stack Pointer) register’ları ile belirlenir. Genellikle, işletim sistem, bu register’ların ilk değerlerini, program başladığında atar. Halihazırda SS:SP ile gösterilen adrese, stack’in başlangıç adresi ismi verilir. COM dosyaları için, stack segment, kod segment’i ile aynıdır. Ayrıca, SP 0FFFEh olarak atanır. SS:SP adresinde, programın sonundaki RET komutunun döneceği adres belirtilmiştir. Stack işlemlerini, emülatör penceresinde [Stack] yazılı butona basarak görebilirsiniz. Stack’in başlangıç adresi, "<" işareti ile gösterilir.
11
PUSH ve POP "PUSH kaynak" komutu aşağıdaki işlemleri gerçekleştirir:
SP register’ının değerini 2 azalt. Kaynak‘ta belirtilen değeri, SS:SP adresine yaz. "POP hedef" komutu aşağıdaki işlemleri gerçekleştirir: SS:SP’de bulunan değeri, hedef’e yaz. SP register’ının değerini 2 arttır.
12
Stack’in ilk durumu (Stack’in başlangıç adresi) SP FFFF AX 1234H FFFE
BX 5678H FFFD FFFC FFFB FFFA … SS 0000
13
PUSH AX komutundan sonra
FFFF AX 1234H FFFE BX 5678H (Stack’in başlangıç adresi) SP 12 FFFD 34 FFFC FFFB FFFA … SS 0000
14
PUSH BX komutundan sonra
FFFF AX 1234H FFFE BX 5678H 12 FFFD 34 FFFC (Stack’in başlangıç adresi) SP 56 FFFB 78 FFFA … SS 0000
15
POP AX komutundan sonra
FFFF AX 5678H FFFE BX 5678H (Stack’in başlangıç adresi) SP 12 FFFD 34 FFFC 56 FFFB 78 FFFA … SS 0000
16
POP BX komutundan sonra
(Stack’in başlangıç adresi) SP FFFF AX 5678H FFFE BX 1234H 12 FFFD 34 FFFC 56 FFFB 78 FFFA … SS 0000
17
Makro’lar Makro’lar prosedürler gibidir. Aslında tam olarak aynı değillerdir. Makro’lar, prosedürler ile aynı görünürler, ancak sadece kodunuz compile edilene kadar bulunurlar. Compile edildikten sonra, tüm makro’lar, gerçek komutlar ile değiştilirler. Eğer bir makro tanımlanmış fakat kodunuzda hiç kullanılmamış ise, compiler o makro’yu ihmal edecektir.
18
Macro Tanımı isim MACRO [parametreler,...] <komutlar> ENDM
19
Prosedürlerin aksine, makro’lar, kodun üst kısmında tanımlanırlar.
MyMacro MACRO p1, p2, p3 MOV AX, p1 MOV BX, p2 MOV CX, p3 ENDM ORG 100h MyMacro 1, 2, 3 MyMacro 4, 5, DX RET Soldaki kod, aşağıdaki şekle dönüşür: MOV AX, 00001h MOV BX, 00002h MOV CX, 00003h MOV AX, 00004h MOV BX, 00005h MOV CX, DX
20
Makro’lar ve Prosedürler
Prosedürü çağırmak gerektiğinde, CALL komutu kullanılmalıdır, örneğin: CALL MyProc Makro kullanılacağı zaman, sadece ismini yazmak yeterlidir. Örneğin: MyMacro Prosedürlere parametre göndermek için, stack veya genel amaçlı register’lar kullanılmalıdır. Makrolara parametre göndermek için, makro isminden sonra yazılmaları gereklidir. Örneğin: MyMacro 1, 2, 3
21
Makro’lar ve Prosedürler
Makro’lar ENDM ile Prosedürler ise ENDP ile bitirilirler. Prosedürler, belirli bir hafıza adresinde bulunurlar, ancak makro’lar ise, program içerisinde bir koda dönüştürülürler.
22
Makro’lardaki etiketler
Makro’lar, kod içerisinde aynen dönüştürülürler. Bu yüzden, eğer makro tanımı içerisinde etiket bulunur ve makro birden fazla kullanılır ise, "Duplicate declaration" (Çoklu tanımlama) hatası alınabilir. Bu problemin önüne geçmek için, LOCAL komutundan sonra, değişkenler, etiketler veya prosedür isimleri kullanılabilir.
23
Örnek MyMacro2 MACRO LOCAL label1, label2 CMP AX, 2 JE label1 CMP AX, 3 JE label2 label1: INC AX label2: ADD AX, 2 ENDM ORG 100h MyMacro2 RET
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.