bahasa rakitan1

89
BUKU PEGANGAN KULIAH oleh: Agus Haryawan, S.T. Jurusan Teknik Komputer DIII / Semester IV (Dipakai untuk kalangan sendiri) POLITEKNIK PRATAMA MULIA SURAKARTA 2007 Jln. Haryo Panular No. 18A Solo, Telp. (0271) 712637 email: [email protected] website: http//www.politama.ac.id Agus Haryawan - Politama Surakarta

Upload: jimi-dbono

Post on 29-Dec-2015

61 views

Category:

Documents


6 download

DESCRIPTION

Assembly

TRANSCRIPT

Page 1: Bahasa Rakitan1

BUKU PEGANGAN KULIAH

oleh:

Agus Haryawan, S.T.

Jurusan Teknik Komputer DIII / Semester IV

(Dipakai untuk kalangan sendiri)

POLITEKNIK PRATAMA MULIA SURAKARTA

2007 Jln. Haryo Panular No. 18A Solo, Telp. (0271) 712637

email: [email protected]

website: http//www.politama.ac.id

Agus Haryawan - Politama Surakarta

Page 2: Bahasa Rakitan1

i

KATA PENGANTAR

Dengan memanjatkan puji syukur ke hadirat Tuhan Yang Maha Esa, atas segala karunia

dan rahmat-Nya, pada kesempatan ini kami selaku Direktur Politeknik Pratama Mulia Surakarta

menyampaikan terima kasih atas segala usaha dari Dosen Pengampu untuk menyusun Buku

Pegangan Kuliah

Buku Pegangan Kuliah Bahasa Rakitan ini diterbitkan dalam upaya meningkatkan dan

mengefektifkan proses belajar mengajar di Politeknik Pratama Mulia Surakarta, khususnya

pada jurusan Teknik Komputer.

Untuk lebih mendalami masalah Bahasa Rakitan tidak hanya berpegangan pada buku

ini saja, mahasiswa diharapkan membaca buku-buku referensi yang lain.

Ucapan terima kasih disampaikan kepada semua pihak yang telah berpartisipasi dalam

penerbitan buku ini. Saran dan kritik yang konstruktif dari para dosen, pembaca dan mahasiswa

sangat diharapkan, demi perbaikan dan penyempurnaan penerbitan di masa akan datang.

Semoga buku ini bermanfaat bagi para pemakai dalam rangka peningkatan mutu

pendidikan di Politeknik Pratama Mulia Surakarta

Surakarta, April 2013

Drs. Sunaryo NIP. 131283272

Agus Haryawan - Politama Surakarta

Page 3: Bahasa Rakitan1

ii

DAFTAR ISI

Bab 1 Mikroprosesor, Memori dan Register 1

1.1 Register 1

1.1.1 Pengertian Register 1

1.1.2 Jenis-Jenis Register 1

1.2 Pengetahuan Dasar Program Assembler 3

1.3 Konstruksi Program Assembler 3

1.3.1 Assembler Directive 4

1.3.2 Pembentukan Variabel dan Konstanta Secara Assembler 5

1.3.3 Membuat Program Dengan Bahasa Assembler (Program COM dan EXE) 5

1.3.4 Perbedaan Program COM dan EXE 7

1.3.5 Membuat program dengan Turbo Assembler dan Turbo Linker 8

1.3.6 Instruksi MOV 9

1.3.7 Instruksi INT 10

1.4 Memulai Program Assembler 10

Bab 2 Mode Akses Memori, Penggunaan Variabel Dan Stack 12

2.1 Mode Pengalamatan atau Pengaksesan 12

2.1.1 Mode Pengalamatan Register dan Segera 13

2.1.2 Mode Pengalamatan Langsung 13

2.1.3 Mode Pengalamatan Tak-langsung Register 14

2.1.4 Mode Pengalamatan Relatif Dasar 14

2.1.5 Mode Pengalamatan Langsung Terindeks 14

2.1.6 Mode Pengalamatan Dasar Terindeks 15

2.1.7 Variabel Dan Penggunaannya 15

2.2 Larik Dan Penggunaannya 15

2.3 Memperoleh Alamat Suatu Variabel 16

2.4 Konstanta 17

2.5 Stack 17

Bab 3 Instruksi 80X86 20

3.1 Instruksi Transfer Data 20

3.2 Instruksi Aritmetika 23

3.3 Instruksi Manipulasi Bit 27

3.4 Instruksi Kontrol Aliran Program 29

3.5 Instruksi String 36

3.6 Instruksi Interupsi 41

3.7 Instruksi Kontrol Prosesor 41

Agus Haryawan - Politama Surakarta

Page 4: Bahasa Rakitan1

iii

Bab 4 Interupsi 43

4.1 Pendahuluan 43

4.2 Daftar Interupsi Pilihan 43

Bab 5 Procedure dan Makro 53

5.1 Procedure 53

5.1.1 Membuat Procedure 53

5.1.2 Menggunakan Procedure 53

5.2 Macro 55

5.2.1 Membuat Makro 55

5.2.2 Label Pada Makro 56

5.3 Macro atau Procedure 57

Bab 6 Contoh-Contoh Program Untuk Latihan 58

Agus Haryawan - Politama Surakarta

Page 5: Bahasa Rakitan1

1

B A B I

1 MIKROPROSESOR, MEMORI DAN REGISTER

1.1 REGISTER

1.1.1 Pengertian Register

Dalam pemrograman dengan bahasa Assembly, mau tidak mau anda harus

berhubungan dengan apa yang dinamakan sebagai Register. Lalu apakah yang dimaksudkan

dengan register itu sebenarnya ?.

Register merupakan sebagian memori dari mikroprosesor yang dapat diakses dengan

kecepatan yang sangat tinggi. Dalam melakukan pekerjaannya mikroprosesor selalu

menggunakan register-register sebagai perantaranya, jadi register dapat diibaratkan sebagai

kaki dan tangannya mikroprosesor.

1.1.2 Jenis-Jenis Register

Register yang digunakan oleh mikroprosesor dibagi menjadi 5 bagian dengan tugasnya

yang berbeda-beda pula, yaitu :

Segmen Register.

Register yang termasuk dalam kelompok ini terdiri atas register CS,DS,ES dan SS yang

masing-masingnya merupakan register 16 bit. Register-register dalam kelompok ini secara

umum digunakan untuk menunjukkan alamat dari suatu segmen.

Register CS (Code Segment) digunakan untuk menunjukkan tempat dari segmen yang

sedang aktif, sedangkan register SS(Stack Segment) menunjukkan letak dari segmen yang

digunakan oleh stack. Kedua register ini sebaiknya tidak sembarang diubah karena akan

menyebabkan kekacauan pada program anda nantinya.

Register DS (Data Segment) biasanya digunakan untuk menunjukkan tempat segmen di

mana data-data pada program disimpan. Umumnya isi dari register ini tidak perlu diubah kecuali

pada program residen. Register ES (Extra Segment), sesuai dengan namanya adalah suatu

register bonus yang tidak mempunyai suatu tugas khusus. Register ES ini biasanya digunakan

untuk menunjukkan suatu alamat di memory, misalkan alamat memory video.

Pada prosesor 80386 terdapat tambahan register segment 16 bit, yaitu ES(Extra

Segment) dan GS<Extra Segment>.

Pointer dan Index Register.

Register yang termasuk dalam kelompok ini adalah register SP,BP,SI dan DI yang

masing-masing terdiri atas 16 bit. Register- register dalam kelompok ini secara umum

digunakan sebagai penunjuk atau pointer terhadap suatu lokasi di memory.

Register SP (Stack Pointer) yang berpasangan dengan register segment SS(SS:SP)

digunakan untuk menunjukkan alamat dari stack, sedangkan register BP(Base Pointer)yang

berpasangan dengan register SS(SS:BP) mencatat suatu alamat di memory tempat data.

Register SI (Source Index) dan register DI (Destination Index) biasanya digunakan pada

Agus Haryawan - Politama Surakarta

Page 6: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

2

operasi string dengan mengakses secara langsung pada alamat di memory yang ditunjukkan

oleh kedua register ini.

Pada prosesor 80386 terdapat tambahan register 32 bit, yaitu ESP,EBP,ESI dan EDI.

General Purpose Register.

Register yang termasuk dalam kelompok ini adalah register AX,BX,CX dan DX yang

masing-masing terdiri atas 16 bit. Register- register 16 bit dari kelompok ini mempunyai suatu

ciri khas, yaitu dapat dipisah menjadi 2 bagian di mana masing-masing bagian terdiri atas 8 bit,

seperti pada gambar 4.1. Akhiran H menunjukkan High sedangkan akhiran L menunjukkan Low.

+ A X + + B X + + C X + + D X +

+-+--+--+-+ +-+--+--+-+ +-+--+--+-+ +-+--+--+-+

| AH | AL | | BH | BL | | CH | CL | | DH | DL |

+----+----+ +----+----+ +----+----+ +----+----+

Secara umum register-register dalam kelompok ini dapat digunakan untuk berbagai

keperluan, walaupun demikian ada pula penggunaan khusus dari masing-masing register ini

yaitu :

Register AX, secara khusus digunakan pada operasi aritmetika terutama dalam operasi

pembagian dan pengurangan.

Register BX, biasanya digunakan untuk menunjukkan suatu alamat offset dari suatu

segmen.

Register CX, digunakan secara khusus pada operasi looping di mana register ini

menentukan berapa banyaknya looping yang akan terjadi.

Register DX, digunakan untuk menampung sisa hasil pembagian 16 bit.

Pada prosesor 80386 terdapat tambahan register 32 bit, yaitu EAX,EBX,ECX dan EDX.

Index Pointer Register

Register IP berpasangan dengan CS(CS:IP) menunjukkan alamat di memory tempat

dari instruksi (perintah) selanjutnya yang akan dieksekusi. Register IP juga merupakan register

16 bit. Pada prosesor 80386 digunakan register EIP yang merupakan register 32 bit.

Flags Register.

Sesuai dengan namanya Flags (Bendera) register ini menunjukkan kondisi dari suatu

keadaan (ya atau tidak). Karena setiap keadaan dapat digunakan 1 bit saja, maka sesuai

dengan jumlah bitnya, Flags register ini mampu mencatat sampai 16 keadaan. Adapun flag

yang terdapat pada mikroprosesor 8088 ke atas adalah :

OF (OverFlow Flag) Jika terjadi OverFlow pada operasi aritmetika, bit ini akan bernilai 1.

SF (Sign Flag) Jika digunakan bilangan bertanda bit ini akan bernilai 1.

ZF (Zero Flag) Jika hasil operasi menghasilkan nol, bit ini akan bernilai 1.

CF (Carry Flag) Jika terjadi borrow pada operasi pengurangan atau carry pada penjumlahan, bit ini akan bernilai 1.

PF (Parity Flag) Digunakan untuk menunjukkan paritas bilangan. Bit ini akan bernilai 1 bila bilangan yang dihasilkan merupakan bilangan genap.

DF (Direction Flag) Digunakan pada operasi string untuk menunjukkan arah proses.

Agus Haryawan - Politama Surakarta

Page 7: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

3

IF (Interrupt Enable Flag)

CPU akan mengabaikan interupsi yang terjadi jika bit ini 0.

TF (Trap Flag) Digunakan terutama untuk debugging, dengan operasi step by step.

AF (Auxiliary Flag) Digunakan oleh operasi BCD, seperti pada perintah AAA.

NT (Nested Task) Digunakan pada prosesor 80286 dan 80386 untuk menjaga jalannya interupsi yang terjadi secara beruntun.

IOPL (I/O Protection level)

Flag ini terdiri atas 2 bit dan digunakan pada prosesor 80286 dan 80386 untuk mode proteksi.

1.2 PENGETAHUAN DASAR PROGRAM ASSEMBLER

Bahasa Assembler adalah bahasa komputer yang kedudukannya di antara bahasa

mesin dan bahasa level tinggi seperti bahasa C atau Pascal. Bahasa C atau Pascal dikatakan

sebagai bahasa level tinggi karena memakai kata-kata dan pernyataan yang mudah dimengerti

manusia, meskipun masih jauh berbeda dengan bahasa manusia sesungguhnya. Bahasa

mesin adalah kumpulan kode biner yang merupakan instruksi'yang bisa dijalankan oleh

komputer. Sedangkan bahasa Assembler memakai kode Mnemonic untuk menggantikan kode

biner, agar lebih mudah diingat sehingga lebih memudahkan penulisan program.

Program yang ditulis dengan bahasa Assembler terdiri dari label, kode mnemonic dan

lain sebagainya, pada umumnya dinamakan sebagai program sumber (source code) yang

belum bisa diterima oleh prosesor untuk dijalankan sebagai program, tapi harus diterjemahkan

dulu menjadi bahasa mesin dalam bentuk kode biner.

Program sumber dibuat dengan program editor biasa, misalnya NotePad pada

Windows atau Edit.com pada DOS, selanjutnya program sumber diterjemahkan ke bahasa

mesin dengan menggunakan program Assembler. Hasil kerja program Assembler adalah

"program objek" dan juga "assembler listing.

Assembler Listing merupakan naskah yang berasal dari program sumber, dalam naskah

tersebut pada bagian sebelah setiap baris dari program sumber diberi tambahan hasil

terjemahan program Assembler. Tambahan tersebut berupa nomor memori-program berikut

dengan kode yang akan diisikan pada memori-program bersangkutan. Naskah ini sangat

berguna untuk dokumentasi dan sarana untuk menelusuri program yang ditulis.

1.3 KONSTRUKSI PROGRAM ASSEMBLER

Program sumber dalam bahasa Assembler menganut prinsip 1 baris untuk satu perintah,

setiap baris perintah tersebut bisa terdiri atas beberapa bagian (field), yakni:

- label (untuk menandai suatu baris)

- mnemonic (OpCode / Kode Operasi)

- operand (yang bisa lebih dari satu)

- komentar (untuk keterangan atau catatan mengenai baris atau blok program)

Untuk membedakan masing-masing bagian tersebut dibuat ketentuan sebagian berikut:

Agus Haryawan - Politama Surakarta

Page 8: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

4

1. Masing-masing bagian dipisahkan dengan spasi atau TAB, khusus untuk operand yang lebih

dari satu masing-masing operand dipisahkan dengan koma.

2. Bagian-bagian tersebut tidak harus semuanya ada dalam sebuah baris, jika ada satu bagian

yang tidak ada maka spasi atau TAB sebagai pemisah bagian tetap harus ditulis.

3. Bagian Label ditulis mulai huruf pertama dari baris, jika baris bersangkutan tidak

mengandung Label maka label tersebut digantikan dengan spasi atau TAB, yakni sebagai

tanda pemisah antara bagian Label dan bagian mnemonic.

.MODEL SMALL

.CODEORG 100h

TData :JMP Proses ; Lompat ke Proses

Proses :MOV AX,13h ; AX=13hSUB BX,AX ; Kurangkan BX-AXMOV DX,BX ; DX=BXMOV AX,30H ; AX=30hSBB BX,AX ; Kurangkan BX-AXMOV BX,AX

INT 20h ; Kembali ke DOSEND TData

Label OpCode Operand Komentar

1.3.1 Assembler Directive

Seperti sudah dibahas di atas, bagian Mnemonic dari sebuah baris perintah bisa

merupakan instruksi untuk prosesor, maupun berupa Assembler Directive untuk mengatur kerja

dari program Assembler. Mnemonic untuk instruksi prosesor, sangat tergantung pada prosesor

yang dipakai, sedangkan mnemonic untuk Assembler Directive tergantung pada program

Assembler yang dipakai.

Meskipun demikian, terdapat beberapa Assembler Directive yang umum, yang ' untuk

banyak macam program Assembler.

Assembler Directive yang bersifat umum tersebut, antara lain adalah

ORG

singkatan dari ORIGIN, untuk menyatakan nomor memori yang dipakai setelah perintah itu,

misalnya ORG $1000 maka memori berikutnya yang dipakai Assembler adalah $1000. ORG

berlaku untuk memori program maupun memori data. Dalam hal penomoran memori, dikenal

tanda $ sebagai awalan untuk menyatakan nomor memori dari baris bersangkutan.

Misalnya: ORG 1000 LJMP$+1000

Operand $+$500 mempunyai arti nomor memori program bersangkutan ditambah dengan

$500, karena instruksi LJMP ini terletak persis di bawah ORG $1000 maka nomor memori

program baris ini adalah $1000, sehingga operand $+$500 bernilai $1500 dan instruksi ini

identik dengan LJMP $1500

EQU

singkatan dari EOUATE, dipakai untuk menentukan nilai sebuah Symbol.

Agus Haryawan - Politama Surakarta

Page 9: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

5

Misalnya: ANGKA88 EQU, 88 memberi nilai 88 pada Symbol ANGKA88, atau CR EQU $0D

mempunyai makna kode ASCII dari CR (Carriage Retum) adalah $08.

DB

singkatan dari DEFINE BYIE, dipakai untuk memberi nilai tertentu pada memori-program.

Nilai tersebut merupakan nilai 1 byte, bisa berupa angka ataupun kode ASCII. DB

merupakan Assembler Directive yang dipakai untuk membentuk teks maupun tabel.

ORG $0200

STRING DB 'AtmelAT89C2051'

PANJANG ELU $-STRING

ORG $0200 memerintahkan program Assembler agar bekerja mulai dari memori-program

nomor $0200, instruksi selanjutnya memerintahkan program Assembler agar mengisi

memori-program nomor $0200 dan berikutnya dengan tulisan 'Atmel AT89C2051" (yang

diisikan adalah kode ASCII dari 'A', 't' dan seterusnya), PANJANG dari STRING bisa dihitung

dengan cara PANJANG EQU $-STRING, yakni selisih dari nomor memori-program baris

bersangkutan dikurangi dengan nomor awal memori-program yang diisi STRING.

DW

singkatan dari DEFINE WORD, dipakai untuk memberi nilai 2 byte ke memori-program pada

baris bersangkutan. Assembler Directive ini biasa dipakai untuk membentuk suatu tabel yang

isinya adalah nomor-nomor memori-program.

DS

singkatan dari Define Storage, Assembler Directive ini dipakai untuk membentuk variabel.

Sebagai variabel tentu saja memori yang dipakai adalah memori-data (RAM) bukan memori-

program (ROM). Hal ini harus benar-benar dibedakan dengan Assembler Directive DB dan

DW yang membentuk kode di memori-program. Dan karena DS bekerja di RAM, maka DS

hanya sekedar menyediakan tempat di memori, tapi tidak mengisi nilai pada memori

bersangkutan.

1.3.2 Pembentukan Variabel dan Konstanta Secara Assembler

Assembler dilengkapi dengan pengatur program Assembler {assembler directive) untuk

mengisi berbagai macam data ke memori-program. Ada 2 macam pengatur program Assembler

(assembler directive), yakni DB (Define Byte) dan DW (Define Word). DB dipakai untuk

membentuk data byte demi byte, sedangkan DW dipakai untuk membentuk data 2 byte yang

merupakan alamat (nomor memori).

DB singkatan dari Define Byte, memerintah Assembler agar mengisi memori-program

dengan data-data yang tercantum dalam operand. Operand dari perintah DB bisa hanya satu,

tapi bisa berapa pun sejauh baris untuk menulis perintah tersebut masih cukup menampung.

Seperti biasa kalau terdapat banyak operand, maka operand satu dengan yang lain dipisahkan

dengan tanda koma. DB sering dipakai untuk membentuk tabel dalam memori-program.

Define Word (DW) merupakan pengatur program Assembler (assembler directive) untuk

mengisi memori-program seperti DB, tapi yang diisikan adalah nomor memori yang panjangnya

2 byte.

1.3.3 Membuat Program Dengan Bahasa Assembler (Program

Agus Haryawan - Politama Surakarta

Page 10: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

6

COM dan EXE)

Program COM

Untuk membuat program .COM yang hanya menggunakan 1 segment, bisa anda buat

dengan model program seperti gambar di bawah ini. Bentuk yang digunakan di sini 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).

-----------------------------------------------------------

.MODEL SMALL

.CODE

ORG 100H

Label1 : JMP Label2

+---------------------+

| TEMPAT DATA PROGRAM |

+---------------------+

Label2 : +---------------------+

| TEMPAT PROGRAM |

+---------------------+

INT 20H

END Label1

-----------------------------------------------------------

Model Program COM

Supaya lebih jelas bentuk dari program ideal, marilah kita telusuri lebih lanjut dari bentuk

program ini.

MODEL SMALL

Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk memory

yang digunakan oleh program kita. Model inilah yang akan sering kita pakai pada buku ini,

karena data dan code yang digunakan oleh program kurang dari ukuran 1 segment atau 64 KB.

Model yang lain seperti TINY, MEDIUM, COMPACT, LARGE dan HUGE akan kita gunakan

pada kesempatan lain.

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.

Agus Haryawan - Politama Surakarta

Page 11: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

7

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 kendali

sepenuhnya 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.

1.3.4 Perbedaan Program COM dan EXE

Program dengan ektensi COM dan EXE mempunya berbagai perbedaan yang

menyolok, antara lain :

PROGRAM COM :

- Lebih pendek dari file EXE

- Lebih cepat dibanding file EXE

- Hanya dapat menggunakan 1 segmen

- Ukuran file maksimum 64 KB (ukuran satu segment)

- Sulit untuk mengakses data atau procedure yang terletak pada segment yang

lain.

- 100h byte pertama merupakan PSP(Program Segment Prefix) dari program

tersebut.

- Bisa dibuat dengan DEBUG

PROGRAM EXE :

- Lebih panjang dari file COM

Agus Haryawan - Politama Surakarta

Page 12: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

8

- Lebih lambat dibanding file COM

- Bisa menggunakan lebih dari 1 segmen

- Ukuran file tak terbatas sesuai dengan ukuran memory.

- Mudah mengakses data atau procedure pada segment yang lain.

- Tidak bisa dibuat dengan DEBUG

1.3.5 Membuat program dengan Turbo Assembler dan Turbo

Linker

Untuk membuat program COM dan EXE dengan Turbo Assembler dan Turbo Linker,

prosedurnya adalah sebagai berikut:

1. Tuliskan program sumber Assembler dengan menggunakan salah satu dari berbagai

program text editor, misalnya:

- Notepad (dijalankan melalui Start Menu Window atau dengan meng-click file program,

sumber pada Windows Explorer)

Catatan: Karena Notepad menyimpan teks dengan ekstensi default .TXT, maka untuk

menyimpan dengan ekstensi .ASM, kita tuliskan nama filenya dengan diapit tanda petik “

“.

Menyimpan dengan nama baru,

nama file diapit tanda petik

Agus Haryawan - Politama Surakarta

Page 13: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

9

- EDIT.COM (dijalankan melalui DOS Prompt dengan mengetikkan EDIT <ENTER>

File program sumber harus berekstensi .ASM

2. Compile file program sumber menggunakan TASM dengan cara mengetikkan di DOS

Prompt sebagai berikut:

TASM [nama_file_program_sumber]

Contoh, jika program sumber kita buat adalah LATIHAN.ASM maka ketikkan di DOS Prompt:

TASM LATIHAN

3. Lakukan linking file program sumber dengan cara mengetikkan di DOS Prompt sebagai

berikut:

- Untuk program COM:

TLINK/T [nama_file_program_sumber]

- Untuk program EXE:

TLINK [nama_file_program_sumber]

Contoh, jika program sumber LATIHAN.ASM di atas adalah program sumber COM, maka

ketikkan:

TLINK/T LATIHAN

Jika proses compiling dan linking berhasil (tidak ada pesan ERROR) maka akan

dihasilkan program COM atau EXE yang langsung dapat dijalankan di DOS Prompt.

1.3.6 Instruksi MOV

Instruksi MOV merupakan instruksi yang sering dipakai pada program assembler.

Instruksi ini digunakan untuk mengcopy nilai atau angka menuju ke suatu register, variabel atau

memory. Adapun syntax untuk instruksi MOV ini adalah:

MOV Tujuan,Asal

Contoh:

MOV AL,9 ; masukkan nilai 9 pada AL

MOV AH,AL ; nilai AL=9 dan AH=9

Agus Haryawan - Politama Surakarta

Page 14: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

10

Pada baris pertama (MOV AL,9), kita memberikan nilai 9 pada register AL. Kemudian

pada baris kedua (MOV AH,AL) kita mengcopykan nilai register AL untuk AH. Jadi, setelah

operasi ini, register AL akan tetap bernilai 9, dan register AH akan sama nilainya dengan AL

atau 9.

Yang perlu dicatat di sini bahwa semua instruksi pengcopyan data, arahnya dari kanan

ke kiri atau dari operand2 ke operand1:

MOV operand1,operand2

Begitu juga dengan instruksi pengcopyan data lainnya, seperti:

LEA operand1,operand2

1.3.7 Instruksi INT

Kita juga akan sering menggunakan instruksi ini. Syntax-nya adalah:

INT NoInt

Tiap-tiap nomor interrupt akan menghasilkan perintah yang berbeda. Sebagai contoh,

INT 20h merupakan instruksi untuk menghentikan proses eksekusi program assembler dan

kembali ke DOS.

INT 21h merupakan interrupt dari DOS, di mana perintah ini masih tergantung dari nilai

register AH yang kita berikan. Misalkan INT 21h service 09h adalah perintah untuk mencetak

string ke layar.

1.4 MEMULAI PROGRAM ASSEMBLER

Contoh 4.1

Ketikkan contoh program berikut dengan notepad dan simpan dengan nama MOD41.ASM

.MODEL SMALL

.CODE

ORG 100H

TData:

JMP Proses

TEKS DB “Hello, mari belajar bahasa Assembler$”

Proses:

LEA DX,TEKS

MOV AH,9H

INT 21H

INT 20H

END TData

Perhatikan bahwa karakter $ (dollar) pada teks “Hello, mari belajar bahasa Assembler$” harus

Agus Haryawan - Politama Surakarta

Page 15: Bahasa Rakitan1

Bab I Mikroprosesor, Memori dan Register

11

dituliskan.

Instruksi:

- Buatlah program COM dengan TASM dan TLINK/T, lalu jalankan!

- Ketikkan program di atas pada EMU8086 dan emulasikan!

Agus Haryawan - Politama Surakarta

Page 16: Bahasa Rakitan1

12

B A B I I

2 MODE AKSES MEMORI, PENGGUNAAN VARIABEL DAN

STACK

Pengaksesan memori yang dibicarakan dalam bab ini meliputi memori internal prosesor

yang biasa disebut sebagai register dan memori di luar prosesor. Pada bagian pertama akan

dibicarakan beberapa mode pengaksesan atau pengalamat kemudian dilanjutkan dengan

penggunaan variabel dalam Bahasa Assembler serta bagian akhir penjelasan tentang Stack.

2.1 MODE PENGALAMATAN ATAU PENGAKSESAN

Seperti diketahui bahwa instruksi-instruksi Assembly ada yang membutuhkan operan

baik satu maupun dua. Operan-operan ini dibutuhkan oleh instruksi yang bersangkutan,

misalnya MOV AX,BX, pada instruksi terlihat dibutuhkannya dua operan yaitu register AX dan

BX.

Prosesor saat menjalankan suatu instruksi bisa memperoleh operan dari register, dalam

instruksi itu sendiri, suatu lokasi memori atau port I/O (keluaran/ masukan). Secara garis besar

terdapat 7 (tujuh) macam mode pengalamatan, yaitu:

1. Pengalamatan register (register addressing);

2. Pengalamatan segera (immediate addressing);

3. Pengalamat langsung (direct addressing);

4. Pengalamatan tak-langsung register (register indirect addressing);

5. Pengalamatan relatif dasar (base relative addressing);

6. Pengalamatan langsung terindeks (direct indexed addressing); dan

7. Pengalamatan dasar terindeks (base indexed addressing).

8. Masing-masing mode tersebut masing-masing memiliki ciri khas tersendiri, perhatikan tabel

3.1. Untuk dua mode pengalamatan yang pertama, register dan segera, tidak membutuhkan

segmen karena operannya berupa register atau data langsung. Lima mode terakhir (mode 3

hingga 7) merupakan mode pengalamatan memori.

Mode pengalamatan Format operan Register segmen

Register Register Tidak ada

Segera Data Tidak ada

Langsung Pergeseran DS

Label DS

Tak-langsung register [BX] DS

[BP] SS

[DI] DS

[SI] DS

Relatif dasar [BX] + pergeseran DS

[BP] + pergeseran SS

Langsung terindeks [DI] + pergeseran DS

[SI] + pergeseran DS

Dasar terindeks [BX][SI] + pergeseran DS

Agus Haryawan - Politama Surakarta

Page 17: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

13

[BX][DI] + pergeseran DS

[BP][SI] + pergeseran SS

[BP][DI] + pergeseran SS

2.1.1 Mode Pengalamatan Register dan Segera

Pada mode pengalamatan register, prosesor akan mengambil operan dari suatu register,

misalnya instruksi:

MOV AX,CX

digunakan untuk menyalin isi register AX (16-bit atau word) ke register CX (16-bit juga),

dengan kata lain menyamakan register AX dan CX.

Sedangkan pada mode pengalamatan segera, prosesorakan mengambil operan

langsung dari instruksi yang bersangkutan, yaitu berupa data atau konstanta byte maupun

word, misalnya instruksi:

ADD AX,0034h

digunakan untuk menambahkan isi register AX dengan data 34h dan hasilnya disimpan

di AX kembali.

2.1.2 Mode Pengalamatan Langsung

Dalam mode pengalamatan memori dikenal adanya istilah alamat efektif atau effective

address. Alamat efektif ini merupakan jarak dalam byte dari awal segmen hingga lokasi memori

atau operan yang bersangkutan. Alamat efektif ini juga disebut sebagai offset bersama dengan

segmen membentuk alamat fisik dengan persamaan:

Alamat fisik = offset + (segmen x 16)

segmen yang dikalikan 16 artinya digeser ke kiri 4-bit, dengan demikian jika dituliskan

suatu alamat logik CS:IP = 2340:0100, maka alamat fisiknya adalah:

23400 - segmen digeser ke kiri 4 bit atau l digit heksa

0100 - offset

23500

Dengan mode pengalamatan langsung, offset atau alamat efektif ada di dalam instruksi

yang bersangkutan (menjadi satu dengan instruksi tersebut, sama seperti mode pengalamatan

segera). Operan pengalamatan langsung biasanya berupa label, misalnya:

MOV AX,TABEL

Instruksi ini digunakan untuk menyalin isi lokasi memori yang ditunjuk oleh label TABEL

(sebelumnya harus didefinisikan dulu) ke register AX. Perhatikan contoh program berikut ini:

; program contoh mode pengalamatan langsung

;

ORG lOOh

JMP START ; mulai dari START

TABEL DW 2345h ; definisikan TABEL

start:

MOV DX,TABEL

INT 20H

Ketik dan jalankan menggunakan emulator program ini. Perhatikan saat dijalankan per

instruksi, TABEL diberikan lokasi 0102h, sebagaimana ditunjukkan pada gambar 3.1, isi memori

Agus Haryawan - Politama Surakarta

Page 18: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

14

pada lokasi 0102h=45 dan 0103h=23, dalam hal ini cara penyimpanannya menggunakan

metode Litle Endian, artinya yang bobot digitnya kecil ditaruh belakangan (di lokasi

berikutnya). Setelah selesai Anda jalankan, perhatikan bahwa sekarang register DX berisi

data2345h.

2.1.3 Mode Pengalamatan Tak-langsung Register

Pada mode pengalamatan tak-langsung register ini, alamat offset operan disimpan

dalam register dasar BX, register penunjuk dasar BP atau register indeks SI atau DI. Perhatikan

contoh program berikut ini:

; program contoh mode pengalamatan tak-langsung register

ORG lOOh

start:

MOV BX,010AH ; BX diisi dulu

MOV DX,[BX] ; mode tak-langsung register

INT 20H

Perhatikan untuk contoh ini kita isi dulu register BX dengan nilai 010Ah, kita tidak tahu

pada lokasi 01 OAh tersebut berisi data atau nilai berapa kecuali setelah kita jalankan

emulatornya. Hasil eksekusi program ini berupa isi DX yang berubah menjadi isi memori lokasi

010Ah yaitu 168B.

2.1.4 Mode Pengalamatan Relatif Dasar

Pada mode pengalamatan ini, alamat efektif dihitung dengan cara menjumlahkan nilai

pergerseran dengan isi register dasar BX atau BP. Perhatikan contoh program berikut ini:

; program contoh mode pengalamatan relatif dasar

ORG lOOh

start:

MOV BX,010AH ; BX diisi dulu

MOV DX,[BX]+2 ; mode relatif dasar

INT 20H

Seperti pada contoh sebelumnya, register BX diisi dengan nilai 010Ah terlebih dahulu,

kemudian lokasi memori yang ditunjuk oleh [BX]+2 yaiti 010Ah+2 atau 010Ch disalin ke register

DX. Selain cara penulisan seperti pada contoh program tersebut, Anda bisa juga menuliskan

dengan cara:

MOV DX,2[BX] ; seperti ini, atau

MOV DX, [BX+2] ; seperti ini

2.1.5 Mode Pengalamatan Langsung Terindeks

Dengan mode pengalamatan langsung terindeks, alamat efektif merupakan jumlah dari

pergeseran dengan register indeks SI atau DI. Perhatikan contoh program berikut ini:

; program contoh mode pengalamatan langsung terindeks

ORG lOOh

JMP START

TABEL DB 45H,23H,12H ; pertama indeks-nya 0

START:

MOV DI,2 ; disalin indeks ke-2

MOV AL,TABEL[DI] ; ke register AL

INT 20H

Seperti pada contoh program yang pertama, kita definisikan dulu sebuah data TABEL,

yaitu 45h, 23h dan 12h. Data pertama berindeks 0 dan akan disalin data yang ketiga atau

Agus Haryawan - Politama Surakarta

Page 19: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

15

berindeks 2 ke register AL (melalui register DI yang diisi 2). Melalui emulator terlihat bahwa

TABEL diberikan lokasi 0102h hingga 0104h, sebagaimana ditunjukkan pada gambar 3.3. Hasil

eksekusi program ini berupa isi register AL yang berubah menjadi 12h (silahkan dicek pada

emulator).

2.1.6 Mode Pengalamatan Dasar Terindeks

Dalam mode pengalamatan ini (dasar terindeks), alamat efektif merupakan jumlahan

register dasar, register indeks dan (opsional) pergeseran. Mode pengalamatan ini sangat cocok

untuk akses data larik dua dimensi. Perhatikan contoh program berikut:

ORG lOOh

OMP START

TABEL DB 45H,23H,12H,56H,89H ; pertama indeks-nya 0

START:

MOV DI, 2 ; disalin indeks ke-2

MOV BX,l ; salin indeks ke-1

MOV AL,TABEL[DI+BX+1] ; ke register AL

INT 20H

Mirip dengan program sebelumnya, sekarang TABEL kita perpanjang hingga 5 data (dari

indeks 0 sampai 4). Register indeks yang digunakan adalah DI (dengan diisi 2), reister dasar

yang digunakan adalah BX (dengan diisi 1) kemudian pergeseran diisi dengan 1, sehingga total

indeks yang digunakan adalah 2+1+1 = 4 atau data ke-5. Setelah program dijalankan,

perhatikan bahwa register AL akan berisi 89H (perhatikan pada emulator).

2.1.7 Variabel Dan Penggunaannya

Sebagaimana dikenal dalam bahasa pemrograman lainnya (Pascal, BASIC, C, C++ dan

lain-lain), variabel adalah nama dari suatu lokasi memori. Dari kacamata pemrogram, akan lebih

mudah untuk menyimpan suatu nilai dalam sebuah variabel dengan nama, misalnya, dataOI

daripada meyimpan dengan alamat langsung memori, misalnya, 5A88:1239, apalagi jika data

yang akan disimpan dalam jumlah yang cukup banyak.

Emu8086 mendukung dua jenis variabel, yaitu BYTE, dengan lebar data 8-bit dan

WORD, dengan lebar data 16-bit. Sintaks atau cara penulisan deklarasi variabel dalam

Emu8086 sebagai berikut:

nama DB nilai

nama DW nilai

DB - kepanjangan dari Def ine Byte, dan DW - kepanjangan dari Define Word

nama - dapat sembarang kombinasi huruf atau angka, diawali dengan huruf.

Dimungkinkan juga mendeklarasikan variabel yang tidak bernama (variabel jenis ini memiliki

alamat tapi tidak memiliki nama).

nilai - dapat sembarang nilai numerik dalam berbagai macam format yang didukung

(desimal, biner dan heksadesimal) atau gunakan simbol ? untuk variabel-variabel yang belum

akan diisi (tidak diinisialisasi).

2.2 LARIK DAN PENGGUNAANNYA

Larik atau araydapat dilihat sebagai serangkaian variabel-variabel. String teks

merupakan contoh larik byte, masing-masing karakter dinyatakan dalam kode ASCII (dalam

Agus Haryawan - Politama Surakarta

Page 20: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

16

ukuran byte dari 0 hingga 255).

Berikut ini contoh definisi larik:

a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h

b DB ‘Hello', 0

b merupakan salinan persis dari a, saat kompiler menemui suatu string di antara tanda

petik tunggal, maka secara otomatis akan dikonversikan ke kode ASCII. Pada gambar 3.5

ditunjukkan bagian memori yang menyimpan larik yang telah dideklarasikan sebelumnya.

Anda bisa mengakses sembarang nilai elemen dalam larik menggunakan kurung siku,

misalnya:

MOV AL,a[3]

Selain dengan cara menuliskan langsung indeksnya, seperti contoh sebelumnya, Anda

bisa juga menggunakan register indeks BX, SI, DI atau BP, misalnya:

MOV SI,3

MOV AL,a[SI]

Perhatikan contoh program berikut ini:

ORG lOOh

MOV AH,A[3]

MOV SI,4

MOV AL,B[SI]

RET

A DB 48H, 65H, 6CH, 6CH, 6FH, OOH

B DB 'Hellb',0

Jika Anda ingin mendeklarasikan suatu larik yang besar, Anda bisa menggunakan

operator DUP. Caranya:

angka DUP(nilai)

angka diisi dengan jumlah duplikasi yang ingn dibuat (sembarang angka), sedangkan

nilai diisi dengan ekspresi yang akan diduplikasi, misalnya:

c DB 5 DUP(9)

artinya, menduplikasi angka 9 sebanyak 5 kali, sama dengan jika dituliskan:

c DB 9,9,9,9,9

Contoh lain:

d DB 5 DUP(l,2)

sama dengan jika dituliskan:

d DB l,2,l,2,l,2,l,2,l,2

Tentu saja Anda bisa menggunakan DW selain DB, tetapi DW tidak bisa digunakan

untuk mendeklarasikan string!

Ekspansi dengan operan DUP tidak boleh lebih dari 1020 karakter! Ekspansi yang

terakhir hanya 12 karakter, dihitung setelah DB. Jika Anda ingin mendeklarasikan suatu larik

yang besar, buatlah deklarasinya menjadi 2 baris, toh pada akhirnya Anda akan mendapatkan

sebuah larik besar sesuai keinginan.

2.3 MEMPEROLEH ALAMAT SUATU VARIABEL

Ada sebuah instruksi, yaitu LEA (Load Effective Address) dan operan alternatif OFFSET,

yang dapat digunakan untuk memperoleh alamat offset dari suatu variabel.

Agus Haryawan - Politama Surakarta

Page 21: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

17

Instruksi LEA lebih ampuh, karena membolehkan Anda mendapatkan alamat sari suatu

variabel terindeks (seperti larik). Memperoleh alamat dari suatu variabel akan sangat

bermanfaat dalam beberapa situasi atau kasus, misalnya, saat Anda ingin mengambil suatu

parameter ke suatu prosedur.

Untuk memberitahukan kompiler tipe data yang digunakan, maka prefiks berikut harus

digunakan:

BYTE PTR

WORD PTR

Misalnya:

BYTE PTR [BX] ; akses byte, atau

WORD PTR [BX] ; akses word

Perhatikan contoh program berikut:

ORG lOOh

MOV AL, VARl ; nilai VARl disalin ke AL

LEA BX, VARl ; ambil alamat VARl simpan di BX

MOV BYTE PTR [BX],44H ; ganti isi dari VARl

MOV AL, VARl ; periksa nilai VARl (ke AL)

RET

VARl DB 22H

END

Juga perhatikan pada contoh yang lainnya (tetapi fungsinya sama):

ORG l00h

MOV AL, VAR1 ; nilai VARl disalin ke AL

MOV BX, OFFSET VARl ; ambil alamat VARl simpan di BX

MOV BYTE PTR [BX], 44H ; ganti isi dari VARl

MOV AL, VAR1 ; periksa nilai VARl (ke AL

RET

VARl DB 22H

END

Sekilas kedua program tersebut sama persis, tetapi ada perbedaan dalam cara

mendapatkan offset dari variabel VAR1.

2.4 KONSTANTA

Konstanta sama seperti variabel, tetapi konstanta hanya akan eksis (ada) hingga

program Anda dikompilasi. Setelah suatu konstanta didefinisikan, maka nilainya tidak bisa

diubah. Cara pendefinisian konstanta sebagai berikut:

nama EQU <ekspresi>

Misalnya:

k EQU 5

MOV AX,k

Akan identik dengan instruksi:

MOV AX,5

2.5 STACK

Stack adalah bagian memori yang digunakan untuk menyimpan data-data sementara.

Lantas apa bedanya dengan bagian memori data lainnya? Sifatnya, maksudnya? Sifat

Agus Haryawan - Politama Surakarta

Page 22: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

18

penyimpanannya adalah dengan teknik LIFO (Last In First Out) atau FILO (First In Last Ouf),

artinya, data-data yang dimasukkan pertama kali pengambilannya belakangan atau data yang

terakhir kali tersimpan dapat diambil paling awal, sama seperti menyimpan bola tenis pada

tabungnya, bola yang dimasukkan belakangan tidak bisa Anda ambil (kecuali ujung satunya

juga dibuka) kecuali harus mengambil bola-bola sebelumnya.

Lantas siapa atau instruksi apa yang melakukan cara penyimpanan seperti ini? Stack

digunakan oleh instruksi CALL, untuk menyimpan alamat instruksi berikutnya yang akan

dikerjakan saat memanggil suatu prosedur dan instruksi RET, saat mengembalikan kembali

instruksi yang telah disimpan sebelumnya dan prosesor kembali mengerjakan instruksi

berikutnya setelah yang ditinggalkan sebelumnya (karena adanya pemanggilan prosedur). Hal

ini juga terjadi saat suatu interupsi (dengan instruksi INT) dijalankan, yang akan menyimpan

registerflag, segmen kode dan offset ke dalam stack. Untuk kembali dari menjalankan interupsi

digunakan instruksi IRET (mirip dengan RET).

Selain dengan cara-cara tersebut, sekaligus dapat disimpulkan bahwa stack bisa

menyimpan data-data alamat instruksi, dapat digunakan dua instruksi lain yang secara eksplisit

(cara sebelumnya merupakan cara yang implisit atau tidak terang-terangan) menyimpan data

ke dalam stack, yaitu:

PUSH - menyimpan nilai 16-bit ke dalam stack

POP - mengambil data 16-bit dari stack

PUSH REG

PUSH SREG

PUSH memori

PUSH langsung

REG: AX, BX, CX, DX, DI, SI, BP, SP.

SREG: DS, ES, SS, CS

memori: [BX], [BX+SI+7], variabel 16-bit dan lain-lain

langsung: data langsung, misalnya, 5, -24,3FH dan lain-lain

Sedangkan untuk penggunaan instruksi POP:

POP REG

POP SREG

POP memori

REG: AX, BX, CX, DX, DI, SI, BP, SP.

SREG: DS, ES, SS

memori: [BX], [BX+SI+7], variabel 16-bit dan lain-lain

Catatan:

- Instruksi PUSH dan POP hanya bekerja untuk nilai 16-bit saja!

- PUSH langsung hanya bekerja untuk prosesor 80186 ke atas, untuk saat ini tentunya Anda

tidak perlu khawatir karena prosesornya sudah canggih.

Sangat penting sekali untuk menyamakan jumlah instruksi PUSH dan POP, jika tidak,

maka sfac/cakan terkorupsi dan akan menjadi tidak mungkin kembali ke sistem operasi yang

bersangkutan. Karena, sebagaimana diketahui, instruksi RET kita gunakan untuk kembali ke

sistem operasi, dengan demikian saat program mulai dijalankan sudah terdapat alamat untuk

kembali yang tersimpan di stack (biasanya 0000H).

Agus Haryawan - Politama Surakarta

Page 23: Bahasa Rakitan1

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

19

Instruksi PUSH dan POP sangat bermanfaat karena kita tidak banyak memiliki register-

register untuk operasional program, caranya:

- Simpan nilai asli register yang bersangkutan ke dalam stack (dengan PUSH)

- Gunakan register yang bersangkutan untuk operasional selanjutnya;

- Kembalikan lagi nilai asli register tersebut dari stack (dengan POP).

ORG lOOh

MOV AX, 1234h

PUSH AX ; simpan nilai AX asli ke stack

MOV AX, 5678h ; ubah isi dari AX

POP AX ; kembalikan nilai AX dari stack

RET

END

Instruksi PUSH melakukan hal sebagai berikut:

- Kurangkan 2 dari register SP (turunkan nilai SP);

- Tulis nilai yang diberikan PUSH ke alamat SS:SP.

Sedangkan instruksi POP melakukan hal sebagai berikut:

- Tulis nilai dari stack pada alamat SS:SP ke tujuan yang diberikan POP;

- Tambahkan nilai 2 ke register SP (naikkan nilai SP).

Manfaat lain dari stack adalah untuk menukar nilai, perhatikan contoh berikut:

MOV AX, 1212h ; simpan 1212h ke AX

MOV BX, 3434h ; simpan 3434h ke BX

PUSH AX ; simpan nilai AX ke stack

PUSH BX ; simpan nilai BX ke stack

POP AX ; set AX nilai BX

POP BX ; set BX nilai AX

Penukaran data bisa dilakukan melalui stack, karena, sebagaimana telah dijelaskan

sebelumnya, metode penyimpanan data dalam stack adalah LIFO atau FILO, dengan demikian

yang tersimpan pertama adalah 1212H berikutnya 3434H, dengan adanya perintah POP, data

teratas, yaitu 3434H akan terambil dan disalin ke BX.

Bagian memori stack diatur oleh register SS atau Stack Segmen? dan SP atau Stack

Pointer. Biasanya sistem operasi akan mengatur nilai-nilai dari register-register ini saat program

dijalankan.

Agus Haryawan - Politama Surakarta

Page 24: Bahasa Rakitan1

20

B A B I I I

3 INSTRUKSI 80X86

Pada bab ini akan dijelaskan secara ringkas (disertai dengan beberapa contoh program)

instruksi-instruksi 80x86. Instruksi-instruksi 80x86 dapat dikelompokkan menjadi 7 (tujuh)

kelompok instruksi, yaitu:

1. Instruksi Transfer Data, instruksi-instruksi yang digunakan untuk menyalin (memindahkan)

data atau informasi antar register dan lokasi memori atau I/O (keluaran/masukan).

2. Instruksi Aritmetika, instruksi-instruksi yang digunakan untuk melakukan penjumlahan,

pengurangan, perkalian dan pembagian pada bilangan-bilangan biner maupun BCD.

3. Instruksi Manipulasi Bit, instruksi-instruksi yang digunakan untuk melakukan penggeseran,

pemutaran dan operasi logika pada lokasi memori dan register.

4. Instruksi Kontrol Aliran Program, dapat mengubah aliran program, termasuk instruksi lompat

dan pindah dari dan ke prosedur.

5. Instruksi String, instruksi-instruksi yang terkait dengan string (sederetan karakter).

6. Instruksi Interupsi digunakan untuk menginterupsi prosesor dan mengerjakan layanan yang

dibutuhkan.

7. Instruksi Kontrol Prosesor digunakan untuk mengatur flag-flag status dan mengubah kondisi

eksekusi prosesor.

3.1 INSTRUKSI TRANSFER DATA

Instruksi transfer data akan menyalin atau memindahkan data dan alamat antar register

maupun lokasi-lokasi memori atau I/O. Pada tabel 4.1 ditunjukkan ringkasan kelompok instruksi

yang digunakan untuk transfer data yang terbagi menjadi 4 kelompok: serbaguna,

keluaran/masukan, pembacaan alamat dan transfer flag.

MOV

Merupakan instruksi yang paling banyak digunakan, MOV dapat mentrasfer data dalam

satuan byte maupun word antara register dan lokasi memori atau antar register. Selain itu dapat

digunakan untuk menyalin suatu nilai langsung ke suatu lokasi memori atau register.

Ada beberapa hal yang tidak dapat dilakukan dengan instruksi MOV, yaitu:

- Tidak dapat memindahkan data antar dua lokasi memori secara langsung, gunakan

perantaraan register, misalnya (diandalkan SINI dan SANA merupakan dua lokasi memori

yang berbeda):

MOV AX,SINI

MOV SANA,AX

- Tidak dapat langsung mengisi register segmen dengan suatu nilai, harus melalui register

lainnya (yang bukan register segmen juga), misalnya:

MOV AX,DATA_SEG

MOV DS,AX

- Tidak bisa menyalin isi suatu register segmen ke register segmen lainnya secara langsung,

harus melalui suatu register lainnya, misalnya:

Agus Haryawan - Politama Surakarta

Page 25: Bahasa Rakitan1

Bab III Instruksi 80X86

21

MOV AX,ES

MOV DS,AX

- Tidak bisa menggunakan register CS sebagai tujuan dalam instruksi MOV. Ingat bahwa

register CS berisi kode segmen dan harus dipertahankan nilainya selama eksekusi program.

PUSH dan POP

Sebagaimana telah dijelaskan pada sebelumnya tentang Stack berkaitan dengan

instruksi PUSH dan POP. Ditegaskan kembali bahwa instruksi CALL secara implisit akan

menyimpan alamat (offset) ke stacksedangkan instruksi RET akan mengambil kembali alamat

tersebut dari stack (untuk ditempatkan lagi ke register IP). Sedangkan instruksi PUSH secara

eksplisit akan menyimpan data 16-bit ke puncak dari stack, sedangkan instruksi POP akan

membaca data 16-bit dari puncak stack. Penjelasan lebih lengkap bisa Anda buka kembali bab

sebelumnya.

PUSHA dan POPA

Hampir sama dengan PUSH dan POP, hanya saja instruksi PUSHA akan menyimpan

beberapa register sekaligus ke dalam stack dengan urutan: AX, CX, DX, BX, SP, BP, SI dan DI.

Sedangkan instruksi POPA akan mengembalikan kembali nilai-nilai register tersebut (dengan

urutan pembacaan dibalik). Untuk lebih jelasnya perhatikan potongan program berikut:

MOV AX,1 ; simpan 1 ke AX

MOV BX,2 ; simpan 2 ke BX

MOV CX,3 ; simpan 3 ke CX

MOV DX,4 ; simpan 4 ke DX

PUSHA ; simpan AX,CX,DX,BX,SP,BP,SI dan DI ke

stack

XCHG

Instruksi XCHG atau exchange digunakan untuk menukar isi antara sumber dan tujuan

baik dalam satuan byte atau word. Anda bisa menukar isi dua register yang berbeda (kecuali

register segmen) atau antara register dengan lokasi memori, perhatikan potongan contoh

program berikut:

MOV AX,1234H ; simpan 1234H ke AX

MOV BX,5678H ; simpan 5678H ke BX

XCHG AX,BX ; menukar isi register AX dan BX

XCHG AH,BL ; menukar isi register AH dan BL

XLATB

Instruksi KLATB atau translate digunakan untuk melihat suatu nilai pada suatu tabel byte

dan menyimpannya ke register AL, panjang tabel bisa mencapai 256 byte. Sebelum

memberikan instruksi XLATB, Anda harus menyimpan alamat awal tabel ke dalam BX dan

indeksnya ke dalam AX. Perhatikan potongan contoh program berikut:

MOV AL,8 ; siapkan indeksnya di AL

MOV BX,OFFSET TABELKU ; siapkan offsetnya di BX

XLATB ; baca tabel sesuai indeks dan simpan

hasilnya di A

TABELKU DB 'Belajar Assembly',0

END

Perhatikan contoh program ini, sesuai dengan ketentuan, diinginkan membaca indeks

Agus Haryawan - Politama Surakarta

Page 26: Bahasa Rakitan1

Bab III Instruksi 80X86

22

ke-8 (diawali dari indeks 0) dari TABELKU (yaitu karakter 'A'), indeks ini disimpan ke dalam AL,

sedangkan awal atau offset dari TABELKU disimpan ke dalam BX, setelah dijalankan instruksi

XLATB, maka AL akan berisi 41H (kode ASCII untuk 'A'). Perhatikan hasil-hasil tersebut melalui

emulator Emu8086.

IN dan OUT

Instruksi IN digunakan untuk membaca masukan dari periferal atau masukan kemudian

disimpan dalam AL (untuk hasil pembacaan tipe byte) atau AX (untuk hasil pembacaan tipe

word). Operan yang kedua berupa nomor port. Jika dibutuhkan untuk mengakses port lebih dari

255, gunakan register DX.

Sedangkan instruksi OUT digunakan untuk mengirimkan data atau informasi yang

tersimpan dalam AL (ukuran byte) atau AX (ukuran word) ke suatu nomor port (operan

pertama), gunakan register DX jika nomor port yang diakses lebih dari 255.

LEA

Instruksi LEA atau Load Effective Address digunakan untuk membaca alamat (offset)

dari suatu lokasi memori. Biasanya saat dikompilasi, jika memungkinkan, instruksi ini akan

diganti dengan MOV. Perhatikan potongan contoh program berikut:

LEA AX, m ; baca alamat variabel m dan simpan di

register AX

RET

m DW 1234h ; deklarasi variabel m tipe WORD

END

AX akan berisi 104H, karena instruksi LEA panjangnya 3 byte, RET panjangnya 1 byte,

program diawali pada 100H, sehingga alamat variabel m adalah 104H.

LDS dan LES

Instruksi LDS digunakan untuk membaca word ganda yang kemudian hasilnya yang

pertama disimpan di suatu register word dan yang kedua di register DS, perhatikan contoh

berikut:

SAHF dan LAHF

Instruksi SAHF digunakan untuk menyimpan isi register AH ke dalam register flag

dengan cara atau ketentuan sebagai berikut:

Bit AH 7 6 5 4 3 2 1 0

Flag [SF] [ZF] [0] [AF] [0] [PF] [1] [CF]

Kebalikan dari instruksi SAHF adalah instruksi LAHF, untuk membaca isi flag dan

disimpan ke dalam AH. Dengan demikian, jika kedua insruksi ini digunakan bersama (satu

pasang) akan sangat mudah untuk menyimpan status flag kemudian mengembalikan lagi

seperti semula.

PUSHF dan POPF

Instruksi PUSHF digunakan untuk menyimpan register flag ke dalam stack, jika Anda

menggunakan LAHF, register flag disimpan ke register AH bukan stack. Demikian juga dengan

Agus Haryawan - Politama Surakarta

Page 27: Bahasa Rakitan1

Bab III Instruksi 80X86

23

POPF yang akan membaca kembali register flag dari stack. Perhatikan potongan contoh

program berikut dan bandingkan dengan contoh sebelumnya:

PUSHF ; simpan register flag ke dalam stack

MOV AH,00Fh ; semua flag

SAHF ; di set ke l

POPF ; kembalikan lagi flag seperti semula

END

3.2 INSTRUKSI ARITMETIKA

Prosesor 80x86 dapat melakukan operasi aritmetika baik pada bilangan biner bertanda

maupun tidak dan dalam sistem bilangan desimal (baik BCD maupun bukan). Instruksi

aritmetika terbagi menjadi empat kelompok: penjumlahan, pengurangan, perkalian, pembagian

dan ekstensi tanda.

ADD dan ADC

Jelas sekali, instruksi ADD ini digunakan untuk melakukan penjumlahan antara tujuan

dan sumber, hasilnya disimpan ke tujuan, misalnya:

MOV AL,5 ; AL = 5

ADD AL,-3 ; AL = 5 + (-3) = 2

RET

Saat prosesor menjumlah dua bilangan biner, akan dihasilkan sisa (carry) jika operan

tujuan tidak bisa menampung hasil penjumlahan (lebih dari 216 untuk ukuran word atau 28

untuk ukuran byte).

Sedangkan instruksi ADC sama seperti instruksi ADD, hanya saja sekarang yang

dijumlahkan kedua operan dan status CF, misalnya:

STC ; set CF = 1

MOV AL, 5 ; AL = 5

ADC AL, 1 ; AL=5+1+1 (dari CF) = 7

Kedua instruksi ini mempengaruhi enam macam flag: CF, PF, AF, ZF, SF dan, OF.

AAA dan DAA

Instruksi AAA (ASCII Adjust After Addition) digunakan untuk mengatur ASCII setelah

penjumlahan, yang dilakukan adalah mengoreksi hasil di AH dan AL setelah dilakukannya

penjumlahan dalam sistem BCD.

Perhatikan contoh berikut:

MOV AX,15 ; AH = 00h dan AL = 0Fh

AAA ; AH = 01h dan AL = 05h

Jika instruksi AAA bekerja pada byte, maka DAA juga melakukan yang hampir sama,

tetapi untuk nibel. Instruksi DAA (Decimal Adjust After Addition) digunakan untuk mengoreksi

penjumlahan dari dua nilai BCD, a'goritmanya:

Misalnya:

MOV AL, OFH ; AL = OFH (atau 15 desimal)

DAA ; AL = 15H

Agus Haryawan - Politama Surakarta

Page 28: Bahasa Rakitan1

Bab III Instruksi 80X86

24

INC

Instruksi INC (Increment) digunakan untuk menambahkan nilai suatu operan sebesar 1

(menaikkan), misalnya:

MOV AL,4 ; AL=4

INC AL ; AL=AL+1=4+1=5

SUB dan SBB

Instruksi SUB (subtract) jelas digunakan untuk melakukan pengurangan dua operan,

tujuan dan sumber, hasilnya disimpan di tujuan, misalnya:

MOV AL,5 ; AL = 5

SUB AL,1 ; AL=AL-1=5-1=4

Instruksi SBB (subtract with borrow) juga mirip seperti SUB, hanya saja yang

dikurangkan tidak hanya dua operan tapi juga dengan carry, misalnya:

STC ; set CF

MOV AL,5 ; AL = 5

SBB AL,3 ; AL = 5-3-1 (dari CF)=l

Kedua instruksi ini mempengaruhi enam macam flag: CF, PF, AF, ZF, SF, dan OF.

AAS dan DAS

Instruksi AAS atau ASCII Adjust after Subtraction digunakan untuk mengoreksi hasil

pada register AH dan AL setelah dilakukan pengurangan jika bekerja dengan nilai BCD,

algoritmanya:

jika (nibel rendah AL > 9) atau (AF = 1), maka

AL = AL - 6 AH = AH - 1 AF = 1 CF = 1

selain itu:

AF = 0 CF = 0

untuk semua syarat kosongkan nibel tinggi AL

Perhatikan contoh berikut:

MOV AX, 02FFh ; AH = 02, AL = 0FFh

AAS ; AH = 01, AL = 09

Mirip dengan AAS, instruksi DAS atau Decimal Adjust after Subtraction digunakan untuk

mengoreksi hasil pengurangan dua bilangan BCD.

DEC

Instruksi DEC atau decrement digunakan untuk mengurangkan nilai suatu operan

sebesar 1 (menurunkan), misalnya:

MOV AL,4 ; AL = 4

DEC AL ; AL=AL-1=4-1=3

NEG

Instruksi NEG atau negatedigunakan untuk membuat negatif suatu operan (diubah ke

Agus Haryawan - Politama Surakarta

Page 29: Bahasa Rakitan1

Bab III Instruksi 80X86

25

format 2's complement), caranya semua bit di-inversi-kan kemudian dijumlah dengan 1.

Misalnya:

MOV AL,5 ; AL = 05H

NEG AL ; AL = 0FBH (-5)

NEG AL ; AL = 05H (5)

CMP

Instruksi CMP (compare) digunakan untuk membandingkan dua operan, dalam hal ini dilakukan

operasi pengurangan antar dua operan yang digunakan (operan1-operan2). Hasil pengurangan

tersebut tidak disimpan dimanapun, hanya mempengaruhi flag sesuai tabel 4.3.

MOV AL,5 ; AL = 05H

MOV BL,5 ; BL = 05H

CMP AL,BL ; AL = 05H, ZF = l (AL dan BL sama!)

MUL

Instruksi MUL (unsignedmultiply) digunakan untuk melakukan perkalian bilangan tak-

bertanda antara suatu operan dengan register AL atau AX, tergantung tipe operannya apakah

byte atau word, untuk tipe byte, hasil disimpan di AX, sedangkan untuk tipe word hasilnya

disimpan di DX dan AX. Algoritmanya:

AX = AL * operan, atau DX AX = AX * operan

Perhatikan contoh berikut:

MOV AL,200 ; AL = 0C8H

MOV BL,4

MUL BL ; AX = 0320H (800 <- 4 X 200)

IMUL

Instruksi IMUL hampir sama dengan MUL, hanya saja IMUL digunakan untuk melakukan

perkalian bilangan bertanda (signed multipltf. Apa yang dilakukan sama seperti MUL, kecuali

data operan diperlakukan dalam format 2's complement. Perhatikan contoh berikut:

MOV AL,-2 ; AL akan berisi FEH (artinya -2)

MOV BL,-4 ; BL akan berisi FCH (artinya -4)

IMUL BL ; AX akan berisi 0008H (-2 x -4 = 8)

MOV AL,-2 ; kembalikan lagi

MUL BL ; AC akan berisi FA08H

AAM

Instruksi AAM atau ASCII Adjust After Multiplication digunakan untuk mengoreksi hasil

perkalian dari dua nilai BCD, algoritmanya:

AH=AL/10

AL=sisa

Perhatikan contoh berikut:

MOV AL,15 ; AL=OFH

AAM ; AH=01, AL=05

DIV

Instruksi DIV digunakan untuk melakukan pembagian bilangan tak-bertanda

Agus Haryawan - Politama Surakarta

Page 30: Bahasa Rakitan1

Bab III Instruksi 80X86

26

(unsigneddivide). Algoritmanya:

Untuk operan bertipe byte:

• AL=AX/operan • AH=sisa (modulus)

Untuk operan bertipe word:

• AX=(DX AX)/operan • DX=sisa (modulus)

Perhatikan contoh berikut:

MOV AX,203 ; AX=00CBh

MOV BL,4

DIV BL ; AL=32h (50), AH=03h

IDIV

Seperti instruksi DIV, IDIV juga melakukan pembagian dua operan, tetapi operannya

merupakan bilangan bertanda (signed divide), artinya dianggap format 2's complement.

Perhatikan contoh berikut:

MOV AX,-203 ; AX berisi FF35H (2's comp)

MOV BL,4

IDIV BL ; AL=CEK (-50),AH=FDH (-3)

AAD

Instruksi AAD atau ASCII Adjust before Division digunakan untuk menyiapkan dua nilai

BCD sebelum dilakukan pembagian. Algoritmanya:

AL=(AH*10)+AL

AH=0

Perhatikan contoh berikut:

MOV AX,0105H ; AH=01, AL=05

AAD ; AH=00, AL=0Fh (15)

CBW dan CWD

Kedua instruksi ini berkaitan dengan masalah konversi bilangan, instruksi CBW (Convert

Byte to Word) digunakan untuk melakukan konversi byte menjadi word pada register AL,

algoritmanya:

jika bit tertinggi AL = 1, maka

AH = 255 (FFh) selain itu:

AH = 0

Perhatikan contoh berikut:

MOV AX,0 ; AH = 0 dan AL = 0

MOV AL,-5 ; AX = 00FBh (251)

CBW ; AX = FFFBh (-5)

Karena yang diisi angka -5 hanya AL, maka hanya AL-lah yang berisi bilangan -5 atau

251 (terjemahan heksadesimalnya), sedangkan AH masih nol. Dengan instruksi CBW sekarang

lengkap AX terisi FFFBh (-5).

Instruksi CWD atau Convert Word to Doubleword digunakan untuk mengkonversi word

menjadi word-ganda.

Agus Haryawan - Politama Surakarta

Page 31: Bahasa Rakitan1

Bab III Instruksi 80X86

27

3.3 INSTRUKSI MANIPULASI BIT

Prosesor 80x86 dapat melakukan operasi manipulasi bit menggunakan instruksi-instruksi

jenis ini yang meliputi operasi logika, penggeseran dan pemutaran bit. Pada tabel 4.4

ditunjukkan ringkasan instruksi manipulasi bit yang terbagi menjadi tiga kelompok: logika,

penggeseran dan pemutaran.

AND

Instruksi ini digunakan untuk melakukan operasi logika AND antar bit pada dua operan,

hasilnya disimpan pada operan tujuan, algoritma atau aturannya:

0 AND 0=0

0 AND 1=0

1 AND 0=0

1 AND 1=1

Perhatikan contoh berikut:

MOV AL,‘a’ ; AL=01100001b

AND AL,11011111B ; AL=01000001b (=’A’)

OR

Instruksi ini digunakan untuk melakukan operasi logika OR antar bit pada dua operan,

hasilnya disimpan pada operan tujuan, algoritma atau aturannya:

0 OR 0=0

0 OR 1=1

1 OR 0=1

1 OR 1=1

Perhatikan contoh berikut:

MOV AL,’A’ ; AL=01000001b

OR AL,00100000b ; AL=01100001b (=’a’)

XOR

Instruksi ini digunakan untuk melakukan operasi logika XOR antar bit pada dua operan,

hasilnya disimpan pada operan tujuan, algoritma atau aturannya:

0 XOR 0 = 0

0 XOR 1 = 1

1 XOR 0 = 1

1 XOR 1 = 0

Perhatikan contoh berikut:

MOV AL,00000111B

XOR AL,00000010B ; AL=00000101b

NOT

Instruksi ini digunakan untuk menginvers masing-masing bit pada suatu operan, hasilnya

disimpan pada operan tujuan, algoritma atau aturannya:

NOT 1=0

NOT 0=1

Perhatikan contoh berikut:

MOV AL,00011011b

NOT AL ; AL=11100100b

Agus Haryawan - Politama Surakarta

Page 32: Bahasa Rakitan1

Bab III Instruksi 80X86

28

TEST

Instruksi TEST digunakan untuk melakukan operasi logika AND masing-masing bit pada

dua operan untuk mempengaruhi flag saja, hasilnya tidak disimpan dimana-mana. Flag yang

terpengaruh adalah ZF, SF dan PF. Perhatikan contoh berikut:

MOV AL,00000101b

TEST AL,1 ; ZF=0 (hasil AND=00000001b)

TEST AL,10B ; ZF=l (hasil AND=00000000b)

SAL dan SHL

Instruksi SAL atau Shift Arithmetic Le/if dan SHL atau Shift Left, digunakan untuk

menggeser bit-bit suatu operan ke kiri. Jumlah penggeseran ditentukan dengan operan kedua.

Algoritmanya:

Geser semua bit ke kiri, bit paling kiri digeser ke CF Bit nol disisipkan dari posisi paling kanan.

Perhatikan contoh berikut ini:

MOV AL,0E0h ; AL=11100000B

SAL AL,l ; AL=11000000B, CF=l

SHL AL,l ; AL=10000000B, CF=l

SAR dan SHR

Instruksi SAR atau Shift Arithmetic Right dan SHR atau Shift Right, digunakan untuk

menggeser bit-bit suatu operan ke kanan. Jumlah penggeseran ditentukan dengan operan

kedua.

Algoritme SAR:

Geser semua bit ke kanan, bit terkanan digeser ke CF Tertahankan nilai bit paling kiri = nilai bit sebelumnya

Algoritma SHR:

Geser semua bit ke kanan, bit paling kanan digeser ke CF Bit nol disisipkan dari posisi paling kiri.

Perhatikan contoh berikut:

MOV AL,10000111b

SAR AL,1 ;AL=11000011B, CF=1

SHR AL,1 ;AL=01100001B, CF=1

Perhatikan perbedaan hasil dari kedua instruksi SAR dan SHR, setelah dilakukan SAR,

bit paling kiri dari AL tetap bernilai 1, artinya bit tanda dipertahankan, sedangkan setelah

instruksi SHR, bit paling kiri dari AL tidak dipertahankan lagi dan diisi nol!

ROL dan RCL

Kedua instruksi ini digunakan untuk menggeser dan memutar bit pada suatu operan,

perbedaannya: instruksi ROL tidak menggunakan perantara CF sedangkan RCL menggunakan

perantara CF.

Perhatikan contoh berikut:

MOV AL,1CH ; AL=00011100B

ROL AL,1 ; AL=00111000B, CF=0

STC ; set CF (CF=1)

MOV AL,1CH ; AL = 00011100B

RCL AL,1 ; AL = 00111001B, CF=0

Agus Haryawan - Politama Surakarta

Page 33: Bahasa Rakitan1

Bab III Instruksi 80X86

29

ROR dan RCR

Kedua instruksi ini sama operasionalnya dengan kedua instruksi sebelumnya, ROL dan

RCL, hanya saja menggeser bit-nya ke kanan.

3.4 INSTRUKSI KONTROL ALIRAN PROGRAM

Sebuah program dalam Bahasa Assembly dikerjakan secara sekuensial atau berurutan

dari baris pertama ke baris berikutnya (dari atas ke bawah). Ada beberapa instruksi yang bisa

menyebabkan aliran program tidak seperti itu, misalnya melompat ke suatu lokasi instruksi atau

pemanggilan prosedur.

CALL dan RET

Instruksi CALL digunakan untuk memanggil suatu prosedur, alamat untuk kembali lagi,

yang tersimpan di register IP, disimpan ke stack. Selain dapat diikuti dengan operan nama

prosedur maupun label, operan bisa juga merupakan alamat 4-byte yang ditulis dalam format,

misalnya, 1234:5678H, angka yang pertama merupakan nilai segmen dan yang kedua

merupakan offset, pemanggilan ini merupakan pemanggilan jauh (far), dengan demikian yang

tersimpan ke stack tidak hanya IP saja tetapi juga CS, dengan kata lain pemanggilan jauh ciri-

cirinya adalah berbeda segmen.

Sedangkan instruksi RET digunakan untuk mengakhiri suatu prosedur, yaitu melakukan

pengembalian alamat ke semula (membaca kembali isi stack). Perhatikan contoh program

berikut:

ORG 100h

CALL pl

ADD AX, l

pl PROC ; deklarasi prosedur

MOV AX, 1234h

RET ; kembali dari yg memanggil

pl ENDP

END

JMP

Instruksi JMP merupakan instruksi lompatan tanpa syarat. Program akan segera

melompat ke nama label atau alamat 4-byte yang ditulis pada operannya. Instruksi JMP ini tidak

akan menyimpan alamat register IP maupun CS, karena pada dasarnya instruksi JMP ini sama

seperti instruksi GOTO pada Pascal atau C++. Dengan demikian perlu dibedakan dengan

CALL.

Perhatikan contoh program berikut:

ORG 100h

MOV AL,5

JMP labell ; lompat! 2 baris!

PRINT 'Tidak lompat!'

MOV AL, 0

labell:

PRINT 'Sampai disini!

RET

END

Agus Haryawan - Politama Surakarta

Page 34: Bahasa Rakitan1

Bab III Instruksi 80X86

30

Pada program ini digunakan makro PRINT yang dapat digunakan untuk mencetak suatu

string ke layar, instruksi JMP labell langsung melompati dua baris di bawah-nya, kemudian

instruksi RET bukan untuk mengembalikan isi register IP tetapi untuk kembali ke sistem operasi

atau mengakhiri program. Jalankan program ini dengan emulator langsung RUN (bukan

SINGLE RUN) dan amati yang terjadi.

JA atau JNBE

Kedua instruksi ini sebenarnya identik, kedua instruksi ini diawali dengan instruksi CMP,

instruksi JA (Jump if Above) digunakan untuk melakukan lompatan ke suatu label, jika hasil

instruksi CMP sebelumnya operan pertama lebih besar (above) dari operan kedua (untuk

bilangan tak-bertanda). Sedangkan instruksi JNBE (Jump if Not Below) akan membuat program

melompat ke suatu label, jika operan pertama tidak dibawah (not below = above) operan kedua.

Perhatikan contoh program berikut:

ORG 100h

MOV AL,250 ; coba ganti-ganti dengan angka lain

CMP AL, 5

JA labell ; bisa diganti JNBE ..

PRINT 'AL tidak lebih besar 5'

JMP exit

labell:

PRINT 'AL lebih besar 5'

exit:

RET

END

Instruksi JA bisa diganti dengan JNBE, hasilnya sama saja.

JAE atau JNB

Kedua instruksi ini juga memiliki arti yang sama, diawali dengan instruksi CMP untuk

membandingkan dua operan, Instruksi JAE (Jump if Above or Equal) digunakan untuk

melakukan lompatan program jika operan pertama lebih besar atau sama dengan operan yang

kedua atau menggunakan JNB (Jump if Not Below) jika operan pertama tidak lebih kecil

daripada operan kedua (untuk bilangan tak-bertanda).

Perhatikan contoh program berikut ini:

ORG 100h

MOV AL,5 ; ganti2 angkanya

CMP AL,5

JAE labell ; bisa diganti JNB

PRINT ‘AL lebih kecil 5’

JMP exit

labell:

PRINT 'AL lebih besar atau sama dengan 5'

exit:

RET

END

Instruksi JAE bisa diganti dengan JNB dengan hasil yang sama.

JB, JNAE atau JC

Instruksi JB (Jump ifBelow) atau JNAE (Jump ifNotAbove orNot Equal) atau JC (Jump if

Agus Haryawan - Politama Surakarta

Page 35: Bahasa Rakitan1

Bab III Instruksi 80X86

31

Carry flag set to 1) semuanya digunakan untuk melakukan lompatan jika hasil perbandingan

yang dilakukan operan pertama lebih kecil dari operan kedua (untuk bilangan tak-bertanda),

khusus untuk instruksi JC bisa dimanfaatkan untuk memeriksa hasil dari suatu operasi apakah

menghasilkan carry (sisa/pinjaman) atau tidak. Untuk instruksi JB atau JNAE, perhatikan contoh

program berikut:

ORG 100h

MOV AL,1

CMP AL, 5

JB labe1 ; bisa diganti dengan JNAE

PRINT 'AL lebih besar atau sama dengan 5'

JMP exit

labell:

PRINT 'AL lebih kecil 5'

exit:

RET

END

Pada program ini, instruksi JB bisa diganti dengan JNAE. Sedangkan untuk instruksi JC,

perhatikan contoh berikut:

ORG 100h

MOV AL,255

ADD AL,l

JC labell

PRINT ‘tidak ada carry!’

JMP edit

label1:

PRINT ‘ada carry!’

exit:

RET

END

JBE atau JNA

Kedua instruksi ini, JBE (Jump if Below or Equal) dan JNA (Jump if Not Above),

digunakan untuk melakukan lompatan jika instruksi CMP sebelumnya mendeteksi bahwa

operan 1 lebih kecil atau sama dengan operan 2 (JBE) atau operan 1 tidak lebih besar dari

operan 2 (JNA), untuk bilangan tak-bertanda.

Perhatikan contoh program berikut:

ORG 100h

MOV AL,5

CMP AL,5

JBE label1 ; bisa diganti JNA

PRINT ‘AL lebih besar dari 5’

JMP edit

labell:

PRINT *AL lebih kecil atau sama dengan 5'

exit:

RET

END

Anda bisa mengganti instruksi JBE dengan JNA dan hasil yang diperoleh tetap sama.

Agus Haryawan - Politama Surakarta

Page 36: Bahasa Rakitan1

Bab III Instruksi 80X86

32

JCXZ

Instruksi JCXZ (atau Jump if CX is Zero) digunakan untuk melakukan lompatan jika

register CX berisi nol, perhatikan contoh berikut:

ORG 100h

MOV CX,0

JCXZ labell

PRINT ‘CX tidak nol.’

JMP exit

labell:

PRINT ‘CX nya nol.’

exit:

RET

END

Pada contoh program di atas, memang disengaja register CX diisi dengan nol, tetapi

setiap kali register CX berisi nol (dengan instruksi apapun saja, misalnya hasil penjumlahan dan

lain sebagainya), maka instruksi JCXZ akan menyebabkan program melompat ke label yang

disebutkan.

JE atau JZ

Instruksi JE (Jump if Equal) atau JZ (Jump ifZero) digunakan untuk melakukan lompatan

jika hasil perbandingan (dengan CMP) menghasilkan operan 1 sama dengan operan 2 (JE)

atau operan 1 dikurangi operan 2 hasilnya nol (JZ).

Instruksi JE dipengaruhi oleh hasil dari instruksi CMP dan berlaku untuk tipe bilangan

bertanda maupun bukan, sedangkan instruksi JZ dipengaruhi oleh instruksi CMP, SUB, ADD,

TEST, AND, OR dan XOR. Bisa untuk bilangan bertanda maupun tak-bertanda.

Perhatikan contoh program berikut:

ORG 100h

MOV AL,5

CMP AL,5

JE labell ; bisa diganti dengan JZ

PRINT ‘AL tidak sama dengan 5.’

JMP exit

labell:

PRINT XAL sama dengan 5.'

exit:

RET

END

JG atau JNLE

Instruksi JG (Jump if Greatet) dan JNLE (Jump if Not Less or Equaf) digunakan untuk

melakukan lompatan jika operan pertama nilainya lebih besar (atau tidak lebih kecil atau tidak

sama dengan) dibandingkan operan kedua hasil dari instiuksi CMP sebelumnya (untuk bilangan

bertanda).

ORG 100h

MOV AL,5

CMP AL,-5

JG labell ; bisa diganti dengan JNLE

PRINT ‘AL tidak lebih besar dari -5.’

JMP exit

Agus Haryawan - Politama Surakarta

Page 37: Bahasa Rakitan1

Bab III Instruksi 80X86

33

labell:

PRINT 'AL lebih besar dari -5.'

exit:

RET

END

JGE atau JNL

Instruksi JGE (Jump if Greater or Equa!) dan JNL (Jump if Not Less) digunakan untuk

melakukan lompatan jika hasil instruksi CMP sebelumnya menghasilkan operan pertama lebih

besar atau sama dengan operan kedua (JGE), atau operan pertama tidak lebih kecil dari

operan kedua (JNL), untuk bilangan bertanda.

Perhatikan contoh berikut:

ORG 100h

MOV AL,2

CMP AL, -5

JGE labell ; bisa diganti JNL

PRINT ‘AL<-5’

JMP exit

labell:

PRINT ‘AL >= -5’

exit:

RET

END

JL atau JNGE

Instruksi JL (Jump ifLess) atau JNGE (Jump if Not Greateror Equal) digunakan untuk

melakukan lompatan jika hasil instruksi CMP menghasilkan operan 1 lebih kecil dari operan 2

(JL), atau operan 1 tidak lebih besar atau sama dengan operan 2 (JNGE), untuk bilangan

bertanda.

Perhatikan contoh program berikut:

ORG 100h

MOV AL,-2

CMP AL,5

JNGE labell ; bisa diganti JNGE

PRINT ‘AL >= 5.’

JMP exit

labell:

PRINT ‘AL < 5.’

exit:

RET

END

JLE atau JNG

Instruksi JLE (Jump ifLess or Equal) atau JNG (Jump if Not Greatet) digunakan untuk

melakukan lompatan jika operan pertama lebih kecil atau sama dengan operan kedua (JLE)

atau operan pertama tidak lebih besar dari operan kedua (JNG) hasil dari instruksi CMP

sebelumnya untuk bilangan bertanda.

Perhatikan contoh program berikut ini:

ORG 100h

Agus Haryawan - Politama Surakarta

Page 38: Bahasa Rakitan1

Bab III Instruksi 80X86

34

MOV AL,2

CMP AL,3

JNG labell ;bisa diganti JLE

PRINT ‘AL > 3.’

JMP exit

labell:

PRINT ‘AL <= 3’

exit:

RET

END

JNC

Kebalikan dari JC, instruksi JNC atau Jump if Carry, digunakan untuk melakukan

lompatan jika hasil dari suatu instruksi yang dikerjakan sebelumnya (apa saja) tidak membuat

status Carry=1 atau Carry tetap nol (tidak ada Carry). Perhatikan contoh program berikut:

ORG 100h

MOV AL,2 ; coba diganti dengan 253.. .

ADD AL,3

JNC labell

PRINT ‘ada carry.’

JMP exit

labell:

PRINT ‘tak ada carry.’

exit

RET

END

JNE atau JNZ

Instruksi JNE (Jump ifNot Equal) atau JNZ (Jump if Not Zero) digunakan untuk

melakukan lompatan ke suatu label jika operan pertama tidak sama dengan operan kedua

(JNE), atau hasil instruksi sebelumnya menghasilkan yang bukan nol (JNZ).

Instruksi JNE dipengaruhi oleh hasil dari instruksi CMP dan berlaku untuk tipe bilangan

bertanda maupun bukan, sedangkan instruksi JNZ dipengaruhi oleh instruksi CMP, SUB, ADD,

TEST, AND, OR dan XOR. Bisa untuk bilangan bertanda maupun tak-bertanda. Perhatikan

contoh program berikut ini:

ORG 100h

MOV AL,00000111b ; AL = 7

OR AL,0 ; bisa diganti CMP AL, 0

JNZ labell ; bisa diganti JNE labell

PRINT ‘nol.’ ; bisa diganti PRINT ‘AL =0’

JMP exit

Label1:

PRINT ‘bukan nol.’ ; bisa diganti PRINT *AL <> 0'

exit:

RET

END

JNO

Instruksi JNO atau Jump if Not Overflow digunakan untuk melakukan lompatan jika hasil

dari suatu instruksi yang dikerjakan sebelumnya tidak menghasilkan limpahan atau overflow.

Agus Haryawan - Politama Surakarta

Page 39: Bahasa Rakitan1

Bab III Instruksi 80X86

35

JNS

Instruksi JNS (Jump if Not Signed (if positive)) digunakan untuk melakukan lompatan ke

suatu label jika hasil dari instruksi CMP, SUB, ADD, TEST, AND, OR dan XOR menghasilkan

bilangan positif (tak bertanda).

JO

Instruksi JO (Jump if Overflow) digunakan untuk melakukan lompatan ke suatu label jika

hasil dari instruksi yang dikerjakan sebelumnya mengakibatkan terjadinya limpahan atau

overflow, kebalikan dari instruksi JNO.

JS

Instruksi JS (Jump if Signed (if negative)) digunakan untuk melakukan lompatan ke suatu

label jika hasil instruksi CMP, SUB, ADD, TEST, AND, OR dan XOR yang dikerjakan

sebelumnya menghasilkan bilangan negatif (bit MSB=1). Perhatikan contoh program berikut:

ORG 100h

MOV AL,lOOOOOOOb ; AL = -128

OR AL,0 ; hanya set flag

JS labell

PRINT ’tak bertanda (positif).’

JMP exit

labell:

PRINT ‘bertanda (negatif).’

exit:

RET

END

LOOP

Instruksi LOOP akan mengurangi nilai isi register CX kemudian akan melompat ke suatu

label tertentu jika isi CX bukan nol, dengan kata lain, instruksi LOOP digunakan untuk

melakukan pengulangan dari suatu label tertentu hingga nilai CX menjadi 0. Perhatikan contoh

program berikut:

ORG 100h

MOV CX, 5

label1:

PRINTN ‘loopl’

LOOP label1

RET

END

Program ini akan melakukan pencetakan kata 'loop' sebanyak 5 (lima) kali, sesuai

dengan isi CX yang pada awalnya diisi dengan 5.

LOOPE atau LOOPZ

Instruksi LOOPE atau LOOPZ digunakan untuk menurunkan nilai register CX dan

melompat ke suatu label tertentu jika CX tidak nol dan sama (ZF=1), artinya pengulangan akan

dilanjutkan hingga CX mencapai nol atau ZF=0 atau dua-duanya. Perhatikan contoh program

berikut:

ORG 100h

MOV AX,0

Agus Haryawan - Politama Surakarta

Page 40: Bahasa Rakitan1

Bab III Instruksi 80X86

36

MOV CX,5

label1:

PUTC ‘*’

ADD AX,100

CMP AH,0

LOOPZ label1

RET

END

Pertama register AX dan CX masing-masing diisi dengan 0 dan 5 (lima kali

pengulangan). Kemudian karakter '*' ditampilkan ke layar, AX ditambah dengan 100, sehingga

sekarang AX=100, dilanjutkan dengan pengujian AH apakah sama dengan 0? Instruksi LOOPZ

(atau LOOPE) akan memeriksa hasil CMP, jika sama maka pengulangan dihentikan, jika tidak

pengulangan diteruskan hingga nilai CX=0 atau AH=0 (tergantung mana yang lebih dulu

tercapai).

Catatan:

Dengan melakukan operasrAL = AL +100, hasil tidak akan pernah bernilai 0, nilainya 0

(sekali saja), 100,200 dan 300 (isi AX = 012Ch) serta tidak pernah 400 karena proses berhenti

dikarenakan CX sudah mencapai nol duluan, dengan demikian akan tercetak 5 bintang!

LOOPNE atau LOOPNZ

Kedua instruksi ini berkebalikan dengan LOOPE maupun LOOPZ. Instruksi LOOPNE

atau LOOPNZ digunakan untuk melakukan lompatan ke suatu label tertentu jika nilai CX belum

mencapai nol dan tidak sama (ZF=0), artinya pengulangan akan dilakukan hingga CX mencapai

nol atau ZF=1 atau dua-duanya. Perhatikan contoh program berikut:

ORG 100h

MOV SI,0

MOV CX,5

labell:

PUTC ‘*’

MOV AL, v1[SI]

INC SI ; byte berikut (SI=SI+1).

CMP AL, 7

LOOPNE labell

RET

vl DB 9, 8, 7, 6, 5

END

Program ini akan melakukan pengulangan hingga dijumpai bilangan 7, pada posisi 3,

dengan kata lain hasilnya berupa 3 bintang yang ditampilkan.

3.5 INSTRUKSI STRING

Instruksi string membolehkan Anda bekerja dengan sekelompok (blok) byte atau word

yang berturutan di dalam memori. Blok-blok atau string-string ini, panjangnya bisa mencapai

64K byte dan bisa mengandung nilai-nilai numerik (baik biner maupun BCD) atau alfanumerik

(seperti karakter teks).

Sebagaimana ditunjukkan pada tabel 4.6, instruksi string terbagi menjadi 5 (lima) macam

Agus Haryawan - Politama Surakarta

Page 41: Bahasa Rakitan1

Bab III Instruksi 80X86

37

operasi dasar atau primitif, yaitu: pemindahan, pembandingan, scan atau pencarian,

pembacaan dan penyimpanan

CLD

Instruksi CLD (Clear Direction flag (DF=0)) digunakan untuk mengatur agar DF=0,

kemudian register SI dan DI akan dinaikkan oleh instruksi berantai seperti: CMPSB, CMPSW,

LODSB, LODSW, MOVSB, MOVSW, STOSB dan STOSW. Instruksi berantai maksudnya satu

instruksi tetapi bekerja untuk serangkaian data sekaligus berturutan.

STD

Instruksi STD (Set Direction flag (DF=1)) merupakan kebalikan dari CLD, digunakan

untuk mengatur agar DF=1, kemudian register SI dan DI diturunkan oleh instruksi berantai

seperti: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB dan STOSW.

REP

Melakukan pengulangan instruksi MOVSB, MOVSW, LODSB, LODSW, STOSB atau

STOSW sebanyak nilai yang tersimpan di register CX. Algoritmanya:

Cek_CX:

Jika CX <> 0 maka

Lakukan instruksi berantai CX <- CX - l Kembali ke Cek_CX

Selain itu

Keluar dari siklus REP Perhatikan potongan program berikut:

MOV CX,500

REP MOVSB

Potongan program ini akan mengerjakan instruksi MOVSB selama CX belum sama

dengan nol, dengan kata lain diulang sebanyak 500 kali.

REPE atau REPZ

Hampir sama dengan instruksi REP, instruksi REPE (Repeat While Equat), yang

memiliki instruksi alternatif REPZ (Repeat While Zero), digunakan untuk mengulang instruksi

berantai selama ZF=1 (belum sama) dan CX belum mencapai nol. Perhatikan potongan

program berikut:

MOV CX,100

REPE CMPSB ; bisa diganti REPZ

Potongan program ini akan membandingkan string di DS:[SI] dengan ES:[DI] hingga 100

kali atau hingga ditemukan elemen yang tidak sama, mana yang tercapai duluan.

REPNE atau REPNZ

Kebalikan dari instruksi REPE atau REPZ, instruksi REPNE (Repeat While NotEqual),

yang memiliki instruksi alternatif REPNZ (Repeat While Not Zero), digunakan untuk mengulang

instruksi berantai selama ZF=0 (belum tidak sama) dan CX belum mencapai nol.

Perhatikan potongan program berikut:

Agus Haryawan - Politama Surakarta

Page 42: Bahasa Rakitan1

Bab III Instruksi 80X86

38

MOV CX,100

REPNE CMPSB ; bisa diganti REPNZ

Potongan program ini akan membandingkan string di DS:[SI] dengan ES:[DI] hingga 100

kali atau hingga ditemukan elemen yang sama, mana yang tercapai duluan.

MOVSB dan MOVSW

Kedua instruksi digunakan untuk menyalin string dari DS:[SI] ke ES:[DI], MOVSB untuk

satuan byte dan MOVSW dalam satuan word (2 byte) kemudian isi SI dan DI diperbaharui.

Algoritmanya MOVSB:

ES[DI] = DS:[SI] Jika DF=0 maka

SI = SI + 1 DI = DI + 1

Selain itu SI = SI - 1 DI = DI – 1

Algoritmanya MOVSW:

ES [DI] = DS: [SI] Jika DF=0 maka

SI = SI + 2 DI = DI + 2

Selain itu SI = SI - 2 DI = DI - 2

Contoh program untuk MOVSB:

LEA SI,a1

LEA DI,a2

MOV CX,5

REP MOVSB

A1 DB 1,2,3,4,5

a2 DB 5 DUP(0)

END

Pada program ini di atas disiapkan data-data yang akan disalin di al yang jika Anda

jalankan di Emu8086 akan mendapatkan alamat 01OCH, sedangkan tempat untuk penyalinan

ada di 32, alamat 0111 H. Instruksi REP secara otomatis akan diganti dengan REPE

(perhatikan hasilnya pada Emu8086). Instruksi MOVSB dijalankan sebanyak 5 kali (menyalin

bilangan 1 sampai 5 dari al ke a2).

CMPSB dan CMPSW

Kedua instruksi ini digunakan untuk menbandingkan data di DS:[SI] dengan ES:[DI],

CMPSB untuk satuan byte sedangkan CMPSW untuk satuan word.

Algoritma untuk CMPSB:

DS:[SI] - ES:[DI] Atur flag sesuai dengan hasil: OF, SF, ZF, AF, PF dan CF Jika DF=0 maka

SI = SI + 1 DI = DI + 1

Selain itu:

Agus Haryawan - Politama Surakarta

Page 43: Bahasa Rakitan1

Bab III Instruksi 80X86

39

SI = SI - 1 DI = DI - 1

Contoh program untuk CMPSB:

ORH 100h

; atur arah maju...

CLD

;siapkan sumber di DS:SI,

;siapkan target di ES:DI:

MOV AX,CS

MOV DS,AX

MOV ES,AX

LEA si,strl

LEA di,str2

; set pencacah sesuai dengan panjang string:

MOV CX, 11

; bandingkan hingga sama:

REPE CMPSB

JNZ not_equal

; "Ya" – sama!

MOV AL, 'Y'

MOV AH, OEh

INT lOh

JMP edit_here

not_equal:

; “Tidak” - gak sama!

MOV AL, ‘T’

MOV AH, 0Eh

INT 10h

exit_here:

RET

; data yang dibandingkan:

strl db ‘Test string’

str2 db ‘Test string’

END

Program ini digunakan untuk membandingkan string strl dan str2, jika ada satu karakter

saja yang tidak sama (beda huruf maupun besar dan kecilnya), akan diberikan jawaban T,

artinya kedua string tersebut tidak sama. Dalam hal ini digunakan instruksi REPE CMPSB,

artinya pembandingan karakter akan dilakukan terus hingga ditemui perbedaan karakter atau

menyebabkan 7f tetap 1 selama karakter tetap sama, sehingga instruksi JNZ not_equal tidak

akan dikerjakan (tidak melompat ke not_equal).

SCASB dan SCASW

Kedua instruksi ini digunakan untuk membandingkan byte (SCASB) atau word (SCASW)

pada AL atau AX dengan ES:[DI]. Algoritma untuk SCASB sebagai berikut:

ES:[DI] - AL Atur flag sesuai dengan hasil: OF, SF, ZF, AF, PF dan CF Jika DF=0 maka

DI = DI + 1 Selain itu:

DI = DI - 1

Sedangkan algoritma untuk SCASW sebagai berikut:

Agus Haryawan - Politama Surakarta

Page 44: Bahasa Rakitan1

Bab III Instruksi 80X86

40

ES:[DI] - AX Atur flag sesuai dengan hasil: OF, SF, dan CF Jika DF=0 maka

DI = DI + 2 Selain itu:

DI = DI – 2

LODSB dan LODSW

Kedua instruksi ini digunakan untuk menyimpan data yang ada dis DS:[SI] ke register AL

(dengan instruksi LODSB) atau register AX (dengan instruksi LODSW), kemudian register SI

diperbaharui. Algoritme untuk LODSB sebagai berikut:

AL = DS: [SI] Jika DF=0 maka:

SI = SI + 1 Selain itu:

SI = SI - 1

Perhatikan contoh program berikut untuk instruksi LODSB:

ORG 100h

LEA SI, al ; simpan posisi data di SI

MOV CX, 4 ; ada 4 data

MOV AH, 0Eh ; fungsi cetak karakter

m: LODSB ; simpan data ke AL

INT 10h ; tampilkan ke layar

LOOP m ; ulangi sebanyak 4 kali

RET

al DB ‘H’,‘a’,‘!’,‘o’

END

Pada program di atas, disiapkan data-data karakter yang akan ditampilkan di layar pada

tabel al, untuk menampilkan karakter ke layar bisa digunakan interupsi 10h fungsi Eh dengan

syarat karakter yang akan ditampilkan disimpan di register AL, sehingga dalam hal ini bisa

digunakan fungsi LODSB untuk menyalin karakter dari DS:[SI] ke register AL. Proses

menampilkan karakter diulang-ulang hingga semua karakter ditampilkan (ada 4 karakter).

STOSB dan STOSW

Kedua instruksi ini digunakan untuk menyimpan data dari AL (dengan instruksi STOSB)

atau AX (dengan instruksi STOSW) ke dalam ES:[DI], kemudian DI diperbaharui. Algoritma

untuk STOSB sebagai berikut:

ES:[DI] = AL Jika DF=0 maka

DI = DI + 1 Selain itu

DI = DI - 1

Sedangkan algoritma untuk STOSW sebagai berikut

ES:[DI] = AX Jika DF=0 maka

DI = DI + 2 Selain itu

DI = DI - 2

Berikut ini ditunjukkan contoh program menggunakan instruksi STOSB:

Agus Haryawan - Politama Surakarta

Page 45: Bahasa Rakitan1

Bab III Instruksi 80X86

41

ORG 100H

LEA DI,al

MOV AL,12h

MOV CX,5

REP STOSB

RET

al DB 5 dup(O) ; alokasi data menyesuaikan DB

END

Register DI diisi dengan lokasi dari tabel al (menggunakan instruksi LEA), agar nantinya

data-data-nya disimpan pada lokasi tersebut, menggunakan instruksi REP STOSB. Data yang

hendak disimpan adalah bilangan 12h (yang sebelumnya disiapkan di register AL dengan MOV

AL, 12h), sebanyak 5 kali (dengan bantuan register CX, MOV CX, 5). Setelah Program

dijalankan dapat diperiksa (dengan emulator Emu8086) isi dari al. Jika panjang datanya word

digunakan STOSW.

3.6 INSTRUKSI INTERUPSI

Sama seperti pemanggilan suatu prosedur, instruksi interupsi digunakan untuk

memanggil suatu prosedur khusus, yang diberi nama vektor interupsi, dikarenakan prosesor

menerima permintaan layanan interupsi. Lihat bab mengenai Interupsi.

3.7 INSTRUKSI KONTROL PROSESOR

Instruksi kontrol prosesor merupakan instruksi-instruksi yang digunakan untuk mengatur

status flag, sinkronisasi eksternal dan termasuk perintah tidak melakukan apapun pada

prosesor yang bersangkutan. Pada Tabel 4.8 ditunjukkan ringkasan instruksi kontrol prosesor.

Tabel 4.8. Ringkasan Instruksi Kontrol Prosesor

CLC dan STC

Kedua instruksi ini berkaitan dengan CF (CarryFlag). Instruksi CLC (Clear Carry Flag)

digunakan untuk mereset (membuat 0) CF sedangkan STC (Set CarryFlag) digunakan untuk

sebaliknya, menset (membuat 1) CF.

CMC

Instruksi CMC (Complement Carry Flag) digunakan untuk melakukan negasi

(menginversi) CF, jika CF sebelumnya 1, maka akan menjadi 0 demikian juga sebaliknya.

CLD dan STD

Kedua instruksi ini berhubungan dengan DF (Direction Flag). Instruksi CLD

(ClearDirection Flag) digunakan untuk mereset DF, kemudian register SI dan DI dinaikkan oleh

instruksi berantai seperti: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB dan

STOSW.

Sedangkan instruksi STD (Set Direction Flag) digunakan untuk menset DF, kemudian

register SI dan DI diturunkan oleh instruksi berantai seperti' CMPSB, CMPSW, LODSB,

LODSW, MOVSB, MOVSW, STOSB dan STOSW.

Agus Haryawan - Politama Surakarta

Page 46: Bahasa Rakitan1

Bab III Instruksi 80X86

42

CLI dan STI

Kedua instruksi ini berkaitan dengan IF (Interrupt Flag). Instruksi CLI atau Clear Interrupt

Flag digunakan untuk mematikan fungsi interupsi perangkat keras, sedangkan STI atau Set

Interrupt Flag digunakan untuk mengaktifkan interupsi perangkat keras.

HLT

Instruksi digunakan untuk menghentikan sistem (haltsystem).

NOP

Instruksi NOP atau No Operation merupakan instruksi yang menurut penulis agak aneh,

tetapi sering dimanfaatkan untuk melakukan penundaan, karena dengan adanya instruksi NOP,

prosesor hanya diam saja tidak melakukan apa-apa selama NOP dilaksanakan, dengan

demikian jika NOP dijalankan selama 1 //detik dan kita butuh penundaan suatu proses selama 5

//detik, tuliskan saja instruksi NOP lima kali.

Agus Haryawan - Politama Surakarta

Page 47: Bahasa Rakitan1

43

B A B I V

4 INTERUPSI

4.1 PENDAHULUAN

Interupsi dapat dipandang sebagai sejumlah fungsi-fungsi yang membuat program

(tepatnya pemrograman) menjadi lebih mudah, misalnya, untuk mencetak atau menampilkan

suatu karakter Anda bisa melakukannya dengan menuliskan program khusus atau

menggunakan pemanggilan suatu instruksi dan menyerahkan urusan tersebut pada fungsi

interupsi yang bersangkutan (tentunya, menurut keyakinan saya, Anda pasti akan memilih cara

yang terakhir).

Selain fungsi untuk menampilkan suatu karakter ke layar, tentu saja ada fungsi-fungsi

interupsi lain yang berhubungan dengan operasi diskdrive serta perangkat keras lainnya.

Interupsi dapat dipicu dengan perangkat keras yang berbeda-beda maupun dari perangkat

lunak. Interupsi yang dibangkitkan karena adanya permintaan layanan pada perangkat keras

disebut sebagai interupsi perangkat keras (hardware interrupts), sedangkan yang dibangkitkan

melalui perangkat lunak disebut sebagai interupsi perangkat lunak (software interrupts). Yang

akan dibahas pada bab ini, berkaitan dengan fokus pada pemrograman Bahasa Assembler,

adalah interupsi perangkat lunak.

Sebagaimana telah dijelaskan secara singkat pada bab sebelumnya, interupsi perangkat

lunak bisa dilakukan melalui instruksi INT dengan sintaks:

INT nilai

Dengan operan nilai dapat berisi angka 0 hingga 255 (atau 0 hingga OFFh), selanjutnya

akan digunakan format heksadesimal.

Jika kemudian Anda berpikir bahwa hanya ada 256 interupsi, maka disayangkan sekali

pendapat Anda itu salah. Masing-masing interupsi tersebut ada yang memiliki sub-fungsi, untuk

menentukan sub-fungsi ini biasanya digunakan register AH, yang harus diisi dengan nilai

tertentu sebelum instruksi interupsi yang bersangkutan dijalankan, selain itu bisa juga

digunakan register lain untuk meneruskan parameter dan data. Jika diandalkan masing-masing

memiliki 256 sub-fungsi, maka akan diperoleh 256 x 256 = 65536 fungsi!

4.2 DAFTAR INTERUPSI PILIHAN

INTERRUPT 05h Print Screen

Fungsi : Mencetak seluruh isi layar ke printer.

Register Input : Tidak Ada.

Register Output : Tidak Ada.

INTERRUPT 09h Keyboard

Fungsi : Interupsi 09 merupakan HardWare interupsi dari keyboard. Setiap

penekanan tombol keyboard akan membangkitkan interupsi 09. Handler

dari interupsi 09 kemudian akan mengambil data dari tombol apa yang

Agus Haryawan - Politama Surakarta

Page 48: Bahasa Rakitan1

Bab IV Interupsi

44

ditekan dari Port 60h yang berisi kode scan tombol. Dari kode scan

ini kemudian akan diterjemahkan dalam kode ASCII atau Extended dan

disimpan pada keyboard buffer untuk kemudian digunakan oleh

interupsi lain.

INTERRUPT 10h - Service 00h Set Video Mode

Fungsi : Mengubah Mode Video.

Register Input AH = 00h AL = nomor mode

Register Output : Tidak Ada.

Penjelasan : Setiap dilakukan pergantian mode akan menimbulkan efek CLS,

kecuali nomor mode dijumlahkan dengan 128 atau bit ke-7 pada AL

diset 1.

INTERRUPT 10h - Service 02h Set Cursor Position

Fungsi : Meletakkan kursor pada posisi tertentu.

Register Input :

AH = 02h

BH = nomor halaman tampilan

DH = nomor baris (dimulai 00)

DL = nomor kolom (dimulai 00)

Register Output :

Tidak Ada.

INTERRUPT 10h - Service 03h Cursor Information

Fungsi : Memperoleh Informasi posisi kursor dan ukurannya.

Register Input :

AH = 03h

BH = nomor halaman tampilan

Register Output :

CH = awal garis bentuk kurso

CL = akhir garis bentuk kursor

DH = nomor baris

DL = nomor kolom

Penjelasan : Setiap halaman tampilan memiliki kursornya sendiri- sendiri.

INTERRUPT 10h - Service 05h Select Active Page

Fungsi : Merubah halaman tampilan aktif.

Register Input :

AH = 05h

AL = nomor halaman tampilan

Register Output :

Tidak Ada.

INTERRUPT 10h - Service 06h Scroll Up Window

Fungsi : Menggulung jendela ke atas.

Register Input :

AH = 06h

AL = jumlah baris untuk digulung

BH = atribut untuk baris kosong

CH,CL = koordinat kiri atas jendela

DH,DL = koordinat kanan bawah jendela

Register Output :

Tidak Ada.

Agus Haryawan - Politama Surakarta

Page 49: Bahasa Rakitan1

Bab IV Interupsi

45

Penjelasan : AL diisi 00 akan mengosongkan keseluruhan jendela.

INTERRUPT 10h - Service 07h Scroll Down Window

Fungsi : Menggulung jendela ke bawah.

Register Input :

AH = 07h

AL = jumlah baris untuk digulung

BH = atribut untuk baris kosong

CH,CL = koordinat kiri atas jendela

DH,DL = koordinat kanan bawah jendela

Register Output:

Tidak Ada.

Penjelasan : AL diisi 00 akan mengosongkan keseluruhan jendela.

INTERRUPT 10h - Service 09h Write Character And Attribute At Cursor Position

Fungsi : Mencetak karakter dan atribut pada posisi kursor.

Register Input :

AH = 09h

AL = kode ASCII karakter

BH = nomor halaman

BL = atribut karakter

CX = jumlah pengulangan pencetakan

Register Output :

Tidak Ada.

Penjelasan : Karakter kontrol akan dicetak sebagai karakter biasa.

INTERRUPT 10h - Service 0Ah Write Character At Cursor Position

Fungsi : Mencetak karakter pada posisi kursor.

Register Input :

AH = 0Ah

AL = kode ASCII karakter

BH = nomor halaman

CX = jumlah pengulangan pencetakan

Register Output :

Tidak Ada.

Penjelasan : Karakter kontrol akan dicetak sebagai karakter biasa, atribut

yang digunakan akan sama dengan atribut yang lama.

INTERRUPT 10h - Service 0Eh Teletype Output

Fungsi : Output karakter sederhana.

Register Input :

AH = 0Eh

AL = kode ASCII karakter

BH = nomor halaman

Register Output :

Tidak Ada.

Penjelasan : Karakter kontrol berpengaruh sesuai fungsinya. Pada ROM BIOS

dengan tanggal antara 24/4/81 ke atas umumnya register BH tidak berfungsi

karena setiap output akan dicetak ke halaman aktif.

INTERRUPT 10h - Service 0Fh Get Current Video Mode

Fungsi : Mendapatkan mode video aktif.

Register Input :

Agus Haryawan - Politama Surakarta

Page 50: Bahasa Rakitan1

Bab IV Interupsi

46

AH = 0Fh

Register Output :

AL = mode video

AH = jumlah karakter per kolom

BH = nomor halaman tampilan

Penjelasan : Jika mode video diset dengan bit 7 on, maka AL yang didapat juga

akan berisi bit 7 on. Konflik : Driver tampilan VUIMAGE

INTERRUPT 10h - Service 11h,Subservice 00h Load User Specific Character

Fungsi : Membuat karakter ASCII baru.

Terdapat pada : Sistem dilengkapi tampilan EGA, VGA, dan MCGA.

Register Input :

AH = 11h

AL = 00h

CX = jumlah karakter akan diubah

DX = nomor karakter mulai diubah

BL = nomor blok untuk diubah

BH = jumlah byte per karakter

ES:BP = buffer bentuk karakter

Register Output :

Tidak Ada

INTERRUPT 10h - Service 13h Write String

Fungsi : Mencetak string ke Layar

Terdapat pada : Mesin 80286 ke atas dengan tampilan EGA ke atas.

Register Input :

AH = 13h

AL = 00h

BH = nomor halaman

BL = atribut untuk string

CX = jumlah karakter pada string

DH,DL = koordinat untuk memulai pencetakan

ES:BP = alamat string yang akan dicetak

Register Output :

Tidak Ada.

Penjelasan : Memperlakukan karakter kontrol sesuai fungsinya.

INTERRUPT 16h - Service 00h Get Keystroke

Fungsi : Menunggu masukan keyboard.

Terdapat pada : Semua mesin.

Register Input :

AH = 00h

Register Output :

Jika AL=0 maka AH = kode Extended

Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan

INTERRUPT 16h - Service 01h Check Keystroke

Fungsi : Mengecek isi keyboard buffer.

Terdapat pada : Semua mesin.

Register Input :

AH = 01h

Register Output :

ZF=0 bila buffer tidak kosong

Jika AL=0 maka AH = kode Extended

Agus Haryawan - Politama Surakarta

Page 51: Bahasa Rakitan1

Bab IV Interupsi

47

Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan

ZF=1 bila buffer kosong

INTERRUPT 16h - Service 10h Get Enhanced Keystroke

Fungsi : Menunggu masukan keyboard.

Terdapat pada : Mesin AT dengan keyboard Enhanced.

Register Input :

AH = 10h

Register Output :

AH = kode scan

AL = kode ASCII

INTERRUPT 16h - Service 11h Check Enhanced Keystroke

Fungsi : Mengecek isi keyboard buffer.

Terdapat pada : Mesin AT dengan keyboard Enhanced.

Register Input :

AH = 11h

Register Output :

ZF=0 bila buffer tidak kosong

Jika AL=0 maka AH = kode Extended

Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan

ZF=1 bila buffer kosong

INTERRUPT 19h Bootstrap Loader

Fungsi : Melakukan Warm Boot.

Register Input :

Tidak Ada.

Register Output :

Tidak Ada.

INTERRUPT 1Bh Control Break Handler

Fungsi : Interupsi ini terjadi setiap kali terjadi penekanan tombol

Ctrl+Break.

Register Input :

Tidak Ada.

Register Output :

Tidak Ada.

INTERRUPT 1Ch Timer Tick

Fungsi : Interupsi ini disediakan untuk digunakan oleh pemakai. Interupsi 1Ch

akan terjadi kurang lebih 18,2 kali setiap detik. Anda bisa membuat program

residen dengan memanfaatkan timer tick ini.

Register Input : Tidak Ada.

Register Output : Tidak Ada.

INTERRUPT 21h - Service 01h Read Character With Echo

Fungsi : Untuk membaca masukan 1 karakter dari keyboard dan menampilkannya ke

layar. Fungsi ini dapat dihentikan oleh penekanan tombol Ctrl+Break.

Register Input :

AH = 10h

Register Output :

Agus Haryawan - Politama Surakarta

Page 52: Bahasa Rakitan1

Bab IV Interupsi

48

AL = Kode ASCII

Catatan : Berbeda dengan fungsi dari BIOS, untuk membaca karakter khusus yang

mempunyai kode Extended, anda harus membacanya dua kali dengan fungsi dari

DOS ini.

INTERRUPT 21h - Service 02h Write Character To Standard Output

Fungsi : Untuk mencetak satu buah karakter pada layar.

Register Input :

AH = 02h

DL = Kode ASCII

Register Output :

Tidak ada

INTERRUPT 21h - Service 07h Direct Character Input Without Echo

Fungsi : Untuk membaca masukan 1 karakter dari keyboard. Fungsi ini tidak

akan menampilkan karakter yang ditekan pada layar, selain itu penekanan

tombol Ctrl+Break juga akan diabaikan.

Register Input :

AH = 07h

Register Output :

AL = Kode ASCII

INTERRUPT 21h - Service 08h Character Input Without Echo

Fungsi : Untuk membaca masukan 1 karakter dari keyboard. Fungsi ini tidak

akan menampilkan karakter yang ditekan pada layar. Penekanan tombol

Ctrl+Break akan menghentikan fungsi ini.

Register Input :

AH = 08h

Register Output :

AL = Kode ASCII

INTERRUPT 21h - Service 09h Write String To Standard Output

Fungsi : Untuk mencetak string ke layar.

Register Input :

AH = 09h

DS:DX = String yang diakhiri dengan tanda "$".

Register Output :

Tidak ada

INTERRUPT 21h - Service 0Ah Input Str ing Fungsi : Untuk mendapatkan masukan string dari keyboard.

Register Input :

AH = 0Ah

DS:DX = Buffer

Spesifikasi buffer:

- Offset 00 mencatat maksimum karakter yang dapat dimasukkan.

- Offset 01 banyaknya masukan dari keyboard yang telah diketikkan. Tombol CR

tidak akan dihitung.

- Offset 02 keatas, tempat dari string yang diketikkan disimpan.

Register Output :

Buffer terisi

INTERRUPT 21h - Service 0Bh Get Status

Agus Haryawan - Politama Surakarta

Page 53: Bahasa Rakitan1

Bab IV Interupsi

49

Fungsi : Mengecek isi keyboard buffer.

Register Input :

AH = 0Bh

Register Output :

AL = 00 jika tidak ada karakter

AL = FFh jika ada karakter

INTERRUPT 21h - Service 14h Sequential Read From FCB File

Fungsi : Untuk membaca file secara sekuensial.

Register Input :

AH = 14h

DS:DX = FCB

Register Output :

AL = status

INTERRUPT 21h - Service 25h Set Interrupt Vektor

Fungsi : Untuk merubah vektor interupsi ke suatu lokasi dengan merubah alamat

awal vektor interupsi.

Register Input :

AH = 25h

AL = Nomor Interupsi

DS:DX = Lokasi baru

Register Output :

Konflik : Phar Lap 386

INTERRUPT 21h - Service 2Fh Get DTA Address

Fungsi : Untuk mengetahui alamat dari DTA yang digunakan.

Register Input :

AH = 2Fh

Register Output :

ES:BX = Lokasi DTA

INTERRUPT 21h - Service 31h Terminate And Stay Residen

Fungsi : Untuk meresidenkan suatu program.

Register Input :

AH = 31h

AL = Kode return

DX = Besar memory dalam paragraph

Register Output :

INTERRUPT 21h - Service 33h Extended Break Checking

Fungsi : Untuk menghidup dan matikan pengecekan tombol Ctrl+Break oleh fungsi

DOS.

Register Input :

AH = 33h

AL = 0 untuk mengambil keterangan Ctrl+Break

= 1 untuk merubah status Ctrl+Break

DL = 0 Ctrl+Break dijadikan Off

DL = 1 Ctrl+Break dijadikan On

Register Output :

Jika input AL=0

DL=0 Off

DL=1 On

Agus Haryawan - Politama Surakarta

Page 54: Bahasa Rakitan1

Bab IV Interupsi

50

INTERRUPT 21h - Service 35h Get Interrupt Vektor

Fungsi : Untuk mendapatkan alamat vektor interupsi dari suatu nomor

interupsi.

Register Input :

AH = 35h

AL = Nomor Interupsi

Register Output :

ES:BX = Alamat vektor interupsi

INTERRUPT 21h - Service 3Ch Create File Handle

Fungsi : Untuk menciptakan sebuah file baru dengan metode File Handle.

Register Input :

AH = 3Ch

AL = Mode, dengan bit:

0 file Read only

1 file Hidden

2 file System

3 Volume label

4 Cadangan

5 file Archive

DS:DX = Nama file ASCIIZ

Register Output :

Jika CF=0 maka AX=Nomor file handle

Jika CF=1 maka AX=Kode kesalahan

INTERRUPT 21h - Service 3Dh Open Existing File

Fungsi : Untuk membuka file yang telah ada dengan metode file handle.

Register Input :

AH = 3Dh

AL = Mode, dengan bit:

0 untuk Read only

1 untuk Write only

2 untuk Read/Write

DS:DX = Nama file ASCIIZ

Register Output :

Jika CF=0 maka AX=Nomor file handle

Jika CF=1 maka AX=Kode kesalahan

INTERRUPT 21h - Service 3Eh Close File Handle

Fungsi : Untuk menutup file handle

Register Input :

AH = 3Eh

BX = Nomor file handle

Register Output :

CF=0 jika sukses

CF=1 jika gagal, maka AX=Kode kesalahan

INTERRUPT 21h - Service 3Fh Read From File Or Device Using File Handle

Fungsi : Untuk membaca data dari suatu file atau device.

Register Input :

AH = 3Fh

BX = Nomor file handle

CX = Banyaknya byte yang akan dibaca

Agus Haryawan - Politama Surakarta

Page 55: Bahasa Rakitan1

Bab IV Interupsi

51

DS:DX = Alamat buffer

Register Output :

CF=0 jika sukses

AX=byte yang berhasil dibaca

CF=1 jika gagal

AX=Kode kesalahan

INTERRUPT 21h - Service 40h Write To Fi le Or Device Using File Handle

Fungsi : Untuk menulisi file atau device.

Register Input :

AH = 40h

BX = Nomor file handle

CX = Banyaknya byte yang

DS:DX = Alamat data

Register Output :

CF=0 jika sukses

AX=byte yang berhasil ditulisi

CF=1 jika gagal

akan ditulisi

AX=Kode kesalahan

INTERRUPT 21h - Service 41h Delete Fi le Using Fi le Handle

Fungsi : Untuk menghapus file

AH = 41h

CL = Nama file ASCIIZ

Register Input : Register Output :

CF=0 jika sukses

CF=1 jika gagal, maka AX=kode kesalahan

INTERRUPT 21h - Service 42h Set Current File Position

Fungsi : Untuk memindahkan pointer dari suatu file.

Register Input :

AH = 42h

AL = Mode perpindahan:

00 dari awal file

01 dari posisi aktif

02 dari akhir file

BX = Nomor file handle

CX:DX = Banyaknya perpindahan

Register Output :

CF=0 jika sukses

CF=1 jika gagal AX= kode kesalahan

INTERRUPT 21h - Service 43h Set And Get Fi le Atribut

Fungsi : Untuk mengetahui dan merubah atribut dari suatu file.

Register Input :

AH = 43h

AL = 0 untuk mendapatkan atribut file

1 untuk merubah atribut file

CX = atribut baru dengan bit:

0 = Read Only

1 = Hidden

2 = System

5 = Archive

Agus Haryawan - Politama Surakarta

Page 56: Bahasa Rakitan1

Bab IV Interupsi

52

DS:DX = Nama file ASCIIZ

Register Output :

Jika input AL=0, maka:

jika CF=0 CX = atribut

jika CF=1 AX = Kode kesalahan

INTERRUPT 21h - Service 4Ch Terminate With Return Code

Fungsi : Untuk menghentikan program dan mengembalikan kendali kepada DOS.

Fungsi ini lebih efektif untuk digunakan dibandingkan dengan interupsi 20h.

Register Input :

AH = 4Ch

AL = Kode return

Register Output :

Tidak ada

INTERRUPT 21h - Service 56h Rename File

Fungsi : Untuk mengganti nama file. Fungsi ini juga bisa memindahkan file ke

directory lain.

Register Input :

AH = 56h

DS:DX = Nama file ASCIIZ lama

ES:BX = Nama file ASCIIZ baru

Register Output :

CF=0 jika sukses

CF=1 jika gagal AX=Kode kesalahan

INTERRUPT 27h Terminate And Stay Residen

Fungsi : Untuk meresidenkan program.

Register Input :

DS:DX = Batas alamat residen

Register Output :

Agus Haryawan - Politama Surakarta

Page 57: Bahasa Rakitan1

53

B A B V

5 PROCEDURE DAN MAKRO

5.1 PROCEDURE

Procedure merupakan suatu alat bantu yang sangat berguna. Dengan procedure suatu

program yang besar bisa diselesaikan dengan lebih mudah. Proses pencarian kesalahan pun

akan lebih mudah bila digunakan procedure.

5.1.1 Membuat Procedure

Untuk membuat procedure bisa anda gunakan bentuk seperti pada gambar 16.1.

-------------------------------------------------------------

NamaP PROC NEAR/FAR

+---------+

| Program |

+---------+

RET

NamaP ENDP

-------------------------------------------------------------

"NamaP" adalah nama dari procedure yang kita definisikan sendiri. Untuk memudahkan

nama untuk procedure bisa anda definisikan sesuai dengan fungsi dari procedure tersebut,

seperti CLS untuk procedure yang tugasnya menghapus layar.

Di belakang kata "PROC" anda harus memilih bentuk dari procedure tersebut, yaitu

"NEAR" atau "FAR". Bentuk "NEAR" digunakan jika procedure tersebut nantinya dipanggil oleh

program yang letaknya masih satu segment dari procedure tersebut. Pada program COM yang

terdiri atas satu segment, kita akan selalu menggunakan bentuk "NEAR". Sebaliknya bentuk

"FAR" ini digunakan bila procedure dapat dipanggil dari segment lain. Bentuk ini akan kita

gunakan pada program EXE.

Perintah "RET(Return)" digunakan untuk mengembalikan Kontrol program pada si

pemanggil procedure. Pada bentuk NEAR perintah RET ini akan memPOP atau mengambil

register IP dari stack sebagai alamat loncatan menuju program pemanggil procedure.

Sedangkan pada bentuk "FAR" perintah RET akan mengambil register IP dan CS dari stack

sebagai alamat loncatan menuju program pemanggil procedure. Alamat kembali untuk

procedure disimpan pada stack pada saat procedure tersebut dipanggil dengan perintah

"CALL", dengan syntax:

CALL NamaP

Perintah Call ini akan menyimpan register IP saja bila procedure yang dipanggil

berbentuk "NEAR". Bila procedure yang dipanggil berbentuk "FAR", maka perintah "CALL" akan

menyimpan register CS dan IP.

5.1.2 Menggunakan Procedure

Sebagai contoh dari pemakaian procedure akan kita lihat pada program 16.1 yang

mencetak karakter dengan procedure.

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; PROGRAM : PROC_KAR.ASM ;

Agus Haryawan - Politama Surakarta

Page 58: Bahasa Rakitan1

Bab V Procedure dan Makro

54

; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ;

;================================================;

.MODEL SMALL

.CODE

ORG 100h

Proses : CALL Cetak_Kar ; Panggil Cetak_Kar

INT 20h

Cetak_Kar PROC NEAR

MOV AH,02h

MOV DL,'S'

INT 21h ; Cetak karakter

RET ; Kembali kepada si pemanggil

Cetak_Kar ENDP ; END Procedures

END Proses

Bila program di atas dijalankan, maka pada layar akan ditampilkan huruf "S". Untuk

membuat sebuah procedure ingatlah untuk menyimpan semua register yang digunakan oleh

procedure tersebut dan mengembalikan semua isi register pada akhir procedure. Hal ini

dilakukan untuk menjaga supaya program utama yang menggunakan procedure tersebut tidak

menjadi kacau nantinya.

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; PROGRAM : PROC_KA1.ASM ;

; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ;

; ;

;================================================;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kar DB ?

Klm DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 Karakter

Proses : MOV CX,28 ; Banyaknya pengulangan

XOR BX,BX ; Addressing Mode

Ulang :

MOV DL,Klm[BX]

MOV Kar,DL

CALL Cetak_Kar ; Panggil Cetak_Kar

INC BX

LOOP Ulang

INT 20h

Cetak_Kar PROC NEAR

PUSH AX ; Simpan semua register

PUSH DX ; Yang digunakan

Agus Haryawan - Politama Surakarta

Page 59: Bahasa Rakitan1

Bab V Procedure dan Makro

55

MOV AH,02h

MOV DL,Kar

INT 21h ; Cetak karakter

POP DX ; Kembalikan semua register

POP AX ; Yang disimpan

RET ; Kembali kepada si pemanggil

Cetak_Kar ENDP ; END Procedures

END TData

Bila program di atas dijalankan, maka pada layar akan ditampilkan:

BATMAN SI MANUSIA KELELAWAR

Pada procedure kita tidak bisa menggunakan parameter, inilah salah satu kelemahan

dari procedure yang sangat berarti. Untuk menggunakan parameter anda harus menggunakan

MACROS.

5.2 MACRO

Macro hampir sama dengan procedure, yang dapat membantu anda dalam membuat

program yang besar. Dengan Macro anda tidak perlu menggunakan perintah "CALL" dan anda

juga bisa menggunakan parameter dengan mudah. Suatu ciri dari pemrograman bahasa tingkat

tinggi!

5.2.1 Membuat Makro

Macro adalah lebih mudah dibuat daripada procedure. Untuk membuat Macro bisa anda

gunakan bentuk seperti berikut:

---------------------------------------------------------------

NamaM MACRO [P1,P2,,]

+------------+

| Program |

+------------+

ENDM

---------------------------------------------------------------

"P1" dan "P2" adalah parameter yang bisa anda gunakan pada macro. Parameter ini

berbentuk opsional, artinya bisa digunakan ataupun tidak. Supaya lebih jelas bisa anda lihat

pada program MAC1 yang menggunakan macro ini untuk mencetak karakter.

Cetak_Kar MACRO Kar

MOV CX,3

MOV AH,02

MOV DL,Kar

Ulang :

INT 21h ; Cetak Karakter

LOOP Ulang

ENDM ; End Macro

Agus Haryawan - Politama Surakarta

Page 60: Bahasa Rakitan1

Bab V Procedure dan Makro

56

;----------------------------------------------------------------;

; Program : MAC1.ASM ;

; Fungsi : Menggunakan Macro untuk mencetak huruf 'SSS' ;

;----------------------------------------------------------------;

.MODEL SMALL

.CODE

ORG 100h

Proses:

Cetak_Kar 'S' ; Cetak Huruf S

INT 20h

END Proses

Dari program MAC1 bisa anda lihat betapa mudahnya untuk menggunakan macro. Pada

procedure, setiap kali kita memanggilnya dengan perintah CALL maka program akan melompat

pada procedure tersebut, sehingga setiap procedure hanya terdapat satu kali saja pada

program. Lain halnya dengan Macro, setiap terjadi pemanggilan terhadap macro atau dapat

dikatakan secara kasar, setiap kita memanggil macro dengan menuliskan nama macronya

dalam program, maka seluruh isi macro akan dipindahkan pada program yang memanggilnya.

Dengan demikian bila pada program anda memanggil suatu macro sebanyak 10 kali maka

macro tersebut akan disisipkan 10 kali pada program. Hal inilah yang menyebabkan program

yang menggunakan macro ukuran programnya menjadi lebih besar. Tetapi hal ini juga yang

menyebabkan program yang menggunakan macro lebih cepat daripada procedure, karena

pada procedure komputer harus melakukan lompatan tetapi pada macro tidak perlu.

5.2.2 Label Pada Makro

Pada macro anda bisa menggunakan label seperti biasa. Tetapi anda harus ingat,

karena setiap pemanggilan Macro akan menyebabkan seluruh isi macro tersebut disisipkan

pada program, maka pada macro yang di dalamnya menggunakan label hanya dapat dipanggil

sebanyak satu kali. Bila anda menggunakannya lebih dari satu kali maka akan terjadi "**Error**

Symbol already defined elsewhere: ULANG" karena dianggap kita menggunakan label yang

sama.

Untuk menghindari hal itu, gunakanlah direktif LOCAL. Dengan direktif LOCAL

assembler akan membedakan label tersebut setiap kali terjadi pemanggilan terhadapnya.

Cetak_Kar MACRO Kar

LOCAL Ulang ; Label 'Ulang' jadikan Local

MOV CX,3

MOV AH,02

MOV DL,Kar

Ulang:

INT 21h ; Cetak Karakter

LOOP Ulang

ENDM ; End Macro

;--------------------------------------------------------------------;

; Program : MAC2.ASM ;

; Fungsi : Menggunakan Macro untuk mencetak huruf 'PPPCCC' ;

Agus Haryawan - Politama Surakarta

Page 61: Bahasa Rakitan1

Bab V Procedure dan Makro

57

;--------------------------------------------------------------------;

.MODEL SMALL

.CODE

ORG 100h

Proses:

Cetak_Kar 'P' ; Cetak Huruf P

Cetak_Kar 'C' ; Cetak Huruf C

INT 20h

END Proses

5.3 MACRO ATAU PROCEDURE

Banyak pro dan kontra mengenai macro dan procedure ini. Sebagian orang

menganggap macro akan merugikan program, tetapi banyak juga yang menganggap macro

adalah pemecahan yang tepat dalam pemrograman assembler yang terkenal sulit untuk

digunakan. Kini apa yang akan anda pakai ? Macro ataukah procedure ? Untuk itu marilah kita

lihat dahulu perbedaan antara procedure dan macro ini.

- Procedure tidak memperpanjang program, karena hanya muncul sekali saja pada program.

- Macro akan muncul pada program setiap terjadi pemanggilan terhadap macro, sehingga

macro akan memperpanjang program.

- Untuk menggunakan procedure anda harus memanggilnya dengan perintah CALL dan

dalam procedure diakhiri dengan RET.

- Macro bisa anda gunakan dengan memanggil langsung namanya dan pada macro tidak

perlu diakhiri dengan RET.

- Procedure akan memperlambat program, karena setiap pemanggilan terhadap procedure,

komputer harus melakukan lompatan.

- Macro tidak memperlambat program karena komputer tidak perlu melakukan lompatan.

- Pada procedure anda tidak bisa menggunakan parameter secara langsung. Bila anda ingin

menggunakan parameter bisa dengan melalui stack atau register.

- Macro dengan mudah bisa menggunakan parameter, suatu ciri bahasa tingkat tinggi.

- Macro lebih mudah dibuat dan digunakan daripada procedure.

Setelah melihat perbedaan-perbedaan tersebut, kapankah kita menggunakan procedure

dan kapankah menggunakan macro ?

- Jika fungsi tersebut jarang dipanggil, gunakanlah MACRO karena macro tidak

memperlambat proses.

- Jika fungsi tersebut sering dipanggil, gunakanlah PROCEDURE karena procedure tidak

memperbesar program.

- Jika fungsi tersebut kecil, gunakanlah MACRO. Karena pengaruh terhadap besarnya

program hanya sedikit dan program akan lebih cepat.

- Jika fungsi tersebut besar, gunakanlah PROCEDURE. Karena procedure tidak memperbesar

program.

Agus Haryawan - Politama Surakarta

Page 62: Bahasa Rakitan1

58

6 CONTOH-CONTOH PROGRAM UNTUK LATIHAN

Program 1

;===============================================;

; FUNGSI : MENCETAK KARATER 'A' DENGAN INT 21 ;

;===============================================;

.MODEL SMALL

.CODE

ORG 100h

Proses :

MOV AH,02h ; Nilai servis ntuk mencetak karakter

MOV DL,'A' ; DL = Karakter ASCII yang akan dicetak

INT 21h ; Cetak karakter !!

INT 20h ; Selesai ! kembali ke DOS

END Proses

Program 2

;=================================================================;

; PROGRAM: A1.ASM ;

; FUNGSI : MENCETAK KARATER 'A' BESERTA ATRIBUTNYA DENGAN INT 10h ;

;=================================================================;

.MODEL SMALL

.CODE

ORG 100h

Proses :

MOV AH,09h ; Nilai servis untuk mencetak karakter

MOV AL,'A' ; AL = Karakter yang akan dicetak

MOV BH,00h ; Nomor Halaman layar

MOV BL,93h ; Warna atau atribut dari karakter

MOV CX,03h ; Banyaknya karakter yang ingin dicetak

INT 10h ; Laksanakan !!!

INT 20h ; Selesai ! kembali ke DOS

END Proses

Program 3

;==============================================================;

; PROGRAM : ABC0.ASM ;

; FUNGSI : MENCETAK 16 BUAH KARAKTER DENGAN INT 21h SERVIS 02 ;

;==============================================================;

.MODEL SMALL

.CODE

ORG 100h

Proses :

MOV AH,02h ; Nilai servis

MOV DL,'A' ; DL=karakter 'A' atau DL=41h

MOV CX,10h ; Banyaknya pengulangan yang akan

Ulang :

INT 21h ; Cetak karakter !!

INC DL ; Tambah DL dengan 1

LOOP Ulang ; Lompat ke Ulang

Agus Haryawan - Politama Surakarta

Page 63: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

59

INT 20h

END Proses

Program 4

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; PROGRAM : TAMBAH.ASM ;

; FUNGSI : MELIHAT PENAMBAHAN YANG DILAKUKAN OLEH BERBAGAI PERINTAH ;

;====================================================================;

.MODEL SMALL

.CODE

ORG 100h

Proses :

MOV AH,15h ; AH:=15h

MOV AL,4 ; AL:=4

ADD AH,AL ; AH:=AH+AL, jadi AH=19h

MOV AX,1234h ; NIlai AX:=1234h dan carry=0

MOV BX,0F221h ; Nilai BX:=F221h dan carry=0

ADD AX,BX ; AX:=AX+BX, jadi nilai AX=0455h

MOV AX,1234h ; AX = 1234h CF = 0

MOV BX,9ABCh ; BX = 9ABCh CF = 0

MOV CX,5678h ; BX = 5678h CF = 0

MOV DX,0DEF0h ; DX = DEF0h CF = 0

ADD CX,DX ; CX = 3568h CF = 1

ADC AX,BX ; AX = AX+BX+CF = ACF1

INC AL ; AL:=AL+1, nilai pada AL ditambah 1

INT 20h

END Proses

Program 5

;===============================================;

; PROGRAM : KURANG.ASM ;

; FUNGSI : MENGURANGKAN ANGKA 122EFFF-0FEFFFF ;

;===============================================;

.MODEL SMALL

.CODE

ORG 100h

TData :

JMP Proses ; Lompat ke Proses

ALo EQU 0EFFFh

AHi EQU 122h

BLo EQU 0FFFFh

Bhi EQU 0FEh

HslLo DW ?

HslHi DW ?

Proses :

MOV AX,ALo ; AX=EFFFh

SUB AX,Blo ; Kurangkan EFFF-FFFF, jadi AX=F000

MOV HslLO,AX ; HslLo bernilai F000

MOV AX,AHi ; AX=122h

SBB AX,BHi ; Kurangkan 122-FE-Carry, AX=0023

Agus Haryawan - Politama Surakarta

Page 64: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

60

MOV HslHi,AX ; HslHi bernilai 0023

INT 20h ; Kembali ke DOS

END TData

Program 6

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; PROGRAM : CBA0.ASM ;

; FUNGSI : MENCETAK KARAKTER "Z".."A" DENGAN INT 21h SERVIS 02 ;

;=================================================================;

.MODEL SMALL

.CODE

ORG 100h

Proses :

MOV AH,02h ; Nilai servis

MOV DL,'Z' ; DL=5Ah

MOV CX,26 ; Banyaknya pengulangan yang akan

; dilakukan

Ulang:

INT 21h ; Cetak karakter !!

DEC DL ; Kurang DL dengan 1

LOOP Ulang ; Lompat ke Ulang

INT 20h

END Proses

Program 7

;========================================================;

; PROGRAM : KALI.ASM ;

; FUNGSI : MENGALIKAN BILANGAN 16 BIT, HASIL PADA DX:AX ;

;========================================================;

.MODEL SMALL

.CODE

ORG 100h

TData :

JMP Proses ; Lompat ke Proses

A DW 01EFh

B DW 02FEh

HslLo DW ?

HslHi DW ?

Proses:

MOV AX,A ; AX=1EF

MUL B ; Kalikan 1FH*2FE

MOV HslLo,AX ; AX bernilai C922 sehingga HslLo=C922

MOV HslHi,DX ; DX bernilai 0005 sehingga HslHi=0005

INT 20h ; Kembali ke DOS

END TData

Program 8

;====================================================;

; PROGRAM : BAGI.ASM ;

; FUNGSI : MEMBAGI BILANGAN 16 BIT, HASIL PADA DX:AX ;

;====================================================;

Agus Haryawan - Politama Surakarta

Page 65: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

61

.MODEL SMALL

.CODE

ORG 100h

TData :

JMP Proses ; Lompat ke Proses

A DW 01EFh

B DW 2

Hsl DW ?

Sisa DW ?

Proses:

SUB DX,DX ; Jadikan DX=0

MOV AX,A ; AX=1EF

DIV B ; Bagi 1EF:2

MOV Hsl,AX ; AX bernilai 00F7 sehingga Hsl=00F7

MOV Sisa,DX ; DX berisi 0001 sehingga Sisa=0001

INT 20h ; Kembali ke DOS

END Tdata

Program 9

;==================================================;

; PROGRAM : BHSMESIN.ASM ;

; FUNGSI : MEMBUNYIKAN SPEAKER DENGAN DATA PROGRAM ;

;==================================================;

.MODEL SMALL

.CODE

ORG 100h

Tdata:DB 0E4h,61h,24h,0FEh,0E6h,61h,0B9h,0D0h,7h,0BBh,9Ah

DB 2h,8Bh,0D1h,51h,34h,2h,0E6h,61h,0D1h,0C3h,73h,6h

DB 83h,0C1h,0h,0EBh,0Bh,90h,52h,2Bh,0D1h,87h,0D1h,5Ah

DB 81h,0C1h,34h,8h,0E2h,0FEh,59h,0E2h,0E2h,0CDh,20h

END Tdata

Program 10

;============================================;

; FUNGSI : DEMO PENYIMPANAN TIPE DATA ;

;============================================;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

A DB 12h,34h

B DW 0ABCDh

C DD 56789018h

D DB 40 DUP(1)

END Tdata

Program 11

;=============================================================;

; PROGRAM : PTR.ASM ;

Agus Haryawan - Politama Surakarta

Page 66: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

62

; FUNGSI : MEMINDAHKAN DATA ANTAR TIPE DATA YANG BERBEDA !!! ;

;=============================================================;

.MODEL SMALL

.CODE

ORG 100h

TData :

JMP Proses ; Lompat ke Proses

A DW 01EFh ; 2 Byte

B DW 02FEh ; 2 Byte

D DD ? ; 4 Byte

Proses:

MOV AL,BYTE PTR A ; AL=EF, AX=?EF

MOV AH,BYTE PTR A+1 ; AH=01, AX=01EF

MOV BX,B ; BX=02FE

MOV WORD PTR D,AX ; D=??01EF

MOV WORD PTR D+2,BX ; D=02FE01EF

INT 20h ; Kembali ke DOS

END TData

Program 12

;=======================================================;

; PROGRAM : KALIPTR.ASM ;

; FUNGSI : MENGALIKAN BILANGAN 16 BIT, HASIL PADA DX:AX ;

;=======================================================;

.MODEL SMALL

.CODE

ORG 100h

TData :

JMP Proses ; Lompat ke Proses

A DW 01EFh ; 2 Byte

B DW 02FEh ; 2 Byte

Hsl DD ? ; 4 Byte

Proses:

MOV AX,A ; AX=1EF

MUL B ; Kalikan 1FH*2FE

MOV WORD PTR Hsl,AX ; AX bernilai C922, Hsl=??C922

MOV WORD PTR Hsl+2,DX ; DX bernilai 0005, Hsl=0005C922

INT 20h ; Kembali ke DOS

END TData

Program 13

;/================================\;

; PROGRAM : ADDR1.ASM ;

; FUNGSI : PERKALIAN DENGAN 80386 ;

;\================================/;

.MODEL SMALL

.386 ; Untuk prosesor 80386

.CODE

ORG 100h

Proses :

Agus Haryawan - Politama Surakarta

Page 67: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

63

MOV EAX,12345678h ; Immediate Addressing

MOV EDX,33112244h ; Immediate Addressing

MOV EBX,EDX ; Register Addressing

MUL EBX ; Register Addressing

END Proses

Program 14

;/================================================\;

; PROGRAM : RID.ASM ;

; FUNGSI : MENGAKSES DATA MELALUI ALAMAT EFEKTIVE ;

;\================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal DB 'ABCDEF'

Proses:

LEA BX,Kal ; Ambil Offset Kal

MOV CX,2

Ulang:

MOV DL,[BX] ; kode ASCII yang ingin dicetak

MOV AH,02h ; Nilai servis ntuk mencetak karakter

INT 21h ; Laksanakan !!

ADD BX,2 ; BX:=BX+2

LOOP Ulang ; Lompat ke Ulang

INT 20h

END TData

Program 15

;/========================================================\;

; PROGRAM : BRA0.ASM ;

; FUNGSI : MENGAKSES DATA DENGAN BASE RELATIVE ADDRESSING ;

;\========================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Tabel DW 11h,50h,0Ah,14h,5Ah

Proses:

LEA BX,Tabel

MOV AX,Tabel

ADD AX,[BX]+2

ADD AX,[BX]+4

ADD AX,[BX+6]

ADD AX,[BX+8]

INT 20h

END TData

Agus Haryawan - Politama Surakarta

Page 68: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

64

Program 16

;/==========================================================\;

; PROGRAM : BRA1.ASM ;

; FUNGSI : MENCETAK KALIMAT DENGAN BASE RELATIVE ADDRESSING ;

;\==========================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kalimat DB 'NYAMUK GORENG' ; 13 karakter

Proses:

XOR BX,BX ; BX=0 Untuk penunjuk Offset

MOV CX,13 ; Counter LOOP

Ulang :

MOV DL,Kalimat[BX] ; Ambil karakter yang ke BX

MOV AH,02 ; Servis untuk cetak karakter

INT 21h ; Cetak Karakter

INC BX ; BX:=BX+1

LOOP Ulang ; Lompat ke Ulang sampai CX=0

INT 20h ; Selesai, kembali ke DOS !!

END TData

Program 17

;/=====================================\;

; PROGRAM : VRBIOS.ASM ;

; FUNGSI : MELIHAT VERSI BIOS KOMPUTER ;

;\=====================================/;

.MODEL SMALL

.CODE

ORG 100h

Proses :

MOV AX,0F000h ; Masukkan nilai F000 pada AX

MOV ES,AX ; Copykan nilai AX ke ES

MOV BX,0FFF5h ; Penunjuk Offset

XOR SI,SI ; Jadikan SI=0

MOV CX,8 ; Counter untuk LOOP

Ulang:

MOV DL,ES:[BX][SI] ; Ambil isi alamat ES:BX+SI

MOV AH,02h ; Nilai servis mencetak karakter

INT 21h ; Cetak !!

INC SI ; SI:=SI+1

LOOP Ulang ; Lompat ke Ulang sampai CX=0

INT 20h ; Selesai ! kembali ke DOS

END Proses

Program 18

;/=======================================================\;

; PROGRAM : BIA.ASM ;

; FUNGSI : MENGAKSES ARRAY DENGAN BASE INDEXED ADDRESSING ;

;\=======================================================/;

Agus Haryawan - Politama Surakarta

Page 69: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

65

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Mahasiswa STRUC

Nim DW 0 ; 2 byte

Tinggi DB 0 ; 1 byte

Nilai DB 0,0,0,0 ; 4 byte

Mahasiswa ENDS

Absen Mahasiswa 10 DUP (<>)

Proses:

LEA BX,Absen ; BX Menunjuk Offset Absen

ADD BX,21 ; BX Menunjuk pada Record ke 4

XOR SI,SI ; SI=0

MOV [BX][SI].Nim ,0099h ; NIM, record ke 4

MOV [BX][SI].Tinggi ,10h ; Tinggi, record ke 4

MOV [BX][SI+1].Nilai,78h ; Nilai pertama

MOV [BX][SI+2].Nilai,99h ; Nilai kedua

MOV [BX][SI+3].Nilai,50h ; Nilai keempat

MOV [BX][SI+4].Nilai,83h ; Nilai kelima

INT 20h ; Selesai !!

END TData

Program 19

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; Program: kal0.asm ;

; Fungsi : Mencetak String dengan Int 21 servis 9 ;

;=================================================;

.MODEL SMALL

.CODE

ORG 100h

Tdata : JMP Proses

Kal0 DB 'PROSES PENCETAKAN STRING ',13,10,'$'

Kal1 DB 'DIBELAKANG TANDA $ TIDAK BISA DICETAK '

Proses:

MOV AH,09h ; Servis ke 9

MOV DX,OFFSET Kal0 ; Ambil Alamat Offset Kal0

INT 21h ; Cetak perkarakter sampai tanda $

LEA DX,Kal0 ; Ambil Alamat Offset Kal0

INT 21h ; Cetak perkarakter sampai tanda $

LEA DX,Kal0+7 ; Ambil Alamat Offset KAl0+7

INT 21h ; Cetak perkarakter sampai tanda $

LEA DX,KAL1 ; Ambil Offset kal1

INT 21h ; Cetak perkarakter sampai ketemu $

INT 20h ; Selesai, kembali ke DOS

END Tdata

Agus Haryawan - Politama Surakarta

Page 70: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

66

Program 20

;/=============================================\;

; Program : ATTR-KLM.ASM ;

; Fungsi : Mencetak kalimat disertai atributnya ;

;-----------------------------------------------;

; INT 10h ;

;-----------------------------------------------;

; Input : ;

; AX = 1300h ;

; BL = Atribut ;

; BH = Halaman tampilan ;

; DL = Posisi X ;

; DH = Posisi Y ;

; CX = Panjang kalimat<dalam karakter> ;

; ES:BP = Alamat awal string ;

;\=============================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal0 DB ' Menulis kalimat dengan Atributnya '

Proses:

MOV AX,1300h ; Servis 13h subfungsi 00

MOV BL,10010101b ; Atribut tulisan

MOV BH,00 ; Halaman tampilan 0

MOV DL,20 ; Posisi X

MOV DH,12 ; Posisi Y

MOV CX,35 ; Banyaknya karakter dalam string

LEA BP,Kal0 ; ES:BP alamat string

INT 10h ; Cetak kalimat !

INT 20h ; Selesai, kembali ke DOS

END TData

Program 21

;/===============================================================\;

; Program : CMPJ.ASM ;

; Fungsi : Mendemokan perintah lompat yang mengikuti perintah CMP ;

;\===============================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData: JMP Proses

BilA DB 67

BilB DB 66

Kal0 DB 'Bilangan A lebih kecil dari bilangan B $'

Kal1 DB 'Bilangan A sama dengan bilangan B $'

Kal2 DB 'Bilangan A lebih besar dari bilangan B $'

Proses:

MOV AL,BilA ; Masukkan bilangan A pada AL

CMP AL,BilB ; Bandingkan AL(BilA) dengan Bilangan B

JB AKecil ; Jika BilA < BilB, lompat ke AKecil

JE Sama ; Jika BilA = BilB, lompat ke Sama

Agus Haryawan - Politama Surakarta

Page 71: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

67

JA ABesar ; Jika BilA > BilB, lompat ke ABesar

Akecil:

LEA DX,Kal0 ; Ambil offset Kal0

JMP Cetak ; Lompat ke cetak

Sama:

LEA DX,Kal1 ; Ambil offset Kal1

JMP Cetak ; Lompat ke cetak

ABesar:

LEA DX,Kal2 ; Ambil offset Kal2

Cetak:

MOV AH,09 ; Servis untuk mencetak kalimat

INT 21h ; Cetak kalimat !!

EXIT: INT 20h ; Kembali ke DOS.

END TData

Program 22

;/======================================================================\;

; Program : JMPL.ASM ;

; Fungsi : Mencetak kalimat secara perkarakter sampai ditemui karakter '*'

;\======================================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal DB ' Lucky Luck menembak ',13,10

DB 'Lebih cepat dari bayangannya !! ',7,7,'*'

Proses:

XOR BX,BX ; BX=0

MOV AH,02h ; Servis Untuk Cetak Karakter

Ulang:

CMP Kal[BX],'*' ; Bandingkan dengan '*'

JE Exit ; Jika Sama Lompat ke Exit

MOV DL,Kal[BX] ; Masukkan karakter ke BX menuju DL

INT 21h ; Cetak karakter

INC BX ; Tambah 1 pada BX

JMP Ulang ; Lompat Ke Ulang

Exit : INT 20h ; Selesai ! kembali ke DOS

END TData

Program 23

;/======================================================================\;

; Program : NSTACK.ASM ;

; Fungsi : Mencetak kalimat 2 kali dengan operasi yang mirip dengan stack;

;\======================================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal DB 'LANG LING LUNG $'

Ganti DB 13,10,'$'

Agus Haryawan - Politama Surakarta

Page 72: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

68

Stacks DW ?

Proses:

LEA DX,Kal

MOV Stacks,DX

MOV AH,09

INT 21h

LEA DX,Ganti

INT 21h

MOV DX,Stacks

INT 21h

Exit : INT 20h

END TData

Program 24

;/=====================================================================\;

; Program : STACK.ASM ;

; Fungsi : Mencetak kalimat 2 kali dengan operasi stack yang sebenarnya ;

;\=====================================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal DB 'LANG LING LUNG $'

Ganti DB 13,10,'$'

Stacks DW ?

Proses:

LEA DX,Kal

PUSH DX

MOV AH,09

INT 21h

LEA DX,Ganti

INT 21h

POP DX

INT 21h

Exit : INT 20h

END TData

Program 25

;/===========================================\;

; Program : READKEY.ASM ;

; Fungsi : Input satu karakter dari keyboard. ;

;=============================================;

; INTERUPSI 16h ;

;=============================================;

; Input: OutPut: ;

; AH = 0 Jika tombol biasa, maka: ;

; AL = ASCII ;

; AH = SCAN ;

; ;

Agus Haryawan - Politama Surakarta

Page 73: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

69

; Jika Tombol khusus, maka ;

; AL = 00 ;

; AH = Extended ;

;\===========================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

T_ASCII DB 13,10,'Ini adalah tombol ASCII : $'

T_Extended DB 13,10,'Ini adalah tombol Extended $'

Proses :

MOV AH,0 ; Servis Input satu karakter

INT 16h ; Laksanakan

PUSH AX ; Simpan hasil pembacaan pada stack

CMP AL,00 ; Apakah ini karakter extended ?

JE Extended ; Ya !, Lompat ke Extended

ASCII:

LEA DX,T_ASCII ; Ambil alamat efektif T_ASCII

MOV AH,09 ; Servis cetak kalimat

INT 21h ; Cetak kalimat !

POP AX ; Ambil kembali nilai AX pada stack

MOV DL,AL ; Ambil kode ASCII yang ditekan

MOV AH,2 ; Servis cetak karakter

INT 21h ; Cetak karakter !

CMP AL,'Q' ; Apakah yang ditekan huruf 'Q' ?

JE exit ; Ya !, lompat ke Exit

CMP AL,'q' ; Apakah yang ditekan huruf 'q' ?

JE exit ; Ya !, lompat ke Exit

JMP Proses ; Lompat ke Proses

Extended:

LEA DX,T_Extended ; Ambil alamat efektif T_Extended

MOV AH,09 ; Servis cetak kalimat

INT 21h ; Cetak kalimat !

JMP Proses ; Lompat ke Proses

exit: INT 20h ; Kembali ke DOS !

END TData

Program 26

;/================================================\;

; Program : KEYPRESS.ASM ;

; Fungsi : Mengecek apakah ada tombol yang ditekan ;

;==================================================;

; INTERUPSI 16h ;

;==================================================;

; Input: OutPut: ;

; AH = 1 Jika Ada tombol yang ditekan ;

; ZF = 0 dan ;

; AL = kode ASCII ;

; AH = Scan Code ;

; ;

; Jika Tidak ada penekanan Tombol ;

; ZF = 1 ;

Agus Haryawan - Politama Surakarta

Page 74: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

70

;\===============================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal0 DB 'Tekan sembarang tombol untuk berhenti ! '

DB 13,10,'$'

Proses :

MOV AH,1 ; Servis untuk mengecek buffer keyboard

INT 16h ; Laksanakan !

JNZ EXIT ; Jika ada tombol yang ditekan, lompat

; Ke EXIT

MOV AH,09 ; Servis untuk cetak kalimat

LEA DX,Kal0 ; Ambil alamat efektif Kal0

INT 21h ; Cetak kalimat !

JMP Proses ; Lompat ke Proses

exit : INT 20h ; Kembali ke DOS !

END TData

Program 27

;===========================================================;

; Program Masukan String Dari Keyboard ;

; Input: ;

; AH = 0Ah ;

; DS:DX = Penampung dengan spesifikasi: ;

; Byte 1 = Maksimum karakter yang dapat dimasukkan ;

; Byte 2 = Akan dijadikan Indikator banyaknya ;

; karakter yang dimasukkan ;

; Byte 3 keatas = Tempat hasil masukan ditampung ;

;\=========================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

T_Enter EQU 0Dh

Kal0 DB 'Ketikkan satu Kalimat : $'

Kal1 DB 13,10,'Kalimat pada buffer : $'

Buffer DB 23,?,23 DUP(?)

Proses : MOV AH,09

LEA DX,Kal0

INT 21h ; Cetak kalimat Kal0

MOV AH,0Ah ; Servis Input kalimat

LEA DX,Buffer ; DX menunjuk pada offset Buffer

INT 21h ; Input kalimat !

MOV AH,09

LEA DX,Kal1

INT 21h ; Cetak kalimat Kal1

LEA BX,Buffer+2 ; BX menunjuk byte ke 3 Buffer

Ulang:

CMP BYTE PTR [BX],T_Enter ; Apakah karakter Enter?

Agus Haryawan - Politama Surakarta

Page 75: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

71

JE EXIT ; Ya! Lompat ke Exit

MOV DL,[BX] ; Masukkan karakter pada DL

MOV AH,02 ; Servis cetak karakter

INT 21h ; Cetak karakter

INC BX ; BX := BX+1

JMP Ulang ; Lompat ke Ulang

EXIT: INT 20h ; Kembali ke DOS !

END TData

Program 28

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; PROGRAM : PROC_KAR.ASM ;

; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ;

;=============================================;

.MODEL SMALL

.CODE

ORG 100h

Proses : CALL Cetak_Kar ; Panggil Cetak_Kar

INT 20h

Cetak_Kar PROC NEAR

MOV AH,02h

MOV DL,'S'

INT 21h ; Cetak karakter

RET ; Kembali kepada si pemanggil

Cetak_Kar ENDP ; END Procedures

END Proses

Program 29

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

; PROGRAM : PROC_KA1.ASM ;

; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ;

;============================================;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kar DB ?

Klm DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 Karakter

Proses : MOV CX,28 ; Banyaknya pengulangan

XOR BX,BX ; Addressing Mode

Ulang :

MOV DL,Klm[BX]

MOV Kar,DL

CALL Cetak_Kar ; Panggil Cetak_Kar

INC BX

LOOP Ulang

Agus Haryawan - Politama Surakarta

Page 76: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

72

INT 20h

Cetak_Kar PROC NEAR

PUSH AX ; Simpan semua register

PUSH DX ; Yang digunakan

MOV AH,02h

MOV DL,Kar

INT 21h ; Cetak karakter

POP DX ; Kembalikan semua register

POP AX ; Yang disimpan

RET ; Kembali kepada si pemanggil

Cetak_Kar ENDP ; END Procedures

END TData

Program 30

Cetak_Kar MACRO Kar

MOV CX,3

MOV AH,02

MOV DL,Kar

Ulang :

INT 21h ; Cetak Karakter

LOOP Ulang

ENDM ; End Macro

;-------------------------------------------------------;

; Program : MAC1.ASM ;

; Fungsi : Menggunakan Macro untuk mencetak huruf 'SSS' ;

;-------------------------------------------------------;

.MODEL SMALL

.CODE

ORG 100h

Proses:

Cetak_Kar 'S' ; Cetak Huruf S

INT 20h

END Proses

Program 31

Cetak_Kar MACRO Kar

LOCAL Ulang ; Label 'Ulang' jadikan Local

MOV CX,3

MOV AH,02

MOV DL,Kar

Ulang:

INT 21h ; Cetak Karakter

LOOP Ulang

ENDM ; End Macro

;----------------------------------------------------------;

; Program : MAC2.ASM ;

; Fungsi : Menggunakan Macro Untuk mencetak huruf 'PPPCCC' ;

;----------------------------------------------------------;

Agus Haryawan - Politama Surakarta

Page 77: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

73

.MODEL SMALL

.CODE

ORG 100h

Proses:

Cetak_Kar 'P' ; Cetak Huruf P

Cetak_Kar 'C' ; Cetak Huruf C

INT 20h

END Proses

Program 32

Tulis_Kar MACRO X,Y,Kar,Attr

MOV AX,0B800h

MOV ES,AX ; ES Menunjuk pada segment layar

MOV AH,Y

MOV AL,160

MUL AH ; Hitung offset baris

MOV BX,AX ; Simpan hasilnya pada BX

MOV AH,X

MOV AL,2

MUL AH ; Hitung offset kolom

ADD BX,AX ; Tambahkan hasilnya pada BX

MOV AL,Kar ; AL=karakter yang akan ditampilkan

MOV AH,Attr ; AH=Atribut yang akan ditampilkan

MOV ES:[BX],AL ; Tampilkan Karakter dan atributnya

MOV ES:[BX+1],AH ; pada posisi kolom X dan baris Y

ENDM

;/========================================================\;

; Program : LAYAR1.ASM ;

; Fungsi : Menampilkan karakter dan atributnya ;

; dengan menuliskannya langsung pada memory layar ;

;\========================================================/;

.MODEL SMALL

.CODE

ORG 100h

Proses :

Tulis_Kar 40 12 'S' 95 ; Tulis karakter 'S' dengan

; no atribut 95 pada posisi

INT 20h ; kolom 40 dan baris 12

END Proses

Program 33

Delay MACRO

PUSH CX ; Macro ini digunakan untuk

XOR CX,CX ; menunda program, dan

Loop1:

LOOP Loop1 ; hanya melakukan looping

POP CX

ENDM

Geser MACRO PosY

PUSH AX

Agus Haryawan - Politama Surakarta

Page 78: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

74

PUSH BX

PUSH CX ; Simpan semua register yang digunakan

XOR CX,CX

MOV AL,26

SUB AL,PosY

MOV CL,AL ; CX=banyaknya pergeseran kebawah

Loop2:

MOV AL,BYTE PTR ES:[BX] ; AL=Karakter pada layar

MOV BYTE PTR ES:[BX+160],AL ; Geser ke bawah

Hilang:

MOV BYTE PTR ES:[BX],' ' ; Hapus karakter

; sebelumnya

Delay ; delay, supaya bisa

; terlihat

ADD BX,160 ; Menuju baris selanjutnya

LOOP Loop2 ; Ulangi ke Loop2

POP CX

POP BX

POP AX ; Kembalikan semua register yang digunakan

ENDM

;/===================================================\;

; Program : RONTOK.ASM ;

; Fungsi : Membersihkan layar dengan cara ;

; merontokkan hurufnya satu persatu ;

;\====================================================/

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

PosY DB ?

Proses:

MOV AX,0B800h

MOV ES,AX ; ES mencatat segment layar

MOV BX,3998 ; Posisi karakter 80,25

MOV CX,25 ; Banyaknya pengulangan baris

UlangY :

MOV PosY,CL ; PosY mencatat posisi baris

PUSH CX ; CX mencatat posisi Y

MOV CX,80 ; Banyaknya pengulangan Kolom

UlangX :

CMP BYTE PTR ES:[BX],33 ; Apakah ada karakter

; pada layar ?

JB Tdk ; Lompat ke Tdk, jika tidak ada

Geser PosY ; Geser karakter tersebut ke bawah

Tdk :

SUB BX,2 ; BX menunjuk karakter selanjutnya

LOOP UlangX ; Proses 80 kali untuk kolom

POP CX ; Ambil posisi Y

LOOP UlangY ; Ulangi dan ganti baris ke atas

EXIT:

INT 20h

Agus Haryawan - Politama Surakarta

Page 79: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

75

END TData

Program 34

DELAY MACRO ; Macro untuk menunda program

LOCAL Ulang

PUSH CX

XOR CX,CX

Ulang:

LOOP Ulang

POP CX

ENDM

Scrool MACRO X1,Y1,X2,Y2,Arah

PUSH CX

MOV AH,Arah ; Servis Gulung keatas atau kebawah

MOV AL,1 ; Jumlah Baris

MOV CL,X1 ; Kolom kiri atas

MOV CH,Y1 ; Baris kiri Atas

MOV DL,X2 ; Kolom kanan bawah

MOV DH,Y2 ; Baris kanan bawah

MOV BH,01000111b ; Atribut hasil penggulungan

INT 10h

POP CX

ENDM

;/===============================================\;

; Program : SCROOL.ASM ;

; Fungsi : Menggulung layar ;

;\===============================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

G_Atas EQU 6 ; Servis untuk menggulung ke atas

G_Bawah EQU 7 ; Servis untuk menggulung ke bawah

Proses:

MOV CX,7

Ulang:

Scrool 20 7 60 14 G_Bawah

delay

LOOP Ulang

INT 20h

END TData

Program 35

Cls MACRO ; Macro untuk menghapus layar

MOV AX,0600h

XOR CX,CX

MOV DX,184Fh

MOV BH,10 ; Atribut Hijau diatas hitam

INT 10h

ENDM

GotoXY MACRO X,Y ; Macro untuk memindahkan kursor

MOV AH,02

XOR BX,BX

Agus Haryawan - Politama Surakarta

Page 80: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

76

MOV DH,Y

MOV DL,X

INT 10h

ENDM

SimpanL MACRO ; Macro untuk menyimpan seluruh

LOCAL Ulang ; isi layar monitor

MOV AX,0B800h

MOV ES,AX

MOV CX,4000

XOR BX,BX

Ulang:

MOV AL,ES:[BX]

MOV Layar[BX],AL

INC BX

LOOP Ulang

ENDM

BalikL MACRO ; Macro untuk mengembalikan semua

LOCAL Ulang ; isi layar yang telah disimpan

MOV CX,4000

XOR BX,BX

Ulang:

MOV AL,Layar[BX]

MOV ES:[BX],AL

INC BX

LOOP Ulang

ENDM

Sorot MACRO X,Y ; Macro untuk membuat sorotan

LOCAL Ulang ; pada menu

MOV BL,Y

MOV AL,160

MUL BL

MOV BX,AX

MOV AL,X

MOV AH,2

MUL AH

ADD BX,AX

INC BX ; Alamat warna pada posisi X,Y

MOV CX,25 ; Panjangnya sorotan

Ulang:

MOV BYTE PTR ES:[BX],4Fh ; Atribut sorotan

; putih diatas merah

ADD BX,2

LOOP Ulang

ENDM

Readkey MACRO ; Macro untuk membaca masukan dari

MOV AH,00 ; keyboard.

INT 16h ; hasilnya AH=Extended, AL=ASCII

ENDM

MenuL MACRO String ; Macro untuk mencetak menu

MOV AH,09

Agus Haryawan - Politama Surakarta

Page 81: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

77

LEA DX,String

INT 21h

ENDM

;/===================================================\;

; Program : SOROT.ASM ;

; Fungsi : Membuat menu sorot untuk digunakan program ;

;\===================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData: JMP Proses

Layar DB 4000 DUP (?)

Menu DB 9,9,'+=============================+',13,10

DB 9,9,'| MENU SOROT ««« |',13,10

DB 9,9,'+=============================+',13,10

DB 9,9,'| |',13,10

DB 9,9,'| 1. Pilihan pertama |',13,10

DB 9,9,'| 2. Pilihan Kedua |',13,10

DB 9,9,'| 3. Pilihan Ketiga |',13,10

DB 9,9,'| 4. Pilihan Keempat |',13,10

DB 9,9,'| |',13,10

DB 9,9,'+=============================+$'

PosX DB 22 ; Posisi kolom mula-mula

PosY DB 12 ; Posisi baris mula-mula

Panah_Atas EQU 72 ; Kode tombol panah atas

Panah_Bawah EQU 80 ; Kode tombolpanah bawah

TEnter EQU 0Dh ; Kode tombol Enter

Proses :

Cls ; Hapus layar

GotoXY 0 8 ; kursor = 0,8

MenuL Menu ; Gambar menu

SimpanL ; Simpan isi layar

Ulang :

BalikL ; Tampilkan isi layar yang

; disimpan

Sorot PosX,PosY ; Sorot posisi X,Y

Masukan:

Readkey ; Baca masukan dari keyboard

CMP AH,Panah_Bawah ; Panah bawah yang ditekan ?

JE Bawah ; Ya! lompat bawah

CMP AH,Panah_Atas ; Panah atas yang ditekan ?

JE CekY ; Ya, lompat CekY

CMP AL,TEnter ; Tombol enter yang ditekan ?

JNE Masukan ; Bukan, lompat ke ulangi

JMP Selesai ; Ya, lompat ke selesai

CekY :

CMP PosY,12 ; Apakah sorotan paling atas ?

JE MaxY ; Ya! lompat ke MaxY

DEC PosY ; Sorotkan ke atas

JMP Ulang ; Lompat ke ulang

MaxY :

MOV PosY,15 ; PosY=Sorotan paling bawah

Agus Haryawan - Politama Surakarta

Page 82: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

78

JMP Ulang ; lompat ke ulang

Bawah :

CMP PosY,15 ; apakah sorotan paling bawah ?

JE NolY ; Ya! lompat ke NolY

INC PosY ; Sorotkan ke bawah

JMP Ulang ; Lompat ke ulang

NolY :

MOV PosY,12 ; Sorotan paling atas

JMP Ulang ; Lompat ke ulang

Selesai:

INT 20h

END TData

Program 36

Delay MACRO Rep ; Macro ini untuk menunda program

LOCAL Ulang

PUSH CX

MOV DX,Rep

SUB CX,CX

Ulang:

LOOP Ulang

DEC DX

CMP DX,0

JNZ Ulang

POP CX

ENDM

Ak_Page MACRO No ; Macro ini digunakan untuk

MOV AH,5 ; mengaktifkan halaman layar

MOV AL,No

INT 10h

ENDM

;/==================================================\;

; Program : PAGE.ASM ;

; Fungsi : Untuk mengaktifkan halaman layar tertentu ;

;\==================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Kal0 DB 'INI ADALAH HALAMAN TAMPILAN KE 2 ',13,10

DB ' DENGAN ALAMAT AWAL B800:1000h !!! $'

Proses:

Ak_Page 2 ; Aktifkan halaman layar yang ke 2

MOV AH,09 ;

LEA DX,Kal0 ; Tulis kalimat pada halaman ke 2

INT 21h ;

MOV CX,3 ; Banyaknya pengulangan

Ulang:

Ak_Page 2 ; Aktifkan halaman ke 2

Delay 100

Ak_Page 0 ; Aktifkan halaman ke 0

Delay 100

LOOP Ulang

Agus Haryawan - Politama Surakarta

Page 83: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

79

INT 20h

END Tdata

Program 37

;/=====================================================================\;

; Program : MAP.ASM ;

; Fungsi : Untuk merubah bentuk karakter yang biasa digunakan. ;

; Huruf 'A', akan diubah bentuknya menjadi berbentuk pedang ! ;

;\=====================================================================/;

.MODEL SMALL

.CODE

ORG 100h

TData : JMP Proses

Tabel DB 00011000b ; __

DB 00011000b ; __

DB 10011001b ; _ __ _

DB 11111111b ; ________

DB 10011001b ; _ __ _

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00011000b ; __

DB 00001000b ; _

Proses :

MOV AX,1100h ; Servis

MOV DX,'A' ; Karakter ASCII awal yang akan diganti

MOV CX,1 ; Banyaknya karakter yang akan diganti

MOV BL,0 ; Nomor blok pemuatan karakter

MOV BH,16 ; Jumlah byte perkarakter

LEA BP,Tabel ; Lokasi tabel

INT 10h

INT 20h

END TData

Program 38

.MODEL SMALL

.CODE

ORG 100H

START:

JMP MULAI

JUDUL DB ‘╔═════════════════════╗’,13,10,’$’

JUDUL1 DB ‘║PROGRAM SUARA ║’,13,10,’$’

JUDUL2 DB ‘║TEKAN S UNTUK KELUAR ║’,13,10,’$’

JUDUL3 DB ‘╚═════════════════════╝’,13,10,’$’

Agus Haryawan - Politama Surakarta

Page 84: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

80

MULAI:

MOV AH,0 ;INT 10h service 0, mode screen

MOV AL,3 ;80 huruf x 25 baris (text), berwarna

INT 10H ;

MOV AH,09H

MOV BH,0

MOV BL,09H

MOV CX,25

LEA DX,JUDUL

INT 21H

MOV AH,09H

MOV BH,0

MOV BL,0AH

MOV CX,25

LEA DX,JUDUL1

INT 21H

MOV AH,09H

MOV BH,0

MOV BL,0CH

MOV CX,25

LEA DX,JUDUL2

INT 21H

MOV AH,09H

MOV BH,0

MOV BL,0EH

MOV CX,25

LEA DX,JUDUL3

INT 21H

IN AL,61H

OR AL,3

OUT 61H,AL

MOV AL,10110110B

OUT 43H,AL

SUARA:

MOV AX,1000000/200

OUT 42H,AL

MOV AL,AH

OUT 42H,AL

MOV AH,06

MOV DL,0FFH

INT 21H

CMP AL,'S'

JE KELUAR

CMP AL,'s'

JNE SUARA

KELUAR:

IN AL,61H

AND AL,11111100B

OUT 61H,AL

INT 20H

END START

Agus Haryawan - Politama Surakarta

Page 85: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

81

Program 39

;========================================;

; Program menampilkan huruf alfabet ;

;========================================;

.model small

.code

org 100h

start:

jmp mulai

abjad db 'Tampilan Huruf Alfabet',13,10,'$'

mulai:

mov ah,09h

mov dx,offset abjad

int 21h

mov cx,9

mov bl,1

mov ah,02h

a: mov dl,bl

add dl,30h

int 21h

mov dl,2eh

int 21h

mov dl,20h

int 21h

mov dh,41h

mov bh,26

b: mov dl,dh

int 21h

mov dl,20h

int 21h

inc dh

dec bh

cmp bh,0

jnz b

mov dl,0ah

int 21h

mov dl,0dh

int 21h

inc bl

loop a

int 20h

end start

Program 40

.model small

.code

org 100h

start:

jmp mulai

kata1 db 'Masukkan kunci anda di sini :$'

kata2 db 13,10,'Bagus.... Kunci anda benar!!$'

mulai:

mov ah,09h

mov dx, offset kata1

int 21h

masuk:

Agus Haryawan - Politama Surakarta

Page 86: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

82

mov ah,07h

int 21h

cmp al,'a'

je lewat1

cmp al,'A'

jne masuk

lewat1:

mov ah,07h

int 21h

cmp al,'k'

je lewat2

cmp al,'K'

jne masuk

lewat2:

mov ah,07h

int 21h

cmp al,'u'

je lewat3

cmp al,'U'

jne masuk

lewat3:

mov ah,09h

mov dx,offset kata2

int 21h

int 20h

end start

Program 41

.model small

.code

org 100h

start:

jmp mulai

tanya db ' Siapa Nama anda ?'

db 13,10,'Jawab Di sini :$'

tampung db 21,?,21 dup (?)

jawab db 13,10,'Bagus Nama anda adalah : $'

mulai:

mov ah,09h

mov dx,offset tanya

int 21h

mov ah,0ah

mov dx,offset tampung

push dx

int 21h

mov bx,offset tampung

inc bx

mov dl,[bx]

xor dh,dh

inc bx

add bx,dx

mov dl,'$'

mov [bx],dl

mov dx,offset jawab

Agus Haryawan - Politama Surakarta

Page 87: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

83

mov ah,09h

int 21h

pop dx

inc dx

inc dx

mov ah,09h

int 21h

int 20h

end start

Program 42

.model small

.code

org 100h

start: jmp mulai

gam db ' '

db ' '

db ' '

db ' °°°°° °°°° °° °°°°°° °°°°° °° °° °°°°° °°° °°° '

db ' °° °° °°°°°° °° °° °° °° °° °° °° °°°° °°°° '

db ' °° °° °° °° °° °° °°°°° °°°° °° °° °° °°° °° '

db ' °°°° °° °° °° °° °°°°° °°°° °°°°° °° ° °° '

db ' °° °°°°°° °° °° °° °° °° °° °° °° '

db ' °° °°°° °°°°° °° °°°°° °° °° °° °° °° '

db ' '

db ' '

db ' °°°°° °°° °°° °°°°° '

db ' °°°°°°° °°° °°° °°°°°°° '

db ' °°°° °°°° °°° °°° °°°° °°°° '

db ' °°°° °°° °°° °°°° °°°° '

db ' °°°° °°°°°°° °°° °°° '

db ' °°°°°°°°° °°°°°°° °°°°°°°°° '

db ' °°°° °°° °°° °°°°°°°°° '

db ' °°°° °°°° °°° °°° °°° °°° '

db ' °°°°°°°° °°° °°° °°° °°° '

db ' °°°°° °°° °°° °°° °°° '

db ' '

db ' Tekan Sembarang Tombol Untuk Ke DOS '

db ' '

db ' '

mulai: mov ax,0b800h

mov es,ax

mov bx,offset gam

xor di,di

ulang: mov ah,1fh

mov al,[bx]

stosw

inc bx

mov al,[bx]

cmp al,0

jne ulang

ulang1: mov ah,12

mov al,[bx]

stosw

inc bx

mov al,[bx]

cmp al,1

jne ulang1

ulang2: mov ah,13

mov al,[bx]

stosw

inc bx

Agus Haryawan - Politama Surakarta

Page 88: Bahasa Rakitan1

Contoh-Contoh Program Untuk Latihan

84

mov al,[bx]

cmp al,2

jne ulang2

sel: mov ah,01h

int 16h

jz sel

int 20h

code ends

end start

Agus Haryawan - Politama Surakarta

Page 89: Bahasa Rakitan1

KODE ASCII

85

7 KODE ASCII

7.1 HEXADESIMAL

7.2 DESIMAL

Agus Haryawan - Politama Surakarta