  Ŀ
  Ŀ
                                                                          
                          Basic ve Assembly III                           
                                                                          
  ٳ
   PS 27  Ekim'95                                     Ahmet Szdinler      
  



         Geen ay Quick Basic'te SUB'lar inceledik. Verdiimiz rneklerde
  parametrelerin kullanlmas basit bir ekilde akladk. Bu yazmzda
  konuyu biraz daha aarak iin temeline ineceiz.

         Basic'in araca assembly fonksiyon ve alt programlar far
  trndendir. Bunlar CALL FAR komutu ile arlr, RETF ile geri dnlr.
  CALL FAR komutu dn adresini (segment ve offset) stack'a push eder ve
  geici dallanmay gerekletirir. RETF komutu stack'tan dn adresini
  CS ve IP yazmalarna pop ederek geri dnmeyi salar. Bu ilem, parametresi
  olmayan bir assembly rutin arldnda stack'ta u ekilde bir deiime
  neden olur.

                          <16 bit>
                     min.Ĵ
                             ....bo...       
                         Ĵ
                            dn offset'i     <- SP
                         Ĵ
                            dn segment'i   
                     max.

         Bu ay iin temeline ineceimizi syledik. O halde burada bir parantez
  aarak STACK nedir, nasl kullanlr? sorularna cevap arayalm.
         Stack iin zetle, bilgilerin geici olarak sakland srasal
  eriimli bellek blou denilebilir. Dikkat ederseniz SIRASAL eriimli
  diyoruz, nk stack'tan normal artlarda belli bir kurala gre
  yararlanlr. Kuralmz ok basit, son giren ilk kar(Last In, First Out).
  Stack, yap olarak bir birini takip eden word'lerden oluur. Buna gre
  stack'tan yararlanlrken bilgiler word dzeyinde deerlendireceiz.

         Stack'n bellekteki yerini SS (Stack Segment) ve en son girilen
  bilginin stack zerindeki konumunu da SP (Stack Pointer) yazmac tutar.
  Stack Pointer'n ilk konumu STACK blounun en yksek hcresini iaret
  edecek ekildedir. Stack'a bilgi girildike SP'nin deeri 2 azalr,
  bilgi alndka SP'nin deeri 2 artar.  Bunu bir rnek ile gsterelim.

                     STACK'n kullanmdan nceki durumu
                      min.Ŀ
                              ....bo....      
                          Ĵ
                              ....bo....      
                          Ĵ
                              ....bo....      
                          Ĵ
                              ....bo....       <-SP
                      max.


  Geen ay verdiimiz SUB surucu(sur%) yordam arldnda yukarda
  verdiimiz stack'ta meydana gelen deiimi srasyla inceleyelim.
  nce alt programa geireceimiz bilgiyi stack'a koyacaz. Alt programmz
  altnda bu bilgiyi buradan alacak ve deerlendirecektir.

                      min.Ŀ
                              ....bo....      
                          Ĵ
                              ....bo....      
                          Ĵ
                                  sur%          <- SP  (-2)
                          Ĵ
                              ....bo....       SP'nin ilk konumu
                      max.


  Yazmzn banda da sylediim gibi Basic'te alt programlar Far
  trndendir. Bu nedenle geri dnn mmkn olabilmesi iin Code
  segment(CS)'in stack'a konmas gerekir.


                      min.Ŀ
                              ....bo....      
                          Ĵ
                              ....bo....      
                          Ĵ
                          CS yazmacnn deeri  <- SP  (-2)
                          Ĵ
                                  sur%                 (-2)
                          Ĵ
                              ....bo....       SP'nin ilk konumu
                          

  Yukarda da grlecei zere STACK'a bir deer girdiimizde SP, 2 eksilerek
  bir nceki hcreye konumlanyor ve burada deer saklanyor. Code segmentin
  adresi saklandktan sonra geri dnn yaplaca offset'te stack'a
  srlr.
                      min.Ŀ
                              ....bo....      
                          Ĵ
                          IP yazmacnn deeri  <- SP  (-2)
                          Ĵ
                          CS yazmacnn deeri         (-2)
                          Ĵ
                                  sur%                 (-2)
                          Ĵ
                              ....bo....       SP'nin ilk konumu
                      max.

  Alt programa geirilecek parametre ve dn iin gerekli adresler stack
  zerinde sakland ve alt programn bulunduu adrese dallanma yapld.
  Hatrlarsanz alt programmzn ilk satr, 'push   bp' idi. Bu komut
  BP yazmacnn ierdii deeri stack'a srer.

                          Ŀ
                                ...bo...      
                          Ĵ
                          BP yazmacnn deeri  <- SP  (-2)
                          Ĵ
                          IP yazmacnn deeri         (-2)
                          Ĵ
                          CS yazmacnn deeri         (-2)
                          Ĵ
                                  sur%                 (-2)
                          Ĵ
                              ....bo....       SP'nin ilk konumu
                      max.

  Programmzn ikinci satr 'mov    bp,sp', yani SP'nin deerini BP
  yazmacna aktaryoruz. Bundan sonra stack'ta meydana gelen deiimler
  bizi ilgilendirmiyor. nk Stack'n son durumunu BP yazmacna aktardk.
  Stack zerindeki bir bilgiye erimek iin BP yazmacndaki deeri taban
  olarak kullanacaz.

                mov    si,[bp+6]

  Bu satr ile 'sur%' deikeninin stack'ta saklanan adresi SI yazmacna
  alnr. Yukardaki son tabloyu incelediinizde SP'nin iaret ettii
  nokta ile sur% deikeninin adresinin bulunduu nokta arasnda 3 tane
  (-2) vardr. Buna gre [BP+6] ile alt programn parametresine eriiriz.
  Alt programdan geri dn RETF komutu ile olur. Bu komutu kullanmadan
  nce stack'a girilmi bilgileri geri alarak stack' dzenlememiz gereklidir.
  Stack' deitirecek en son kullanlan komut 'Push BP'idi. Bu komutun tam
  tersini yapan 'Pop BP' komutunu kullandmzda;


                          Ŀ
                                ...bo...      
                          Ĵ
                          BP yazmacnn deeri 
                          Ĵ
                          IP yazmacnn deeri  <- SP  (-2)
                          Ĵ
                          CS yazmacnn deeri         (-2)
                          Ĵ
                                  sur%                 (-2)
                          Ĵ
                              ....bo....       SP'nin ilk konumu
                      max.


  SP'nin iaret ettii hcredeki deer BP'ye aktarlr ve SP yazmacna 2
  ilave edilerek SP'nin bir sonraki hcreyi iaret etmesi salanr. Artk
  Stack alt programa dallanldndaki durumundadr. Geri dn iin
  RETF komutunu kullandmzda nce sradaki deer IP yazmacna pop edilir
  ve SP 2 arttrlr. Daha sonra ayn ilem tekrar ederek CS yazmacna
  yeni deeri verilerek geri dnlm olur.


                          Ŀ
                                ...bo...      
                          Ĵ
                          BP yazmacnn deeri 
                          Ĵ
                          IP yazmacnn deeri 
                          Ĵ
                          CS yazmacnn deeri 
                          Ĵ
                                  sur%          <- SP  (-2)
                          Ĵ
                              ....bo....       SP'nin ilk konumu
                      max.


  Alt programdan kp, geri dndk ama SP ilk konumuna gelmedi. Bu bir
  hatadr ve mutlaka program kontrol d kalarak kilitlenecektir. Peki
  ayn anda hem geri dn adreslerini CS:IP yazmalarna koyacak, hemde
  SP yazmacn ilk konumuna getirecek bir komut var m?
  Bunun iin yine RETF komutunu kullanrz ama yanna bir parametre ekleyerek.
  RETF komutunun yanna ekleyeceimiz parametre, geri dn yapldnda
  SP yazmacna eklenecek saydr. Eer STACK'a bir parametre konulmu ise
  'RETF 2' komutu hem geri dn salayacak, hemde SP'yi ilk konumuna
  tayacaktr.

  Gelecek ay tekrar birlikte olmak dileiyle, Sayglar ve sevgiler.

  
adres:

  PC World/Trkiye
  PS "Basic ve Assembly"
  Eski Bykdere cad.
  Sanayi mah. Behet sokak
  No:25/B  Kat:5
  80650 4.Levent / STANBUL