Materi ke-12
BAB XXIV
PROGRAM RESIDEN
;\================================================
======/;
.MODEL SMALL
.CODE
ORG 100h
Res_Kan :
Ambil_Vec Break,Addr_Break ; Anbil alamat Ctrl+C
Arah_Vec PrtScr,Addr_Break ; Rubah vektor PrtScr
INT 20h
END TData
Program 24.1. Mengganti fungsi PrtScr menjadi Ctrl+Break
Bila progrm 24.1. dijalankan, maka tombol PrtScr sudah tidak akan berfungsi
seperti biasanya, tetapi berfungsi seperti penekanan tombol Ctrl Break.
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.
Res_Kan :
+------------------+
| Tempat untuk |
| memanipulasi |
| vektor interupsi |
+------------------+
LEA DX,Res_Kan
INT 27h
END TData
----------------------------------------------------------------
Gambar 24.4. Model Program Residen
.MODEL SMALL
.CODE
ORG 100h
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"
Bila program 24.2. dijalankan, maka tombol PrtScr sudah tidak akan berfungsi
lagi. Setiap kali tombol PrtScr ditekan, pada posisi 20,12 akan ditampilkan pesan:
LEA DX,Res_Kan ;
INT 27h ; Untuk meresidenkan bagian
END TData ; "Bag_Res"
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.
Aksi MACRO
MOV AX,40h
MOV ES,AX ; ES=40h
MOV AX,ES:[17h] ; AX=40h:17h
OR AX,01000000b ; Jadikan bit ke 7 menjadi 1
MOV ES:[17h],AX ; Masukkan kembali ke 40h:17h
ENDM
;/================================================
==\;
; Program : CAPS-ON.ASM ;
; Author : S’to ;
; Fungsi : Program residen yang akan ;
; mengunci Caps Lock sehingga ;
; nyala terus ;
;\================================================
==/;
.MODEL SMALL
.CODE
ORG 100h
Bag_Res PROC
PUSH AX ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH ES ; Simpan isi semua register
PUSH DI ;
PUSH DS ;
PUSH SI ;
Aksi
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 ; 1Ch menuju 'Bag_Res'
INT 21h ;
LEA DX,Res_Kan ;
INT 27h ; Untuk meresidenkan bagian
END TData ; 'Bag_Res'
;/=========================================\;
; Program : LABEL.ASM ;
; Author : S’to ;
; Fungsi : pendefinisian data dengan ;
; LABEL ;
;\=========================================/;
.MODEL SMALL
.CODE
ORG 100h
Proses:
MOV XX[0],0Ah ; = MOV A,0Ah
MOV XX[1],0Bh ; = MOV B,0Bh
MOV XX[2],0Ch ; = MOV C,0Bh
INT 20h
END TData
Karena kita mendefinisikan "XX label byte" diatas variabel A, maka byte pertama
dari "XX" akan sama dengan variabel "A", byte keduanya sama dengan "B" dan
byte ketiganya sama dengan "C". Dengan demikian perintah "MOV XX[0],0Ah"
adalah identik dengan "MOV A,0Ah".
+-XX+---+---+---+---
+---+---+---+---+---
|1|2|3| |
+---+---+---+---+---
"A" "B" "C"
Dengan penggunaan label ini, kita bisa mengakses suatu tempat di memory
dengan menggunakan 2 atau lebih nama yang berlainan. Apa kelebihan
lainnya ?
- Dengan mendefinisikan suatu variabel label pada akhir program, maka akan
didapatkan suatu variabel penampung yang besar sekali, tanpa harus
memperbesar program.
- Dengan pendefinisian label juga dimungkinkan pengaksesan data dengan tipe
data yang berlainan pada variabel. Supaya lebih jelas, bisa anda lihat pada
program berikut ini:
;/=========================================\;
; Program : LABEL1.ASM ;
; Author : S’to ;
; Fungsi : pendefinisian data dengan ;
; LABEL ;
;\=========================================/;
.MODEL SMALL
.CODE
ORG 100h
INT 20h
END TData
Pada program 24.5. dapat dilihat bahwa kita bisa saja mengakses nilai pada
variabel A yang didefinisikan dengan tipe data byte diakses dengan tipe data
word. Dengan demikian penggunaan label memungkinkan kita untuk mengakses
suatu data dengan tipe data yang berbeda.
+--XX---+-------+---
+---+---+---+---+---
|1|2| | |
+---+---+---+---+---
A[0] A[1]
;/================================================
============\;
; Program : OLDINT.ASM ;
; Author : S’to ;
; Fungsi : Pada saat PrtScr ditekan, program akan ;
; memberikan anda kesempatan untuk ;
; menyiapkan printer sebelum mulai mencetak ;
;\================================================
============/;
.MODEL SMALL
.CODE
ORG 100h
Bag_Res PROC
PUSH AX ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH ES ; Simpan isi semua register
PUSH DI ;
PUSH DS ;
PUSH SI ;
Cetak_Pesan Pesan1,80,0,12
Readkey
PUSHF
CALL Addr_PrtScr_Asli ; Panggil handler PrtScr
; yang asli
Cetak_Pesan Pesan2,65,5,14
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 :
Ambil_Vec PrtScr,Addr_PrtScr
MOV AH,25h ;
MOV AL,PrtScr ; Membelokkan vektor interupsi
LEA DX,Bag_Res ;
INT 21h ;
PUSHF
CALL Addr_PrtScr_Asli
Kedua perintah ini mensimulasikan perintah interrupt. Seperti yang telah kita
ketahui, setiap interrupt handler selalu diakhiri dengan perintah IRET yang akan
mengambil CS, IP dan Flags dari stack. Karena perintah Call hanya akan
menyimpan CS dan IP dalam stack maka kita perlu menyimpan flags dalam stack
secara manual. Pada variabel "Addr_PrtScr_Asli" kita mendefinisikannya sebagai
label Double Word sehingga kedua word variabel "Addr_PrtScr" dapat diakses
dengan tipe data Double Word(alamat CS dan IP).
;/================================================
=============\;
; Program : BAD.ASM ;
; Author : S’to ;
; Fungsi : Menggunakan fungsi DOS pada program residen;
; Program ini akan menunjukkan bagaimana ;
; memecahkan masalah reentrancy DOS, dengan ;
; mengecek BAD (Bendera Aktif DOS) ;
;\================================================
=============/;
.MODEL SMALL
.CODE
ORG 100h