Perulangan Dalam Assembly

Apakah anda masih ingat dengan program pertama kita, yaitu program untuk mencetak huruf A ?.Bagaimana jika kita ingin mencetak lebih dari satu karakter ?. Apakah kita harus mengetikkan perintah mov ah,? dan int 21h sebanyak karakter yang ingin dicetak ?. Tentunya hal tersebut akan sangat mubadzir sekali. Akan lebih efektif lagi jika anda menggunakan LOOP atau perulangan. Berikut ini contoh programnya:

; program mencetak huruf A

; sebanyak 26 kali

; dengan menggunakan loop

.model small

.code

org 100h

mulai:

mov ah,02 ; servis cetak karakter

mov dl,65 ; dl=A

mov cx,26 ; banyaknya perulangan

ulang:

int 21h ; cetak karakter

loop ulang ; ulangi hingga 26 kali

int 20h ; selesai

end mulai

Dari contoh program diatas, anda akan melihat sebuah register baru yaitu CX. Register ini sifatnya unik, yaitu bisa digunakan sebagai pencacah atau counter dalam sebuah perulangan. Secara otomatis nilai CX akan berkurang 1 atau CX=CX-1, jika terdapat perintah LOOP. Sedangkan ketika ada perintah LOOP program akan memeriksa nilai CX, jika CX=0, maka perulangan akan dihentikan. Selain itu jika nilai CX >0 maka nilai CX akan dikurangi 1.

INCREASE dan DECREASE

Didalam suatu perulangan biasanya berhubungan dengan penaikan nilai. Sebagai contoh jika kita ingin mencetak huruf A sampai dengan Z, maka kita perlu membuat suatu perulangan dan menaikan nilai A hingga Z. untuk menaikan nilai, dalam bahasa rakitan digunakan perintah INC. Kebalikannya, fungsi decrease adalah untuk menurunkan suatu nilai. Didalam bahasa rakitan digunakan perintah DEC.

Berikut ini contoh programnya:

; program mencetak

; huruf A s/d Z

; dengan loop dan inc

.model small

.code

org 100h

mulai:

mov ah,02 ; servis cetak karakter

mov dl,65 ; dl=A

mov cx,26 ; banyaknya perulangan

ulang:

int 21h ; cetak karakter

inc dl ; naikkan nilai dl

loop ulang ; ulangi hingga 26 kali

int 20h ; selesai

end mulai

Advertisements

Belajar Bahasa Assembly

Untuk membuat program menggunakan bahasa rakitan, anda bisa menggunakan editor apapun.  Ketikkan script berikut dengan Notepad++ dan simpan dengan nama a.asm :

; program mencetak huruf A kelayar

; by code_abu_syafa@yahoo.com

.model small

.code

org 100h

mulai: mov ah,02

mov dl,65

int 21h

int 20h

end mulai

Kemudian simpan program anda, dan keluar dari program editor.

Keterangan program

;(tanda titik koma)

Merupakan baris keterangan program. Artinya setelah tanda ; program akan mengabaikan perintah apapun yang ada.

.model small

Digunakan untuk menentukan mode dari program anda, seperti tiny, small dan lain sebagainya.

.code
org 100h

Menentukan alamat offset dari program yang akan digunakan. Untuk program com selalu diawali dari offset 100h.

mulai:

Adalah nama label. Pada pemrograman assembly anda harus mengawali program anda dengan sebuah label. Label ini juga digunakan untuk lompatan program dengan perintah jmp (jump).

mov ah,02

Mengisi register ah dengan servis 2, identik dengan ah:=2 dalam bahasa pascal. Artinya kita menyuruh program nantinya untuk mencetak sebuah karakter yang ada pada register dl. Dengan kata lain perintah mov ah,02 adalah servis untuk mencetak sebuah karakter. Angka 2 disini adalah 2 heksadesimal, sehingga biasa ditulis 02h.

mov dl,65

Mengisi register dl dengan karakter ascii 65 atau ‘A’. Jadi perintah diatas bisa diubah atau sama artinya dengan perintah mov dl,’A’.

int 21h

Menjalankan interupsi nomor 21. Interupsi ini akan mengerjakan sesuai dengan nilai servis yang diisikan. Karena ada perintah mov ah,2 maka progam akan mencetak karakter yang ada pada register dl.

int 20h

Menjalankan interupsi 20. Interupsi ini berfungsi untuk mengembalikan kontrol ke DOS, dengan kata lain interupsi ini digunakan untuk menghentikan jalannya program.

end mulai

Akhir dari progam. Untuk mengakhiri program anda harus mengetikkan perintah end diikuti oleh nama label yang pertama kali digunakan.

Untuk menjalankannya ketikkan perintah:

> tasm a.asm

>tlink/t a

>a

Interupt

Interupsi adalah suatu permintaan khusus kepada mikroposesor untuk melakukan sesuatu. Bila terjadi interupsi, maka komputer akan menghentikan dahulu apa yang sedang dikerjakannya dan melakukan apa yang diminta oleh yang menginterupsi.

Setiap interrupt akan mengeksekusi interrupt handlernya masing-masing berdasarkan nomornya. Sedangkan alamat dari masing- masing interupt handler tercatat di memori dalam bentuk array yang besar elemennya masing-masing 4
byte. Keempat byte ini dibagi lagi yaitu 2 byte pertama berisi kode offset sedangkan 2 byte berikutnya berisi kode segmen dari alamat interupt handler yang bersangkutan. Jadi besarnya array itu adalah 256 elemen dengan ukuran elemen masing-masing 4 byte. Total keseluruhan memori yang dipakai adalah sebesar 1024 byte (256 x 4 = 1024) atau 1 KB dan disimpan dalam lokasi memori absolut 0000h sampai 3FFh. Array sebesar 1 KB ini disebut Interupt Vector Table (Table Vektor Interupsi). Nilai-nilai yang terkandung pada Interupt Vector Table ini tidak akan sama di satu komputer dengan yang lainnya. Interupt yang berjumlah 256 buah ini dibagi lagi ke dalam 2 macam yaitu:

  • Interupt 00h – 1Fh (0 – 31) adalah interrupt BIOS dan standar di semua komputer baik yang menggunakan sistem operasi DOS atau bukan. Lokasi InteruptVector Table-nya ada di alamat absolut 0000h-007Fh.
  • Interupt 20h – FFh (32 – 255) adalah interrupt DOS. Interrupt ini hanya ada pada komputer yang menggunakan sistem operasi DOS dan Interupt Handler-nya di-load ke memori oleh DOS pada saat DOS digunakan. Lokasi Interupt Vector Table-nya ada di alamat absolut 07Fh-3FFh.

Daftar Nomor Interupt:

No. Interupt         Nama Interupt            No. Interupt         Nama Interupt           

  1. *00h            Divide By Zero                       10h             Video Service
  2. *01h             Single Step                              11h             Equipment Check
  3. *02h            Non MaskableInt(NMI)      12h             Memory Size
  4. *03h             Break point                             13h             Disk Service
  5. 04h               Arithmatic Overflow            14h            Communication (RS-232)
  6. 05h               Print Screen                            15h             Cassette Service
  7. 06h               Reserved                                   16h             Keyboard Service
  8. 07h               Reserved                                   17h             Printer Service
  9. 08h              Clock Tick(Timer)                  18h             ROM Basic
  10. 09h              Keyboard                                   19h              Bootstrap Loader
  11. 0Ah             I/O Channel Action                1Ah             BIOS time & date
  12. 0Bh             COM 1 (serial 1)                       1Bh             Control Break
  13. 0Ch             COM 2 (serial 2)                       1Ch             Timer Tick
  14. 0Dh            Fixed Disk                                  1Dh             Video Initialization
  15. 0Eh            Diskette                                        1Eh             Disk Parameters
  16. 0Fh             LPT 1 (Parallel 1)                       1Fh            Graphics Char

+——————————————-+
| Nomor                       Nama Interrupt      |

| 20h                          Terminate Program |
| 21h                    DOS Function Services |
| 22h                                 Terminate Code |
| 23h                                Ctrl-Break Code |
| 24h                     Critical Error Handler |
| 25h                          Absolute Disk Read |
| 26h                         Absolute Disk Write |
| 27h         Terminate But Stay Resident |
+——————————————-+

Membuat Progam Com

Untuk membuat program .COM yang hanya menggunakan 1 segment, bisa anda buat dengan model program seperti gambar 6.1. Bentuk yang digunakan disini adalah bentuk program yang dianjurkan(Ideal). Dipilihnya bentuk program ideal dalam buku ini dikarenakan pertimbangan dari berbagai keunggulan bentuk program ideal ini seperti, prosesnya lebih cepat dan lebih mudah digunakan oleh berbagai bahasa tingkat tinggi yang terkenal(Turbo Pascal dan C).

Format:

———————————————————–
.MODEL SMALL
.CODE
ORG 100H
Label1 : JMP Label2
+———————+
| TEMPAT DATA PROGRAM |
+———————+
Label2 : +———————+
| TEMPAT
PROGRAM
|
+———————+
INT 20H
END
Label1
———————————————————–

Keterangan:

.MODEL SMALL
Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk memory yang digunakan oleh program kita. Supaya lebih jelas model-model yang bisa digunakan adalah :
– TINY
Jika program anda hanya menggunakan 1 segment seperti program COM. Model ini disediakan khusus untuk program COM.
– SMALL
Jika data dan code yang digunakan oleh program kurang dari ukuran 1 segment atau 64 KB.
– MEDIUM
Jika data yang digunakan oleh program kurang dari 64 KB tetapi code yang digunakan bisa lebih dari 64 KB.
– COMPACT
Jika data yang digunakan bisa lebih besar dari 64 KB tetapi codenya kurang dari 64 KB.
– LARGE
Jika data dan code yang dipakai oleh program bisa lebih dari 64 KB.
– HUGE
Jika data, code maupun array yang digunakan bisa lebih dari 64 KB. Mungkin ada yang bertanya-tanya mengapa pada program COM yang dibuat digunakan model SMALL dan bukannya TINY ? Hal ini disebabkan karena banyak dari compiler bahasa tingkat tinggi yang tidak bisa berkomunikasi dengan model TINY, sehingga kita menggunakan model SMALL sebagai pemecahannya.

.CODE
Tanda directive ini digunakan untuk memberitahukan kepada assembler bahwa kita akan mulai menggunakan Code Segment-nya disini. Code segment ini digunakan untuk menyimpan program yang nantinya akan dijalankan.

ORG 100h
Pada program COM perintah ini akan selalu digunakan. Perintah ini digunakan untuk memberitahukan assembler supaya program pada saat dijalankan(diload ke memory) ditaruh mulai pada offset ke 100h(256) byte. Dapat dikatakan juga bahwa kita menyediakan 100h byte kosong pada saat program dijalankan. 100h byte kosong ini nantinya akan ditempati oleh PSP(Program Segment Prefix) dari program tersebut. PSP ini digunakan oleh DOS untuk mengontrol jalannya program tersebut.

JMP

Perintah JMP(JUMP) ini digunakan untuk melompat menuju tempat yang ditunjukkan oleh perintah JUMP. Adapun syntaxnya adalah: JUMP Tujuan . Dimana tujuannya dapat berupa label seperti yang digunakan pada bagan
diatas. Mengenai perintah JUMP ini akan kita bahas lebih lanjut nantinya. Perintah JUMP yang digunakan pada bagan diatas dimaksudkan agar melewati tempat data program, karena jika tidak ada perintah JUMP ini maka data program akan ikut dieksekusi sehingga kemungkinan besar akan menyebabkan program anda menjadi Hang.

INT 20h
Perintah INT adalah suatu perintah untuk menghasilkan suatu interupsi dengan syntax:
INT NoInt
Interupsi 20h berfungsi untuk mengakhiri program dan menyerahkan kendalisepenuhnya kepada Dos. Pada program COM cara ini bukanlah satu-satunya tetapi cara inilah yang paling efektif untuk digunakan. Bila anda lupa untuk mengakhiri sebuah program maka program anda tidak akan tahu kapan harus selesai, hal ini akan menyebabkan komputer menjadi hang.