Anda di halaman 1dari 89

BUKU KULIAH dan MODUL LATIHAN

oleh:
HASANUDDIN SIRAIT

(Dipakai untuk kalangan sendiri)

AMIK PARBINA NUSANTARA PEMATANG SIANTAR


2007
Jln. Panei No. 34 Kebun Sayur

Hasanuddin Sirait
KATA PENGANTAR

Dengan memanjatkan puji syukur ke hadirat Tuhan Yang Maha Esa, atas segala karunia
dan rahmat-Nya, pada kesempatan ini kami selaku dosen AMIK Parbina Nusantara Pematang
Siantar 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 AMIK Parbina Nusantara Pematang Siantar..
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 AMIK Parbina Nusantara Pematang Siantar

Pematang Siantar, April 2013

Hasanuddin Sirait
NIDN. 092486802

i
Hasanuddin Sirait
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.1Instruksi Transfer Data 20
3.2Instruksi Aritmetika 23
3.3Instruksi Manipulasi Bit 27
3.4Instruksi Kontrol Aliran Program 29
3.5Instruksi String 36
3.6Instruksi Interupsi 41
3.7Instruksi Kontrol Prosesor 41

ii

Hasanuddin Sirait
Bab 4 Interupsi 43
4.1Pendahuluan 43
4.2Daftar Interupsi Pilihan 43

Bab 5 Procedure dan Makro 53


5.1Procedure 53
5.1.1 Membuat Procedure 53
5.1.2 Menggunakan Procedure 53
5.2Macro 55
5.2.1 Membuat Makro 55
5.2.2 Label Pada Makro 56
5.3Macro atau Procedure 57
Bab 6 Contoh-Contoh Program Untuk Latihan 58

iii
Hasanuddin Sirait
BAB I
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

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

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.

+AX+ +BX+ +CX+ +DX+


+-+--+--+-+ +-+--+--+-+ +-+--+--+-+ +-+--+--+-+
|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.
Jika terjadi borrow pada operasi pengurangan atau carry pada
CF (Carry Flag)
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.
2

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

IF (Interrupt CPU akan mengabaikan interupsi yang terjadi jika bit ini 0.
Enable Flag)
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 Flag ini terdiri atas 2 bit dan digunakan pada prosesor 80286
Protection level) 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:

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

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.
Operand Komentar

Label OpCode
SMALL

.MODEL 100h
.CODE
ORG Proses ; Lompat ke Proses
TData :
JMP AX,13h ; AX=13h
Proses : BX,AX ; Kurangkan BX-AX
MOV DX,BX ; DX=BX
SUB AX,30H ; AX=30h
MOV BX,AX ; Kurangkan BX-AX
MOV BX,AX
SBB ; Kembali ke DOS
MOV 20h

INT
END TData

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

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

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'
PANJANGELU $-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
COM dan EXE)

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

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

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

 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

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

- 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

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

- 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

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

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 “Hell║, mari belajar bahasa Assembler$”

Proses:
LEA DX,TEKS
MOV AH,9H
INT 21H
INT 20H
END TData Assembler$” harus

Perhatikan bahwa karakter $ (dollar) pada teks “Hello, mari belajar bahasa
10

Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register

dituliskan.
Instruksi:
- Buatlah program COM dengan TASM dan TLINK/T, lalu jalankan!

- Ketikkan program di atas pada EMU8086 dan emulasikan!

11

Hasanuddin Sirait
BAB II

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
[BX] DS
[BP] SS
Tak-langsung register
[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
12

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

[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
13

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

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
14

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

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
15

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

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

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

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

17

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

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

18

Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack

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.

19

Hasanuddin Sirait
BAB III
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:
20

Hasanuddin Sirait
Bab III Instruksi 80X86

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 21

Hasanuddin Sirait
Bab III Instruksi 80X86

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
22

Hasanuddin Sirait
Bab III Instruksi 80X86

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

23

Hasanuddin Sirait
Bab III Instruksi 80X86

 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
24
Hasanuddin Sirait
Bab III Instruksi 80X86

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

25
Hasanuddin Sirait
Bab III Instruksi 80X86

(unsigneddivide). Algoritmanya:
Untuk operan bertipe byte:
• AL=AX/operan
• AH=sisa (modulus)

• 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.
26
Hasanuddin Sirait
Bab III Instruksi 80X86

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

27
Hasanuddin Sirait
Bab III Instruksi 80X86

 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
  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
28
Hasanuddin Sirait
Bab III Instruksi 80X86

 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
29
Hasanuddin Sirait
Bab III Instruksi 80X86

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

30
Hasanuddin Sirait
Bab III Instruksi 80X86

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.

31
Hasanuddin Sirait
Bab III Instruksi 80X86

 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 ═║l.’
JMP exit
labell:
PRINT ‘CX ═ya ═║l.’
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
de═ga═ 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
32
Hasanuddin Sirait
Bab III Instruksi 80X86

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
33
Hasanuddin Sirait
Bab III Instruksi 80X86

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 ‘═║l.’ ; bisa diga═ti PRINT ‘AL =0’
JMP exit
Label1:
PRINT ‘buka═ ═║l.’ ; 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.

34
Hasanuddin Sirait
Bab III Instruksi 80X86

 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 berta═da (p║sitif).’
JMP exit
labell:
PRINT ‘berta═da (═egatif).’
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 ‘l║║pl’
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
35
Hasanuddin Sirait
Bab III Instruksi 80X86

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
36
Hasanuddin Sirait
Bab III Instruksi 80X86

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:

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:
37
Hasanuddin Sirait
Bab III Instruksi 80X86

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:
38
Hasanuddin Sirait
Bab III Instruksi 80X86

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:

JNZ not_equal
; "Ya" – sama!
MOV AL, 'Y'
MOV AH,
OEh INT lOh
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:
39
Hasanuddin Sirait
Bab III Instruksi 80X86

  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’,‘!’,‘║’
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:


40
Hasanuddin Sirait
Bab III Instruksi 80X86

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.

41
Hasanuddin Sirait
Bab III Instruksi 80X86

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

42
Hasanuddin Sirait
BAB IV
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
43
Hasanuddin Sirait
Bab IV Interupsi

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.
44
Hasanuddin Sirait
Bab IV Interupsi

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 :
45
Hasanuddin Sirait
Bab IV Interupsi

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

46
Hasanuddin Sirait
Bab IV Interupsi

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 :
47
Hasanuddin Sirait
Bab IV Interupsi

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 String

- 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
48
Hasanuddin Sirait
Bab IV Interupsi

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
49
Hasanuddin Sirait
Bab IV Interupsi

  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
50
Hasanuddin Sirait
Bab IV Interupsi

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 File 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 File Using File 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 File 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

51
Hasanuddin Sirait
Bab IV Interupsi

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 :

52
Hasanuddin Sirait
BAB V
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 ;
53
Hasanuddin Sirait
Bab V Procedure dan Makro

; 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

54
Hasanuddin Sirait
Bab V Procedure dan Makro

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
55
Hasanuddin Sirait
Bab V Procedure dan Makro

;---------------------------------------------------------------- ;
; 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' ;
56
Hasanuddin Sirait
Bab V Procedure dan Makro

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

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

57
Hasanuddin Sirait
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 ; DL =
MOV DL,'A' Karakter ASCII yang akan dicetak ; Cetak
INT 21h 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
58
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
59
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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 ;
;====================================================;

60
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

.MODEL SMALL
.CODE
ORG 100h
TData :
JMP Proses ; Lompat ke Proses
A DW 01EFh
BDW2
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 ;

61
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

; 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
DDD? ; 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 :
62
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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

63
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

 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 ;
;\=======================================================/;

64
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

.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

65
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

 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
66
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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,'$'
67
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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 ;
; ;
68
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

; 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 ; Servis
MOV AH,2 cetak karakter ; Cetak karakter !
INT 21h

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 ; Cetak kalimat ! ;
INT 21h Lompat ke Proses
JMP 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 ;
69
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

;\===============================================/;

.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 ; Cetak
INT 21h kalimat !
JMP Proses ; Lompat ke Proses

exit : INT 20h END TData ; Kembali ke DOS !

 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?
70
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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

71
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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' ; ;----


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

72
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

.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 ; kolom
INT 20h 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
73
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
74
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
75
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
76
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
77
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
78
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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,’$’

79
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
80
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

 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:
81
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
82
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

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
83
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan

mov al,[bx]
cmp al,2
jne ulang2
sel: mov ah,01h
int 16h
jz sel
int 20h
code ends
end start

84
Hasanuddin Sirait
KODE ASCII

KODE ASCII

7.1 HEXADESIMAL

7.2 DESIMAL

85
Hasanuddin Sirait

Anda mungkin juga menyukai