Jam Ne

Selasa, 21 Juni 2011

Bahasa Assembly Layanan Input/Output


  1. 1.     PROSEDUR / SUBRUTIN
Prosedur adalah suatu blok intruksi yang secara logic melakukan suatu tugas tetentu yang dapat dipanggil oleh program utama atau prosedur lain. Setap prosedur mempunyai suatu tugas otomik yang tidak tergantung pada program lain. Pada beberapa bahasa pemrograman, prosedur juga sering disebut subrutin.
Unsur penting dalam suatu prosedur adalah nama prosedur. Suatu prosedur dapat digunakan oleh prosedur lain atau program utama dengan cara memanggil nama prosedurnya. Penggunaan prosedur dapat dilakukan berulang-ulang sesuai keperluan.
Dalam pemrograman high level, terdapat dua istilah yang memiliki karakteristik yang sedikit berbeda, yaitu konsep prosedur dan fungsi. Fungsi adalah ssubrutin yang mengembalikan hasil, sedangkan prosedur tidak. Istilah subrutin merupan istilah umum dari keduanya. Kata prosedur dan subrutin sering dipakai secara bergantian.
KEYWORD PROC, ENDP, CALL DAN RET
Dalam bahasa assembly, KEYWORD PROC dan ENDP menandai awal dan akhir prosedur. Pada contoh program dibawah ini terdapat dua prosedur yang diberi nama “main” dan “first_proc”. Dalam prosedur main terdapat perintah call, yaitu perintah untuk memanggil prosedur. Pada akhir prosedur first_proc terdapat perintah ret, yaitu perintah untuk kembali ke intruksi pada prsedur pemanggil.
.code
Main PROC
...
Mov ax,1
Mov dx,ax
Call first_proc
...
...
Main ENDP
First_proc PROC
...
Mov cx, 2
Mov bx, 3
...
...
First_proc ENDP
Contoh program : FIRST2PROC.ASM
Pada contoh berikut terdapat dua buah prosedur, yaitu prosedur input_char dan calc_sum. Prosedur input_char berfungsi untuk memasukkan karakter dari keyboard dan mengembalikanya kedalam AL. Prosedurnya sangat sederhana, hanya mengandung dua intruksi yang diperlukan untuk memanggil fungsi 1 DOS (input keyboard). DOS otomatis mengembalikan karakterke dalam AL. Jadi, nilai akan tersimpan disana ketika input_char kembali kepemanggilnya, yaitu prosedur main.
Title contoh program subrutin
Dosseg
.model small
.stack 100h

.data
Char db ?
Array dw 100h, 200h,300h,400h,500h
Array_size equ 5
Sum dw ?

.code
Main proc
Mov ds, ax
Call input_char
Mov char, al
Mov bx,offset array
Mov cx,array_size
Call calc_sum
Mov sum,ax

Mov ax,4000h
Int 21h
Main endp

Cala_sum proc
Push bx
Push cx
Mov ax,0
Cls :
Add ax,[bx]
Add bx,2
Loop csl
Pop cx
Pop bx
Ret
Calc_sum endp
End main
Prosedur calc_sum menghitung jumblah isi array integer sampai 65,535 integer. Untuk memangggil prosedur ini, pada prosedur main dilakukan settiing offset array. Nilai offset array ditempatkan dalam register bx. Untuk menghitung jumlah elemen, digunakan register cx. Program pemanggil harus menyesuaikan parameter sesuai keperluan subrutin yang dipangggil
TIPE PROSEDUR NEAR DAN FAR
NEAR
Pemanggilan prosedur NEAR dilakukan ketika pemangil dan surutin berada dalammsegment program yang sama. Dalam hal ini assembler akan membuat kode mesin untuk near call. Sebelum mengakses subrutin, intruksi call menyimpan nilai IP (INTUKTION POINTER) saat ini kedalam stack. Kemudian nilai IP diganti dengan nilai offset subrutin. Dengan cara inilah subrutin dijalankan.
Intruksi RET (kependekan dari Return) pada akhir prosrdur berfungsi untuk mengembalikan eksekusi intuksi pada program pemanggil. Proses yang terjadi adalah nilai yang terdapat dalam stack diambil kembali dan dimasukkan kedalam IP. Dengan cara ini maka intruksi yang akan eksekusi berikutnya adalah intruksi yang terdapat pada program pemanggil.
 
Tabel diatas menjelaskan tentang proses pemanggilan prosedur NEAR dengan contoh offset.
FAR
          Pemanggilan prosedur FAR dilakukan ketika pemanggil dan subrutin berada pada segment kode yang berbeda. Dalam hal ini assembler akan membuat kodee mesin untuk far call. Sebelum mengaksees subrutin, intruksi CALL terlebiih dahulu menyimpan nilai register CS dan IP saat inii kedalam stack. Kemudian, intruksi tersebut mengambil alamat segment subrutin kedalamm CS dan offsetnya kedalam IP.
 
Tabel diatas menunjukkan prosedur main membuat pemanggiln prosedur FAR terhadap subrutin dalam segmen berbeda. Deklarasi FAR harus ditambahkan sesudah nama subrutin 1 dan operator FAR PTR  ditambahkan pada intruksi call pada saat memanggil. Pada akhir subruti 1, assembler akan membuat intruksi mesin khusus RETF. Intruksi ini berfungsi untuk mengembalikan eksekusi kepada pemanggilnya. Waktu eksekusi untuk prosedur FAR lebih lambat dari pada prosedur NEAR karena adnya penambahan proses push dan pop untuk nilai segmennya ( CS ). 
2. INTERRUPT
Interrupt terdiri dari dua jenis yaitu :
A.    Interrupt Perangkat Keras
          Interrupt perangkat keras adalah sinyal yang dikirim perangakat keras sistem yang memerlukan respons segera dari CPU. Interrupt perangkat keras ini dihasilkan oleh chip khusus, controlle interrupt, yang memberi sinyal pada CPU untuk menangguhkan eksekusi program yang sedang dieksekusi dan memproses intrrupt. Contoh sederhana interrupt perangkat keras adalah akses input dari keyboard. Pada saat salah satu kunci (key) ditekan maka CPU akan menangguhkan program yang sedang dieksekusi dan mengalikannya untuk mengeksekusi rutin BIOS yang membaca karakter dari port input keyboard dan menyimpannya dalam buffer memori. CPU dapat melanjutkan mengeksekusi intruksi yang tertunda setelah proses interrupt selesai.
          Dalam pemrograman ada saatnya progremer harus menghentikan interrupt perangkat keras secara termporer. Misalnya pada saat melakukan operasi yang sensitif pada registe segmen dan stck. Untuk mematikn sementara interrupt perngkat keras, diguunakan intruksi CLI ( clear interrupt flag). Setelah normal kembali, untuk mengaktifkannya, digunakan intruksi STI ( set interrupt flag ).

B.     Interrupt Perangkat Lunak
          Interrupt perangkat lunak adalah proses pemanggilan salah satu rutin layanan interrup BIOS atau DOS. Interrupt jenis ini sebenarnya interrupt tiruan, bukan interrupt sesungguhnya. Istilah interrupt masih digunakan karena proses yang terjadi mirip dengan interrupt pada perangkat keras. Interrupt perangkat lunak menyediakan menyediaan akses untuk menangani proses I/O secara rinci. Intruksi interrupt ditandai dengan intruksi INT ( kependekan dari interrupt ). Intruksi INT meminta layanan dari sistem operasi, biasanya untuk I/O. Layanan ini adalah program kecil yang berlokasi di dalam BIOS dan bagian resident DOS.
Intriksi INT
Intriksi INT berfungsi untuk memanggil subrutin yang yang terdapat pada sistem operasi. Identifikasi jenis interrupt ditentukan oleh angka yang nilainya dalam range 00h-FFh. Untuk melengkapi intruksi INT, sebelumnya register AH harus diisi terlebih dahulu dengan nomor fungsi yang mengidentifikasikan subrutin yang diinginkan. Sintak intruksi INT adalah :
INT nomor
Intriksi INT digunakan untuk tampilan konsol baik input maupun output, manipulasi file dan video dan berbagai layanan lain yang disediakan oleh BIOS dan DOS.

INTERRUPT  VECTOR TABLE ( IVT )
      Dalam proses interrupt, CUP mengakses interrupt vector table, yaitu alamat memori yang besarnya 1 KB. Tabel IVT adalah kumpulan pointer yang lebarnya 32 bit yang menunjukkan kesubrutin yang terdapat pada sisstem operasi. Gambar dibawah ini mengilustrasikan langkah-langkah yang diambil oleh CPU pada saat intruksi INT ditemukan dalam program :
 
  • Nomor yang interrupt pada intruksi INT digunakan oleh CPU untuk mengakses data pada interrupt vector table. Dalam contoh, INT 10h. Intruksi ini berfungsi untuk meminta layanan video. 
  • Langkah berikutnya, CPU akan mengambil alamat yang terdapat pada IVT, yaitu (F000:F065). 
  • Alamat ini digunakan untuk mengakses subrutin DOS yang menangani interrupt pada alamat F000:F065, CPU akan mengeksekusi fungsi yang terdapat pada alamat tersebut sampai ditemukan alamat intruksi IRET.
                      Sti
                      Cld
                      Push es
                      Push ds
                      …
                      …
                     IRET
  • Pada saat ditemukan intruksi IRET maka CPU akan mngeksekusi kembali intruksi pada program pemanggil.
               Interrupt prangkat lunak memanggil rutin layanan interrupt dalam BIOS atau DOS. Beberapa interrupt yang serring digunakan :
1.      INT 10h : layanan video; rutin layanan video yang mengatur posisi kursor, geser layar, dan menampilkan grafik video.

2.      INT 16h : layanan keyboard; rutin yang membaca keyboard dan mengecek statusnya.
3.      INT 17h : layanan printer ; rutin untuk instalasi, pint dan mengembalikan status printer.
4.      INT 1Ah : rutin yang mendapat nmor jam pada saat mesin dinyalakan, atau menset pencacah dengan nilai baru.
5.      INT 1Ch : intrrup waktu bagi pengguna; ruti kosong tang dieksekusi 18.2 kali per detik.
6.      INT 21h : layanan DOS ; rutin layanan DOS untuk masukan/ keluaran, penanganan file, manajemen memori dan dikenal sebagai fungsi call DOS.
2.3 FUNGSI CALL DOS
            INT 21h disebut juga fungsi call DOS. Terdapat 87 fungsi berbeda yang didukung oleh interrupt ini,didentifikasikan oleh nomor fungsi yang ditempatkan dalam register AH. Berikut ini daftar fungsi 00h sampai 0Ch :


1.      01H : INPUT KONSOL DENGAN ECHO
Fungsi 1 DOS menunggu karakter yang akan ditampilkan yang diinputkan dari konsol dan menyimpannya dalam register AL. (karakter yang sedang berada dalam buffer secara otomatis akan disimpan kedalam AL).
CTRL-BREAK aktif. Dalam contoh berikut sebuah karakter akan diinput dan ditempatkan dalam variable bernama char :
Mov ah, 1
Int 21h
Mov char, al

2.      02H : OUTPUT KARAKTER

Fungsi 2 DOS mengirim karakter ke konsol. CTRL-BREAK aktif. Karakter yang akan ditampilkan disimpan dalam register DL, seperti contoh berikut :
Mov ah, 2
Mov DL, ‘*’
Int 21h
AL diubah oleh DOS selama pemanggilan int 21h. agar nilainya bias digunakan kembali maka terlebih dahulu harus disimpan dalam stack sebelum pemaggilan int 21h. pada saat selesai pemanggilan int 21h nilai AL dpat iambil kembali.

1.      05H : OUTPUT PRINTER
Untuk mecetak karakter, tempatkan karakter dalam DL dan panggil fungsi 5. DOS menunggu sampai printer siap untuk menerima karakter. Output akan keluar keprinter 1(nama perangkat LPT 1). Contoh berikut mencetak karakter dolar ($).
Mov ah, 5
Mov DL,’$’
INT 21h
Mov dl, 0Dh
INT 21h
2.      06H : INPUT OUTPUT KONSOL LANGSUNG
Fungsi 6 DOS melakukan proses baca atau tulis pada konsol. CTRL-BREAK tidak aktif dan tidak ada filter terhadap karakter. Untuk meminta konsol inpt (tanpa menunggu), register DL harus ber nilai 0FFh. Karakter disimpan dalam register AL. contoh berikut untuk input/output :
Input karakter
Moov ah, 6
Mov dl, 0FFh
Int 21h
Output karakter
Mov ah, 6
Mov dl, ‘&’
Int 21h
Menghapus buffer keyboard. Program aplikasi biasanya dibutuhkan untuk menghapus buffer keyboard. Berikut ini contoh prosedur yang menggabungkan INT 21h dengan intruksi Loop untuk menghapus buffer :
Hapus_keyboard proc
Mov cx, 15
L1 :
Mov ah,6
Mov dl,0FFh
Int 21
Loop L1
Ret
Hapus_keyboard endp

3.      07H : INPUT KONSOL LANGSUNG
Fungsi 7 menunggu karakter yang tidak terfilter dari konsol. Karakter tidak ditampilkan di konsol dan CTRL-BREAK aktif. Fungsi input ini cocok untuk karakter khusus seperti karakter fungsi dan panah kursor.
Contoh program:
Mov ah, 7
Int 21h
Mov char,al
4.      08H : INPUT KONSOL TANPA ECHO
Fungsi 8 menunggu karakter yang tidak difilter dari konsol tanpa menampilkannya, sementara CTRL-BREAK aktif. Karakter disimpan dalam register AL. fungsi input ini cocok untuk larakter khusus.
Contoh :
Mov ah, 8
Int 21h
Mov char, al

5.      09H : OUTPUT STRING
Fungsi 9 menampilkan string karakter pada konsol. Alamat offset string harus ada dalam DX, dan string harus diakhiri oleh karakter dolar ($).
Contoh :
Mov ah, 9
Mov dx, offset string
Int 21h
String db ‘hallo kota bandung.’,Odh, Oah,’$’

6.      0AH : BUFFER INPUT KONSOL
Fungsi 0Ah membaca string karakter sampai 255 karakter dari konsol dan menyimpannya dalam buffer. Enter digunakan untuk mengakhiri input. CTRL-BREAK aktif dan seluruh karakter ditampilkan pada konsol.
Sebelum fungsi dipanggil, DX harus diisi dengan offset area parameter keyboard. Format area sebagai berikut :
 
Dalam byte offset 0 ditempatkan jumlah maksimum karakter yang bias diinput. Jika jumlahnya 5, misalnya, dos akan mengizinkan 4 karakter tambah enter yang diinput. Sesudah interrupt dipanggil, dos menempatkan jumlah karakter yang benar-benar pada byte offset 1. Karakter tersebut sisimpan mulai offset 2. Contoh :

Mov ah, 0Ah
Mov dx, offset max_kunci
Int 21h
Max_kuncidb 32
Chars_input db ?
Buffer db 32 dup(0)
Misalnya, kita meninputkan 21 karakter dari konsol :
       Nama saya Demian Saba
Maka isi buffer akan sebagai berikut :

 
1.      0B H : MENGAMBIL STATUS INPUT KONSOL
Fungsi 0Bh adalah menerima buffer keyboard DOS untuk melihat karakter dalam buffer. Jika ada karakter, DOS mengembalikan nilai 0FFh dalam register AL. jika tidak, DOS mengembalikan 00 dalam register Al, sementara CTRL-BREAK aktif. Contoh :
Mov ah, 0Bh
Int 21
2.      0CH : MEMBERSIHKAN BUFFER INPUT, MENEMUKAN FUNGSI INPUT
Fungsi  0Ch membersihkan buffer keyboard dan memanggil fungsi input konsol. Funsi yang dipanggil (1,6,7,dan 8) diidentifikasikan oleh nilai dalam AL. karakter input akan dikembalikan dalam AL.contoh :
Mov ah, 0Ch
Mov al, 1
Int21h
Mov chr, al
Input keyboard level BIOS (INT 16H)
Cara langsung untuk mengambil input keyboard adalah dengan mengunakan int 16h layanan keyboard dalam system BIOS. Berikut ini daftar layanan INT 16h :




1 komentar: