  Ŀ
  Ŀ
                                                                          
                   "Recep'in Kesi"  Basic ve Assembly                  
                                                                          
  ٳ
   PS 25  Austos'95                                 Recep Tezkol          
  
 

> Merhaba Dostlar,


     Bilgisayar denilen makinalar bilgilerini saymak iin elektrie muhtatr.
  Eer Trkiyede hatta orluda yayorsanz ve takviminiz 23 temmuzu, saatiniz 
  sabahn 06:30'unu gsteriyorsa, bilgisaymaznz banda TEK'in cevap vermez
  telefonuna hal hatr sormaktan yorgun deceinize eminim. Bu durumda derin 
  bir nefes alp sakinlein ve babadan kalma kalem-kat bilgi sayarnzn 
  bana geiniz. 

    Efendim, bu ay Basic programclarnn srarlarna dayanamayp, yeni bir
  yaz dizisine baladk. Dizimizin ad, Basic ve Assembly. Bu kede eski
  dost Basic'e assembly destei vermeye alacaz.
    Basic'in sahip olduu komut seti normalde yeterlidir. Hz gerektiren ve
  sisteme ynelik baz programlarda destee ihtiya duyulur. Aslnda tm
  yksek seviyeli dillerin sorunudur bu. Yazmzn amac assembly retmekten
  ok basic'te assembly kullanmak olacan hatrlatmak isterim. Bu nedenle 
  vereceim bilgilerden yararlanabilmek iin azda olsa assembly bilmek 
  gereklidir. Assembly bilmeyen ve renmek istemeyenler verdiimiz rnek 
  programlar alarak programlarnda kullanabilir ve istedikleri zel bir 
  fonksiyon varsa bunlar bize bildirebilirler.

  

                        Basic ve Assembly  yaz dizisi 

                                     -I-
     
     Assembly rneklere gemeden nce elimizde bulunmas gereken programlar 
  listeyelim.
  
   Basic programlarn derleyeceimiz  Quick basic 4.xx veya 
    Quick basic 7.xx derleyicisi.
    
   Assembly'de yazacamz fonksiyonlar bir library'de toplamak iin 
    kullanacamz  Lib.exe program.

   QuickBasic yorumlaycs ile kullanacamz quicklibrary oluturmak 
    iin Link.exe program.
  
   Basic iin yazdmz assembly fonksiyonlar derlemek iin
    Tasm.exe program. 


     Assembly dilinde yazdmz bir fonksiyonu basic programmz ile 
  birletirmek iin dos komut satrnda yapacamz ilemler aada 
  verilmitir.


 QuickBasic 4.5 
  
  TASM.EXE  ornek.asm  /m   <
lem sonucu elde edilen dosya : ORNEK.OBJ 

  LIB.EXE   ornek.lib + ornek.obj; <
lem sonucu elde edilen dosya : ORNEK.LIB 

  LINK.EXE  /Q ornek.lib,ornek.qlb,,bqlb45.lib; <
lem sonucu elde edilen dosya : ORNEK.QLB 

  QB.EXE    /L ornek.qlb <


 QuickBasic 7.xx 

  TASM.EXE   ornek.asm /m   <
lem sonucu elde edilen dosya : ORNEK.OBJ 
  
  LIB.EXE    ornek.lib + ornek.obj; <
lem sonucu elde edilen dosya : ORNEK.LIB 
  
  LINK.EXE   /Q ornek.lib,ornek.qlb,,qbxqlb.lib; <
lem sonucu elde edilen dosya : ORNEK.LIB 
  
  QB.EXE     /L  ornek.qlb <


     Derleme ilemini her rnekte tekrarlayarak gereksiz yer ve zaman 
  kaybetmektense, derleme iini bir batch dosya ile yapmak daha doru 
  olacaktr. Dos komut satrndan aadakileri girerek bir derle.bat 
  oluturalm. Ben denemelerim iin QB 4.5 kullanyorum. bu nedenle  yn
  dosyasnn 3. satrnda bqlb45.lib bulunuyor. Sizin kullandnz 
  derleyici farkl ise bu satrda gerekli deiiklii yapnz.
  
            Ŀ
             COPY CON DERLE.BAT                           
             tasm %1                                      
             lib PSBAS.lib + %1.obj ;                     
             link /Q PSBAS.lib,BSBAS.qlb,,bqlb45.lib;     
             ^Z   (burada F6 tuuna basnz..)            
             

  Derle.bat dosyasna parametre olarak, yazdmz assembly programn adn 
  (uzants yazlmadan) vererek PSBAS.LIB ve PSBAS.QLB dosyalarn elde 
  edebiliriz. Bundan sonra derle.bat ile derlenecek her assembly program 
  pcbas ktphanesine ilave edilecektir. Yazacamz rnek basic programlarn
  QuickBasic'i  QB /l PSBAS ile altrarak yazabiliriz.
  
     Quick Basic editr (yorumlaycs)  altrlrken /L parametresiyle 
  verilen quicklibrary(.QLB) dosyasn bellee ykler. 
  Basic iinde bir sub veya function yazdmzda ve bu alt programlar 
  kullanldnda, rutin otomatik olarak programn bana DECLARE edilir. 
  Assembly ile yazdmz alt programlar iin bu ilem programcya 
  braklmtr. Buna gre, yklenen quicklibrary 'de bulunan ve kullanlacak 
  alt programlar basic programnzn bana DECLARE etmeniz gerekir.

> RNEK:
                     Ŀ
                         DECLARE SUB bip()       
                         CALL bip                
                         END                     
                      


     Basic iin yazlan assembly programlar iin bir kalp vermek mmkndr 
  ve aada buna bir rnek verilmitir. Basic iin yazlacak assembly 
  programda dikkat edilecek hususlarn banda, kullanlan yazmalarn 
  ieriinin korunmas gelir. Yazdnz ASM programda kullandnz 
  yazmalarn ieriini nceden saklayp programn icras sona erdiinde 
  bunlar eski haline getirip yle dn yaplmaldr.Ki bu kesinlikle
  uyulmas gereken bir kuraldr..

> BASIC N ASSEMBLY PROGRAM KALIBI:
      Ŀ
        .model  medium                             
        .data                                      
        .code                                      
        public  ornek                              
        ornek   proc    far                        
                push    bp                         
                mov     bp,sp                      
        .....                                      
        .....                                      
                pop     bp                         
                retf                               
        ornek   endp                               
                end                                
       




                      lk Assembly programmz yazyoruz.



     lk programmz basit hatta basic'te olan bir komutun benzeridir. 
  Bu rneimizin ad bip. letildiinde bilgisayarn hoparlrnden ksa bir 
  ddk sesi verir. Yani basicteki BEEP komutunun edeeri.. Yazacamz bu 
  assembly alt programa bip.asm ad veriyor ve yazmaya balyoruz.

> BIP.ASM
      Ŀ
        .model  medium                                               
        .code                                                        
        public  bip                                                  
        bip     proc  far                                            
                push  dx      ;DX kullanld iin saklanr.        
                mov   ah,2    ;MSDOS karakter bas fonksiyonu.        
                mov   dl,7    ;zil sesinin ascii kodu                
                int   21h     ;MSDOS kesmesi arlyor.  biiip...  
                pop   dx      ;saklanan deer DX'e aktarlr.        
                retf          ;geri dn..                          
        bip     endp                                                 
                end                                                  
       


     Assembly programmz bitti, artk bu program yukarda verdiimiz 
  bilgiler nda derleyip basic programmz ile kullanabiliriz.
  
  TASM.EXE  bip.asm  /m   <
  LIB.EXE   bip.lib + bip.obj; <
  LINK.EXE  /Q bip.lib,bip.qlb,,bqlb45.lib; <
  QB.EXE    /L bip.qlb <
veya 
  DERLE bip
  QB.EXE    /L PSBAS.QLB

  QuickBasic editr ekrana gelince aadaki basic program yazarak  F5 tuu
  ile altralm.

> BIP.BAS  
                     Ŀ
                         DECLARE SUB bip()       
                         CALL bip                
                         END                     
                      
  
  Bip(), hi bir parametreye sahip olmayan basit bir alt programdr. 
  imdi de bir fonksiyon yazalm. Fonksiyonumuz bize bellein uzunluunu
  Kbyte cinsinden versin. 
  
> BELLEK.ASM
      
      Ŀ
        .model  medium                                               
        .code                                                        
        public  bellek                                               
        bellek  proc    far                                          
                push    es           ;ES kullanlaca iin saklanr 
                xor     ax,ax        ;AX=0                           
                mov     es,ax        ;ES=Bios data alannn segmenti 
                mov     ax,es:[413h] ;AX=bellek bykl            
                pop     es           ;ES=eski deeri                 
                retf                 ;geri dn.                    
        bellek  endp                                                 
                end                                                  
       

     Dikkat ettiyseniz bellek fonksiyonunu yazdmz assembly programda 
  bellein uzunluunu  AX yazmacna aktarlarak dn yapld. Basic 
  programmzda bu deer,  bellek%() fonksiyonu bir integer deiken gibi 
  kullanarak alnd.Dier yksek seviyeli dillerde de ayn ekilde 
  fonksiyonlarn dndrd deerler, integer tipinde ise AX yazmacnda, 
  LONG trnden ise DX:AX yazma iftindedir. Basic'te byte tipi olmad 
  iin yazlan assembly fonksiyon geri byte trnden bir deer dndrecek ise 
  bu AL yazmacna konup AH yazmac sfrlanr.Basic'te bunu integer olarak
  alarak iler. Fonksiyonumuzu Basic programnda tanmlarken geri dndrecei
  verinin tipini fonksiyon isminin yanna '%','&','!','$' gibi iaretler ile
  bildiririz. Hemen bellek fonksiyonunu kullanan bir basic program yazarak
  buna bir rnek verelim.

      Ŀ
             DECLARE FUNCTION bellek%()                              
             PRINT "DOS bellei :", bellek% , " Kbyte."              
             END                                                     
       


     Yine ayn trden bir fonksiyon yazarak rendiklerimizi pekitirelim.
  Yazacamz bu fonksiyon, byte tipindeki aktif src no'sunu geriye 
  dndrecektir. A: iin 0, B: iin 1, C: iin 2 vb.. 
  
      
      Ŀ
                .model  medium                                       
                .code                                                
                public  surucu                                       
                surucu  proc    far                                  
                        mov     ah,19h ;aktif src no'sunu AL      
                        int     21h    ;yazmacnda dndren dos fonk.
                        xor     ah,ah  ;ah=0                         
                        retf           ;AX=src no'su              
                surucu  endp                                         
                        end                                          
       

   Bu fonksiyonu kullanan basic program:
      
      Ŀ
                DECLARE FUNCTION surucu%()                           
                PRINT "aktif src : " + chr$(surucu%+65)           
                END                                                  
       


     Fonksiyonun dndrd deer integer tipindense, programn banda 
  declare ederken fonksiyonun ismi sonuna % konmal, LONG tipi deer 
  dndryorsa & konmaldr. Bu, fonksiyonun geriye dndrd deerin tipini 
  basic derleyicisine bildirir. Aksi durumlarda yanl sonular alnabilir 
  veya sistem kebilir.
  Hazr balamken bir de LONG tipi deer dndren fonksiyon rnei verelim. 
  Fonksiyonumuz kendisine parametre ile akratlan interrupt 'n,  interrupt 
  vector table'da bulunan adresini geri dndrr. Bildiiniz gibi bu deer 
  segment ve offset adreslerinden olutuu iin 32 bitlik (LONG)'tir.


      Ŀ
               .model  medium                                        
               .code                                                 
               public  kesmeAdr                                      
               KesmeAdr proc far                                     
                       push    bp                                    
                       mov     bp,sp                                 
                       push    es                                    
                       push    bx                                    
                       mov     ax,[bp+6]                             
                       mov     ah,35h                                
                       int     21h                                   
                       mov     ax,bx                                 
                       mov     dx,es                                 
                       pop     bx                                    
                       pop     es                                    
                       pop     bp                                    
                       retf    2                                     
               KesmeAdr endp                                         
                       end                                           
       

     Bu fonksiyon iin bir basic program yazalm.

      Ŀ
          DECLARE FUNCTION kesmeadr&(byval kesmeno%)     
          PRINT "int 21h'in adresi :", kesmeadr&(&h21)   
          END                                            
       


     Bu basic program altrldnda sonu olarak ekrana -12334343 gibi 
  negatif bir say yazar. Basic'te unsigned (iatersiz) say olmad iin bu 
  normaldir. Sonucun daha anlaml grmek iin son satr;
  PRINT "int 21h'in adresi :",hex$(kesmeadr&(&h21))   olarak deitiriniz.

  Verdiimiz rnek programlar BASIC ve ASSEMBLY blmlerinde bulunmaktadr.
                                 -  -

     Efendim, dizinin ilk blmnde ayrntlar ile boumamak ve assembly ile
  neler yaplabileceini gstermek iin bu ay hzl ve minimum aklamalar
  yaparak konuya girdik. Gelecek ay rneklerin yan sra kullanlan teknikleri
  ayrntl olarak ele alacaz.
  Konuyla ilgili sorularnz, nerilerinizi bekliyorum.

PC WORLD / TRKYE - Programlama Sanat
Sanayi mh. Eski Bykdere Cd.
Behet sk. no:25/B kat:5
4.Levent  80650  STANBUL
e-mail: tezkolr@doruk.com.tr
  


