Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
1
8086 Programlama – Kısım III Prosedürler
Mikroişlemciler 8086 Programlama – Kısım III Prosedürler
2
Prosedürler Prosedür (Procedure), belli bir işi gerçekleştirmek için programınızdan çağırabildiğiniz kod parçasıdır (C programlama dilindeki fonksiyonları hatırlayınız) Prosedürler, programlarınızın daha yapısal olmasını ve kolay anlaşılır olmasını sağlarlar. Genellikle prosedürler, gerekli işlemleri gerçekleştirdikten sonra çağrıldıkları noktaya geri dönerler.
3
Prosedür yapısı isim PROC ; prosedür kodu RET isim ENDP
İsim: prosedürün ismi Aynı isim, prosedürün hem üstünde hem de altında yer almalıdır.
4
Prosedür örneği SUMS PROC ADD AX, BX ADD AX, CX ADD AX, DX RET SUMS ENDP
5
Yapı hakkında bazı notlar
Bildiğiniz gibi, RET komutu, işletim sistemine dönmek için kullanılır. Aynı komut, prosedürden dönmek için de kullanılır (aslında, işletim sistemi, sizin programınızı da özel bir prosedür olarak görmektedir) PROC ve ENDP komutları ise, compiler tanımlamalarıdır. Gerçekte makine koduna dönüştürülmezler. Compiler, prosedürlerin adreslerini hatırlar.
6
Prosedür çağrısı CALL komutu, prosedür çağrıları için kullanılır.
Örnek: ORG 100H MOV AX,1 CALL m1 MOV AX, 2 RET ; işletim sistemine dön. m1 PROC MOV BX, 5 RET ; çağrıyı yapan kısma dön. m1 ENDP END
7
CALL ve RET CALL komutu ile, dönüş adresi yığın bölümünde saklanır.
RET komutu ile ise, yığın bölümünde saklanan adres alınır ve IP içerisine atanır. Prosedürlerin sonuna RET komutu yerleştirmeyi unutmayın! Prosedürünüzün içerisinde birden fazla RET komutu yerleştirebilirsiniz (C programlama dilindeki return komutu gibi).
8
Prosedüre parametre göndermek
Prosedürlere parametre göndermek için birkaç yol vardır. En kolay yoll, register’ların kullanılmasıdır Parametreleri register’lara yerleştirin ve prosedürü çağırın Prosedür, bu register’ları kullanacak şekilde dizayn edilmelidir. Başka bir yol da yığın bölümünü kullanmaktır Parametreleri yığın bölümüne atın ve prosedürü çağırın Prosedür, parametreleri yığın bölümünden çekecek biçimde dizayn edilmelidir Her iki yolda da, programlayıcı, prosedürün genel yapısını bilmelidir.
9
Örnek ORG 100h MOV AL, 1 MOV BL, 2 CALL m2 RET ; işletim sistemine dön. m2 PROC MUL BL ; AX = AL * BL. RET ; çağrıyı yapan kısma dön. m2 ENDP END
10
Örnek hakkında Program, 24’ü hesaplamaktadır.
Prosedür, parametreleri AL ve BL’den almaktadır; onları çarpmaktadır, sonucu ise AX’te saklamaktadır. C programlama eşiti, aşağıdaki gibi düşünülebilir: short m2(char al, char bl) { short ax = al * bl; return ax; }
11
Örnek: Araştırma (Searching)
Word array’inde bulunan sayılar arasından bir sayıyı arayan bir prosedür yazınız. Prosedür, SI register’ından, array’in başlangıç adresini alacaktır. Aranacak sayı ise BX register’ında bulunmaktadır. Array içerisinde bulunan eleman sayısı ise CX register’ında bulunmaktadır. Prosedür, bulunan sayının offset değerini DI register’ında saklayacaktır. Eğer sayı bulunamaz ise, DI’ın değeri 0 olacaktır.
12
Çözüm (Sayfa 1) include emu8086.inc ORG 100H ; 2500H … 2514H arasına veri yerleştir MOV SI, 2500H MOV AX, 10 MOV CX, 10 LOOP1: MOV [SI], AX INC SI DEC AX LOOP LOOP1
13
Çözüm (Sayfa 2) ; Parametreleri set et: MOV SI, 2500H ; start address MOV CX, 10 ; number of elements MOV BX, 1 ; number to be searched ; Prosedürü çağır: CALL FIND ; Sayının bulunup bulunmadığını kontrol et: CMP DI, 0 JNE NUMFOUND PRINT 'The number is not found' RET NUMFOUND: PRINT 'The number is found.'
14
Çözüm (Sayfa 3) FIND PROC L1: MOV AX, [SI] ; array’den sıradaki elemanı oku CMP AX, BX ; AX’deki sayı ile karşılaştır JE FOUND ; Bulundu ise, FOUND bölümüne atla INC SI ; Bulunmadı ise, sıradaki elemanı kontrol et INC SI ; Word array’i olduğu için, SI 2 arttırılmalıdır. LOOP L1 ; Bu satıra gelindi ise, array içerisinde sayı bulunamamış demektir: JMP NOTFOUND FOUND: MOV DI, SI ; SI’ı, DI’a kopyala ve geri dön RET NOTFOUND: MOV DI, 0 ; DI’a sıfır’ı kopyala ve geri dön FIND ENDP
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.