Murat ERDEM - Personal Research Blog




Assembly Programing - 0x09: Makrolar ve İnterruptlar

August 28, 2020

Assembly programlama yaparken bazı kod parçalarını tekrar tekrar yazmak yerine makro yada prosedür olarak bir kez yazıp her ihtiyacımız olan yerde çağırabiliriz. Makrolar ve prosedürler arasındaki fark ise programın derlenmesi sırasında makrolar yazılan kodlar program akışı içerisinde çağrıldığı her noktaya kopyalanırlar. Prosedür ise bir kez program içerisinde tanımlanarak çağrıldığı noktalarda program akışı bu tanıma gider işlendikten sonra çağrılma noktasına geri dönerek akış devam eder.

Prosedürler

Prosedürler program içerisinde küçük fonksiyon tanımlamalarıdır. Tanımlama yapılırken “proc” anahtar kelimesi kullanılır bir prosedür bittiğini belirtmek için ise “endp” anahtarı kullanılır. Program akışında prosedürü çağırmak için “call” kullanılır. Kullanımına örnek için aşağıdaki kodu incelersek öncelikle çalışmaya başladığında cx değeri 1234h iken çağrı yapıldığında myproc içerisinde cx değeri 1122h olarak değiştirilip tekrar çağrıldığı konuma geri dönerek ax değerini 9999h olarak set edecektir.

       
    
        .model small
        .stack 32

        .data

        .code

            mov ax,@data
            mov ds,ax 
        
            mov ax,0
            mov cx,1234h
            call myproc 
            mov ax,9999h
            hlt
            
            
            myproc proc
                mov cx,1122h
                ret
                myproc endp
            
            .exit
            
        end
    

Makrolar

Makrolar da prosedürler gibi fonksiyonlardır. Çağrıldıkları noktadan önce tanımlanmaları gerekir. “makro” komutu ile tanımlanırlar ve parametre alabilirler. Sonlandığını belirtmek için ise “endm” komutunu kullanabiliriz. Örnek bir toplama makrosu aşağıdaki gibidir. makro içinde etiket tanımı yapmak için “local” komutu ile makro içinde kullanacağınız etiketleri tanımlamanız gerekmektedir.

       
    
        .model small
        .stack 32
        
        .data
        
            isim db "muraterdem"   
        
        .code
        
            mov ax,@data
            mov es,ax
            mov ds,ax 
            mov ax,0
            
            
            toplama macro p1,p2,p3,p4
            
            mov ax,p1
            add ax,p2
            add ax,p3
            add ax,p4
            endm   
            
            toplama 1 2 3 4 
            mov bx,ax
            
            
        end        
    

İnterruptlar

interruptlar sistem ile programın etkileşime geçmesi için kullanılan komutlardır. Bu komutlar “int” komutu ile çağrılır bir çok kesme bulunmaktadır, gerektiğinde araştırma yapılmalıdır. Örnek olarak 8086 da “f1” kısayolu ile yardım dokümanına bakabiliriz. Burada int 21h açıklaması aşağıdaki gibidir.

Burada anlatıldığı gibi dx registerine stringin adresini, ah içerisine 9h atayarak “int 21h” komutunu verdiğimizde stringi ekrana yazacaktır. Kodlama aşağıdaki gibi yapılabilir.

       
    
        .model small
        .stack 32
        
        .data
        
            isim db "murat erdem",'$'   
        
        .code
        
            mov ax,@data
            mov es,ax
            mov ds,ax 
            mov ax,0 
            
            lea dx,isim
            mov ah,09h
            int 21h
            
            .exit
            
        end