  Ŀ
  Ŀ
                                                                          
                          Basic ve Assembly II                            
                                                                          
  ٳ
   PS 26  Eyll'95                                    Ahmet Szdinler      
  


> Merhaba,

      Geen ay Recep Tezkol'un balad basic ve assembly kesini bu
  aydan itibaren ben sunacam. Daha nce genel olarak bahsedilen SUB'larn
  yaps ve bunlara aktarlan parametreleri ileyerek yazmza balayalm.

        Ŀ
Ĵ SUB 
        


      Bildiiniz gibi GWBASIC'te programlar, satrlar numaral ve tek blok
  halinde yazlr. Bu trdeki programlar tepeden balar bir 'END' komutu ile
  karlaana veya son satra gelene kadar iletilir. Bu ekilde program
  yazmak, kontrol etmek ve programa ekler yapmak son derece zordur.
  Quick Basic, yapsal programlama biimiyle tm bu zorluklar ortadan
  kaldrmtr. Bu teknik ile yazlan programlar okunabilirliinin artmas,
  yerel deikenlerin kullanlmas, parametreler ile alt programlara
  deer aktarlas gibi avantajlara sahiptir. Konumuz basic'e assembly
  destei olduundan, hemen SUB'larda bizi ilgilendiren blme, Assembly
  dili ile basic iin SUB hazrlanmasna geelim.


      Assembly ile hazrlanacak bir SUB'a aktaracamz parametrelerin,
  ncelikle tipi belirtilmi olmaldr. Parametre ile SUB'a deer transferi
  yt zerinden yapld iin bu arttr. Basicte tipi belirtilmemi
  numerik deikenler SINGLE tipinde kabul edilirler. Eer tip belirtilmeden
  bir tanmlama yaplrsa en iyimser tahminle program altnda sistem
  kecektir.


   Ŀ
Ĵ Basicte tip tanmlamasnda kullanlan semboller
   

     Ŀ
      sembol    tip           uzunluk             
     Ĵ
       %       INTEGER          2                 
       &       LONG INTEGER     4                 
       !       SINGLE           4                 
       #       DOUBLE           8                 
       $       STRING           2 byte iareti   
     


   Bir deikenin tipi AS ifadesi ile de belirtilebilir.

        AS INTEGER
        AS LONG
        AS SINGLE
        AS DOUBLE
        AS STRING * 100  gibi..

>  rnek:
        DECLARE SUB ORNEK(param1%,param2&)
        DECLARE SUB ORNEK(param1 AS INTEGER, param2 AS LONG)


      Yukarda verdiim rnekte alt programa deer yerine deikenin
  adresi aktarlr. Eer SUB'a, deikenin adresi yerine deikenin ierdii
  deer aktarlmak isteniyorsa parametrelerin nne BYVAL komutu yazlmas
  gerekir.

>  rnek:
        DECLARE SUB ORNEK(BYVAL param1%,BYVAL param2&)
        DECLARE SUB ORNEK(BYVAL param1 AS INTEGER,BYVAL param2 AS LONG)



   SUB'a bir deikenin adresi aktarldnda, bu deikenin ierii
   kolaylkla deitirilir. Bu sayede SUB'n, darya deer aktarmas
   mmkn olur. Bu zellik varken, neden deikenin adresini deilde
   ierii aktarlr diye bir soru gelebilir. lk neden olarak bellek
   tasarrufunu verebiliriz. Verdiimiz rneklerde de greceiniz gibi
   her parametre iin bir ka byte fazladan harcanacaktr. kinci neden
   olarak SUB'a parametre olarak verilen deikenlerin ieriinin korunmas
   gerektii durumlar gsterilebilir.

        Geen ay verilen bir function rneini tekrar yazarak, SUB'tan
   geriye deer aktarmaya bir rnek verelim.


>  rnek:
    Ŀ
         ;SURUCU.ASM                                                       
         .model medium                                                     
         .code                                                             
         public surucu                                                     
         surucu proc   far                                                 
                arg    SUR:word = Slen                                     
                push   bp                                                  
                mov    bp,sp                                               
                push   si                                                  
                mov    ah,19h                                              
                int    21h                                                 
                xor    ah,ah                                               
                mov    si,SUR      ;SI = SUB'a aktarlan deiken adresi   
                mov    [si],ax     ;bu adrese src no konuyor.           
                pop    si                                                  
                pop    bp                                                  
                retf   Slen                                                
         surucu endp                                                       
                end                                                        
    

       Assembly dilinde yazdmz SUB' kullanan basic programmz da
   yle olacaktr.
    Ŀ
                                                                           
         DECLARE SUB surucu(sur%)                                          
                                                                           
         no%=0    'no% deikenine sfr aktardk. Bunun amac SUB'n      
                  'deikenin ieriini deitirmesini gzlemlemek iindir.
         CALL surucu(no%)                                                  
         print "Aktif src :" + chr$(no%+65)                             
                                                                           
    


       Programda surucu fonksiyonuna sur% deikenini parametre olarak
   verdik. Basic bu satr derlerken fonksiyona sur% deikeninin adresini
   aktaracaktr. Assembly ile yazdmz surucu fonksiyonunda da grlecei
   zere bu parametrenin ierii SI yazmacna alnp, daha sonra bunu bir
   iareti olarak kullanarak deikenin adresine deer aktaryor.
   Quick Basic programmzda SUB', DECLARE SUB surucu(BYVAL sur%)
   eklinde tanmlasaydk, basic sur deikeninin adresi yerine, ierdii
   deeri SUB'a aktaracakt. Bu durumda sur% deikeninin ierdii say bir
   adres olarak deerlendirilerek bu bellek alanna yazlacak ve byk bir
   ihtimalle sistemi kertecektir.



       Qbasic, assembly ile yazdmz yordamlar arabiliyor. Peki
   Qbasic iin yazlm assembly yordamlar iinden Qbasic'in komutlarna
   eriebilir mi?.

       Qbasic komutlar, burada yaptmz gibi assembly ile hazrlanm ve
   bir library'de toplanmtr. Yani bunlara erimemek iin hi bir neden
   yoktur. Ki QB 7.xx'de string'ler zerinde yapacamz ilemlerde buna
   zorunluyuz. String'ler konusuna gemeden nce QB 4.5 'ta LEN komutunu
   yazdmz assembly rutininde kullanan bir rnek vermek istiyorum.

      Qbasic 4.5 library'sinde LEN komutu B$FLEN olarak bulunmaktadr.
   Yazacamz assembly yordamnda B$FLEN fonksiyonu bulunmad iin
   bunu EXTRN (external) olarak tanmlamamz gerekiyor.

 Ŀ
      .model medium                                                        
      .code                                                                
      extrn B$FLEN : FAR             ; LEN fonksiyonu tanmlyoruz         
      Public Strlen                                                        
      Strlen proc far                                                      
      arg uz:word, str1:word = slen                                        
             push bp                                                       
             mov  bp,sp                                                    
             push bx                                                       
             mov  ax,str1            ; string iaretisi len fonksiyonuna  
             push ax                 ; parametre olarak aktarlyor.       
             call B$FLEN             ; uzunluk AX'te dner.                
             mov  bx,uz              ; BX= uz deikeninin adresi          
             mov  [bx],ax            ; bu adrese uzunluk konur.            
             pop  bx                                                       
             pop  bp                                                       
             retf slen                                                     
      Strlen endp                                                          
             end                                                           
                                                                           
 


       Yazdmz bu program hi bir ie yaramad aktr. Ama QB'de
   i fonksiyonlara eriimi rneklemektir. QB 4.5 'ta bir string'in
   uzunluunu herhangi bir fonksiyona ihtiya duymadan, kolaylkla elde
   edilebilir. imdi strlen SUB'n basicte kullarak bir program yazalm.

    Ŀ
                                                                       
       DECLARE SUB StrLen(A$,uz%)                                      
                                                                       
       Ahmet$= " Bu rnek LEN fonksiyonu ile ayni ileve sahiptir."    
       uzunluk%=0                                                      
                                                                       
       StrLen Ahmet$, uzunluk%                                         
                                                                       
       print uzunluk%                                                  
                                                                       
    


        Basic'in fonksiyonlarnn isimlerini nereden bulunacan merak
   edenlere kk bir tyo.. (bu bilginin kayna Sevgili Grol Demir.)
   Yazdnz basic programlarn ASCII olarak kaydedip;

           BC.EXE /A  ornek.BAS,,ornek.ASM
   eklinde derlediinizde, basic programnzn Assembly kodunuda elde
   edeceksiniz. Elde edilen assembly kod, bir assembler ile derlenmeyecek
   ekilde olduunu, yanlz retilen kod hakknda bilgi verdiini unutmayn.


                             - Devam edecek -
adres:

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