APA
ITU PROGRAM RESIDEN ?
Pada
waktu kita menyalakan komputer, ia mencari sistem operasi di drive A: ataupun
C: ,kemudian memasukkannya kedalam memori bawah. Selanjutnya sistem akan terus
berada disitu dan apabila kita menjalankan program aplikasi misalnya game maka
program tersebut akan disimpan di atas sistem operasi, sehingga sistem operasi
tetap ada walaupun kita sedang menjalankan game tersebut. Inilah yang disebut
residen, yaitu program yang tetap tinggal di memori.
Dalam
contoh kita ini bila game tadi telah selesai maka ia akan lenyap dari memori
dan bila kita menjalankan program aplikasi lainnya, misalnya WS maka tempat
memori yang digunakan oleh game kita akan digunakan oleh WS. Ini adalah contoh
dari program yang tidak residen karena ia hanya sementara waktu berada di
memori. Contoh program residen yang terkenal misalnya SideKick, Print(dos) dan
Doskey.
+--------------------------+ +----------------------------+
| (USER AREA RAM) | | (USER
AREA RAM) |
| | | |
| PROGRAM | |
PROGRAM |
| APLIKASI 1 | | APLIKASI 2 |
| GAME | | WS |
+--------------------------+ +---------------------------+
| OPERATING SYSTEM | | OPERATING SYSTEM |
+------------------+ +------------------+
Program residen adalah
program yang akan menetap dimemory seperti halnya DOS dan program residen ini
akan berada tepat diatas Operating System. Program residen akan dianggap
sebagai bagian dari Operating System sehingga bila dijalankan program aplikasi
maka program aplikasi tersebut akan ditaruh diatas program residen sehingga
program residen kita tetap utuh.
+--------------------------+ +---------------------------+
| (USER AREA RAM) | | (USER
AREA RAM) |
| | | |
| PROGRAM | |
PROGRAM |
| APLIKASI 1 | |
APLIKASI 2 |
| GAME | | WS |
+---------------------------+ +-------------------------+
| RESIDENT SECTION | | RESIDENT SECTION |
+---------------------------+ +----------------------------+
| OPERATING SYSTEM | | OPERATING SYSTEM |
+------------------------------+ +----------------------------+
Program residen adalah
suatu bentuk program yang menarik. Karena program residen menetap pada memory,
maka semakin banyak program residen dijalankan, memory akan semakin berkurang
untuk digunakan oleh program aplikasi. Program residen, haruslah dibuat sekecil
mungkin untuk menghindari pemakaian memory yang terlalu banyak. Hanya dengan
Assembler-lah, sebuah program dapat dibuat sekecil mungkin! Bayangkan, program
untuk menghapus layar, dengan bahasa tingkat tinggi seperti pada pascal dan C
digunakan sekitar 3232 byte, sedangkan pada assembler sekitar 7 byte.
MODEL
PROGRAM RESIDEN
Dalam
pembuatan program residen, kita dapat membaginya dalam 2 bagian pokok, yaitu :
- Initialize section, yaitu bagian dari program yang bertugas meresidenkan residen
section. Bagian ini sendiri tidak residen, dan pada bagian inilah suatu vektor
interupsi diubah.
- Residen section, yaitu bagian program yang akan menetap pada memory. Program ini
akan tetap tinggal pada memory sampai dihilangkan, atau sampai komputer
direset.
Pada program sebelumnya,
kita selalu mengakhiri program dengan interupsi 20h yang akan mengembalikan
kontrol program sepenuhnya pada DOS. Pada program residen, program akan selalu
kita akhiri dengan interupsi 27h ataupun interupsi 21h fungsi 31h. Untuk
menggunakan interupsi 27h, kita tinggal mengisi pasangan register DS:DX dengan
batas memory yang akan diresidenkan.
+--------------------------+
| |
| |
| USER AREA RAM |
| |
| |
+------------------+<--DS:DX
| RESIDENT SECTION |
+----------------------------+
| OPERATING SYSTEM |
+------------------------------+
Untuk
membuat program residen, anda bisa menggunakan bentuk program seperti berikut:
.MODEL
SMALL
.CODE
ORG
100h
TData
: JMP Res_kan
+------------------+
| Tempat untuk |
| mendefinisikan |
| DATA |
+------------------+
Bag_Res
PROC
PUSH
AX ;
PUSH
BX ;
PUSH
CX ;
PUSH
DX ;
PUSH
ES ; Simpan isi semua register
PUSH
DI ;
PUSH DS ;
PUSH
SI ;
+------------------+
| Tempat handler |
| interupsi yang |
| baru |
+------------------+
POP
SI ;
POP
DS ;
POP
DI ;
POP
ES ;
POP
DX ; Kembalikan isi semua register
POP
CX ;
POP
BX ;
POP
AX ;
IRET
; Akhir dari interupt handler
Bag_Res
ENDP
Res_Kan
:
+------------------+
| Tempat untuk |
| memanipulasi |
| vektor interupsi |
+------------------+
LEA
DX,Res_Kan
INT
27h
END TData
Sebagai
contoh disini kita akan membuat Program residen yang membelokkan intrupsi 05
atau interupsi PrtScr menuju program buatan sendiri.
Pertama-tama, buka terlebih dahulu Command Prompt pada PC anda. Lalu
masuk ke menu edit layar biru, ketikkan program dibawah ini pada layar
tersebut, lalu save sesuai dengan keinginan anda.
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Res_kan
Pesan DB ' Interupsi 5<PrtScr> telah di belokkan !! '
NoInt EQU 05h
Bag_Res PROC
PUSH AX ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH ES ; Simpan isi semua register
PUSH DI ;
PUSH DS ;
PUSH SI ;
MOV AX,1300h ;
MOV BL,01001111b ;
MOV BH,00 ;
MOV DL,20 ;
MOV DH,12 ; Program interupt handler PrtScr
MOV CX,44 ; yang baru.
PUSH CS ;
POP ES ;
LEA BP,Pesan ;
INT 10h ;
POP SI ;
POP DS ;
POP DI ;
POP ES ;
POP DX ; Kembalikan isi semua register
POP CX ;
POP BX ;
POP AX ;
IRET ; Akhir dari interupt handler
Bag_Res ENDP
Res_Kan :
MOV AH,25h ;
MOV AL,NoInt ; Untuk merubah vektor interupsi
LEA DX,Bag_Res ; 05 menuju 'Bag_Res'
INT 21h ;
LEA DX,Res_Kan ;
INT 27h ; Untuk meresidenkan bagian
END TData ; "Bag_Res"
Jalankan program tersebut
dengan di compile terlebih dahulu menggunakan TASM spasi nama file, kemudian
cetak program dengan menggunakan TLINK/t seperti biasa.
Bila program dijalankan,
maka tombol PrtScr sudah tidak akan berfungsi lagi. Setiap kali tombol PrtScr
ditekan, pada posisi 20,12 akan ditampilkan pesan:
Interupsi
5<PrtScr> telah di belokkan !!
Perhatikanlah,
bahwa pada program ini terdapat 2 bagian pokok, yaitu bagian yang residen dan
bagian yang meresidenkan. Bagian yang meresidenkan hanya dijalankan sekali,
sedangkan bagian yang residen akan dijalankan setiap kali terjadi penekanan
tombol PrtScr. Bagian yang meresidenkan adalah:
Res_Kan
:
MOV
AH,25h ;
MOV
AL,NoInt ; Untuk merubah vektor interupsi
LEA
DX,Bag_Res ; 05 menuju 'Bag_Res'
INT
21h ;
LEA
DX,Res_Kan ;
INT
27h ; Untuk meresidenkan bagian
END
TData ; "Bag_Res"
Bagian
ini tugasnya meresidenkan bagian Bag_Res. Sebelum bagian Bag_Res diresidenkan,
vektor interupsi PrtScr(05) diubah menuju progam Bag_Res. Bila anda hanya
merubah interupsi PrtScr menuju program Bag_Res tanpa diresidenkan, maka akan
menyebabkan komputer anda menjadi hang, mengapa? Walaupun vektor interupsi
tetap menunjuk pada lokasi atau alamat yang sama, tetapi tempat yang digunakan
program kita telah diserahkan kepada Dos untuk digunakan oleh aplikasi lain.
Bag_Res
PROC
PUSH
AX ;
PUSH
BX ;
PUSH
CX ;
PUSH
DX ;
PUSH
ES ; Simpan isi semua register
PUSH
DI ;
PUSH
DS ;
PUSH
SI ;
Ini
adalah awal dari bagian yang residen. Simpanlah semua nilai register pada awal
program residen untuk mencegah terganggunya program lain yang sedang berjalan
pada saat tombol PrtScr ditekan.
MOV
AX,1300h ;
MOV
BL,01001111b ;
MOV BH,00 ;
MOV
DL,20 ;
MOV
DH,12 ; Program interupt handler PrtScr
MOV
CX,44 ; yang baru.
PUSH
CS ;
POP
ES ;
LEA
BP,Pesan ;
INT
10h ;
Bagian
ini dapat dikatakan sebagai handler baru bagi interupsi PrtScr. Tombol PrtScr
yang biasanya mencetak tampilan layar pada printer akan berubah menjadi
mencetak pesan pada layar. dengan demikian anda bisa membuat handler baru yang
akan melakukan sesuatu setiap kali terjadi penekanan tombol PrtScr.
Perhatikanlah!
:
untuk
mencetak pesan pada layar digunakan interupsi 10h, dan bukannya interupsi Dos
fungsi 09 yang biasanya kita gunakan. Mengapa demikian ? Sebagian besar
Interupsi Dos tidak bisa digunakan pada program residen, karena sifat dari Dos
yang tidak reentrant. Masalah ini akan kita bicarakan lebih lanjut nantinya.
POP
SI ;
POP
DS ;
POP
DI ;
POP
ES ;
POP
DX ; Kembalikan isi semua register
POP
CX ;
POP
BX ;
POP
AX ;
IRET
; Akhir dari interupt handler
Bag_Res
ENDP
Pada akhir program
residen, kembalikanlah nilai semua register yang disimpan, disertai perintah
IRET(Interrupt Return). Perintah IRET akan mengambil alamat CS dan IP serta
nilai Flag pada stack untuk kembali menuju program yang diselanya. CS, IP dan
nilai flag disimpan pada stack pada saat terjadi interupsi, inilah rahasianya
mengapa program dapat berjalan normal kembali setelah mendapat interupsi.