Sistem programlama ile uğraşmak güzel hoş assembly sıkıcı. Ama birkaç bir sey paylaşabilirim bu konuda. İşletim sistemininde ötesinde makinenin kesmelerine müdehale etmek. Tamer Hocamın dediği gibi bilgisayarın atardamarını tutup yalvartmak elimizde. Bu entryde de kısaca temel kesmelerden ve nasıl çalıştığından bahsedeceğim.
Program kesmeleri INT n
şeklinde bir komut ile kullanılmaktadır. Program adresi n sayısı 4 ile
çarpılarak 0-3FF arasındaki tablodan elde edilir. Bu kesme vektörlerinin
gösterdiği programlar daime RAM içerisinde bulunur, hem DOS hem de diğer
yazılımlar tarafından kullanılır.
Program kesmelerinden en çok INT 21H kesmesi
kullanılmaktadır. Burada bizde sıklıkla bu kesmeden faydalanarak, klavye,
monitör gibi çeşitli donanımları kontrol edeceğiz.
Tüm kesme programlarında INT komutu koşturulmadan
önce değişkenlerin ayarlanması gerekmektedir. Programa geri dönüldüğünden ise
kesme hizmet programları çıkış olarak belirli değerler üretebilmektedirler. Bu
sonuçlar ile kesmenin düzgün çalışıp çalışmadığı gibi bilgiler elde
edilebilmektedir.
İlk olarak klavyeden değer almak için bir uygulama
yapalım. Burada 0AH klavye değeridir. Burada tampon alanının ilk byte değeri
girilebilecek maksimum karakter sayısını tutmaktadır. Enter komutunu alana
kadar klavyeden alınanları tampon alanına yerleştirir. Tampon alanının ikinci
byteı ise alanınan karakterlerin sayısını göstermektedir.
------------
DATA_SEG SEGMENT
my_buffer db 10
db 0
girilen db 10 dup ('$'),'$'
DATA_SEG ENDS
mov ah,0ah ;klavyeden
girileni okumak için
mov dx,seg my_buffer ;my_buffer,
klavye girisi için duzenlendi
mov ds,dx
mov dx,
offset my_buffer
int 21h ;çağrıldığı
anda, klavyeden bir metin girilmesi için bekler
---------
Bu aşamadan sonra
yapılması beklenen diğer işlem tamponda yer alan dizinin ekrana yazdırılmasının
sağlanmasıdır. Burada 09H değeri ekranın kontrol edilmesi için kullanılmakta
olan program kesmesidir. Bir stringi alıp ekrana bastırma amacıyla kullanılan
programcık aşağıda verilmiştir. Burada
önemli olan nokta tanımlanan stringin sonunda mutlaka ‘$’ işareti bulunması
gerekmesidir. Yoksa bellek içerisinde $ işareti görene kadar bulunduğu bellek
değerlerini yazacaktır.
---------
DATA_SEG SEGMENT
merhaba db 'merhabaaa',cr,lf,'$'
cr equ 0dh
lf
equ 0ah
DATA_SEG ENDS
mov ah,09h ;ekrana
bir şeyler yazdırmak için 09h yazılır
mov dx,seg girilen
mov ds,dx
mov dx,
offset
int
21h ;çağrıldığı
anda, "$" işaretini görene kadar ekrana yazar
---------
Dosya açma kapama
işlemlerinde kullanılmak amacıyla bir alt program yazmak istersek aynı şekilde
bir donanım kesmesi kullanmamız gerekmektedir. 3DH dosya açma işlemi için 3EH
ise dosyanın kapatılması için kullanılmaktadır. Bu işlemlerin sonuçlarında
fonksiyonlar başarılı ise taşıma bayrağı sıfır, AX ise dosya numarasına eşit
olmaktadır. Başarısız olması durumunda ise AX altında hatanın kodu yer alırken
taşıma bayrağı da bir değerini göstermektedir.
--------
;dosyayı açalım
mov ah,3dh
mov al,02h
mov dx,seg
dosyaadi
mov ds,dx
mov dx,
offset dosyaadi
int 21h
mov numara,ax
;dosyayı kapatalım
mov ah, 3eh;
mov bx, numara
int
21h
----------
Dosyayı açma işlemi
yapmamızdaki amaçlardan biri bu dosyanın içeriğini değiştirmek veya bu dosyada
yazan verileri okumaktır. Bu amaç doğrultusunda dosyadan okuma ve yazma
işlemlerinin nasıl yapıldığını inceleyelim.
Dosya okuma işleminde kullanılan program kesmeleri
3FH, BX içinde ise dosya numarası saklanmaktadır. CX içinde okunacak veya
yazılacak byte sayısı saklanmaktadır. 40H değeri ise yazma işlemi içerisinde
kullanılmaktadır. Fonksiyonun durum kontrolleri ise gene taşma bayrağı ve AX
ile yapılmaktadır. Eğer fonksiyon başarılı olarak sonuçlanmamışsa taşma bayrağı
bir ve AX içinde hata kodu yer almaktadır. Başarılı olması durumunda ise taşma
bayrağı sıfır, AX içinde ise okunan veya yazılan değerler bulunmaktadır.
----------
;okuma işlemi
mov ah,3fh
mov bx,numara
mov cx,100
mov dx,seg tampon1
mov ds,dx
mov dx,offset
tampon1
int 21h
;yazma işlemi
mov ah, 40h;
mov bx,numara;
mov cx,1024;
mov dx,seg tampon1;
mov ds,dx;
mov dx,offset tampon1;
int 21h;
----------
Tüm bunlar yapıldıktan
sonra tabiî ki programı sonlandırma işleminin nasıl yapıldığının da incelenmesi
gerekmektedir. Aşağııda programın sonlandırılması için gereken kod parçası
görülmektedir. 4CH kullanılarak belleğin silinerek sonlandırılması işlemi, AL
içinde ise dönme bilgisi saklanmaktadır. 31H ise bellekten silmeden sonlandırma
yapmaktadır.
---------
mov ah,4ch;
int
21h;
---------
Burada belleğin
boşaltılması en önemli noktalardan biridir. Bellek eğer bu işlemler sonrasında
boşaltılmazsa istenmeyen sonuçlar doğabilmektedir. İşletim sistemine ve program
kesmelerine müdahale ettiğimizden istediklerimizi yapmamız daha kolay hale
gelmiştir. Bellekteki boşaltılmamış alanları kullanarak çok basit bilgisayar
virüsleri yazmakta mümkün olmuştur. İşlemcinin saatiyle interrupta girip
bellekte yer işgal eden virüsler bilgisayarı olumsuz etkileyip bir süre sonra
kapanmasına neden olmaktadır.