Buku Panduan Dan Modul
Buku Panduan Dan Modul
oleh:
HASANUDDIN SIRAIT
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
Hasanuddin Sirait
NIDN. 092486802
i
Hasanuddin Sirait
DAFTAR ISI
ii
Hasanuddin Sirait
Bab 4 Interupsi 43
4.1Pendahuluan 43
4.2Daftar Interupsi Pilihan 43
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.
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.
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
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
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
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
“ “.
Hasanuddin Sirait
Bab I Mikroprosesor, Memori dan Register
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
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!
11
Hasanuddin Sirait
BAB II
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.
Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack
[BX][DI] + pergeseran DS
[BP][SI] + pergeseran SS
[BP][DI] + pergeseran SS
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).
Hasanuddin Sirait
Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack
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.
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.
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.
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.
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
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
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.
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.
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
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:
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.
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.
MOV CX,5
label1:
PUTC ‘*’
ADD AX,100
CMP AH,0
LOOPZ label1
RET
END
Program ini akan melakukan pengulangan hingga dijumpai bilangan 7, pada posisi 3,
dengan kata lain hasilnya berupa 3 bintang yang ditampilkan.
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:
Potongan program ini akan mengerjakan instruksi MOVSB selama CX belum sama
dengan nol, dengan kata lain diulang sebanyak 500 kali.
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.
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.
ES[DI] = DS:[SI]
Jika DF=0 maka
SI=SI+1
DI=DI+1
Selain itu
SI=SI-1
DI=DI–1
Algoritmanya MOVSW:
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).
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).
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
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.
CMC
Instruksi CMC (Complement Carry Flag) digunakan untuk melakukan negasi
(menginversi) CF, jika CF sebelumnya 1, maka akan menjadi 0 demikian juga sebaliknya.
41
Hasanuddin Sirait
Bab III Instruksi 80X86
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!
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.
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
46
Hasanuddin Sirait
Bab IV Interupsi
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.
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.
AH = 07h
Register Output :
AL = Kode ASCII
AH = 08h
Register Output :
AL = Kode ASCII
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
51
Hasanuddin Sirait
Bab IV Interupsi
AH = 4Ch
AL = Kode return
Register Output :
Tidak ada
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
.MODEL SMALL
.CODE
ORG 100h
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
INT 20h
54
Hasanuddin Sirait
Bab V Procedure dan Makro
MOV AH,02h
MOV DL,Kar
INT 21h ; Cetak karakter
END TData
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
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 !!
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 !!!
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
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
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
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
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
END Tdata
Program 11
;=============================================================;
; PROGRAM : PTR.ASM ;
61
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan
.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
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
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
END Proses
Program 14
;/================================================\;
; PROGRAM : RID.ASM ;
; FUNGSI : MENGAKSES DATA MELALUI ALAMAT EFEKTIVE ;
;\================================================/;
.MODEL SMALL
.CODE
ORG 100h
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
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
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
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
Proses:
LEA BX,Absen ; BX Menunjuk Offset Absen
ADD BX,21 ; BX Menunjuk pada Record ke 4
XOR SI,SI ; SI=0
Program 19
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; Program: kal0.asm ;
; Fungsi : Mencetak String dengan Int 21 servis 9 ;
;=================================================;
.MODEL SMALL
.CODE
ORG 100h
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
Program 21
;/===============================================================\;
; Program : CMPJ.ASM ;
; Fungsi : Mendemokan perintah lompat yang mengikuti perintah CMP ;
;\===============================================================/;
.MODEL SMALL
.CODE
ORG 100h
Program 22
;/======================================================================\; ;
Program : JMPL.ASM ;
; Fungsi : Mencetak kalimat secara perkarakter sampai ditemui karakter '*'
;\======================================================================/;
.MODEL SMALL
.CODE
ORG 100h
Program 23
;/======================================================================\;
; Program : NSTACK.ASM ;
; Fungsi : Mencetak kalimat 2 kali dengan operasi yang mirip dengan stack;
;\======================================================================/;
.MODEL SMALL
.CODE
ORG 100h
Stacks DW ?
Proses:
LEA DX,Kal
MOV Stacks,DX
MOV AH,09
INT 21h
LEA DX,Ganti
INT 21h
MOV DX,Stacks
INT 21h
Program 24
;/=====================================================================\; ;
Program : STACK.ASM ;
; Fungsi : Mencetak kalimat 2 kali dengan operasi stack yang sebenarnya ;
;\=====================================================================/;
.MODEL SMALL
.CODE
ORG 100h
MOV AH,09
INT 21h
LEA DX,Ganti
INT 21h
POP DX
INT 21h
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
.MODEL SMALL
.CODE
ORG 100h
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
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
MOV AH,09
LEA DX,Kal1
INT 21h ; Cetak kalimat Kal1
INC BX ; BX := BX+1
JMP Ulang ; Lompat ke Ulang
Program 28
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; PROGRAM : PROC_KAR.ASM ;
; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ;
;=============================================;
.MODEL SMALL
.CODE
ORG 100h
END Proses
Program 29
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; PROGRAM : PROC_KA1.ASM ;
; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ;
;============================================;
.MODEL SMALL
.CODE
ORG 100h
71
Hasanuddin Sirait
Contoh-Contoh Program Untuk Latihan
INT 20h
MOV AH,02h
MOV DL,Kar
INT 21h ; Cetak karakter
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
.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
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
;/========================================================\;
; 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
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
END TData
Program 34
DELAY MACRO ; Macro untuk menunda program
LOCAL Ulang
PUSH CX
XOR CX,CX
Ulang:
LOOP Ulang
POP CX
ENDM
;/===============================================\;
; Program : SCROOL.ASM ;
; Fungsi : Menggulung layar ;
;\===============================================/;
.MODEL SMALL
.CODE
ORG 100h
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
MOV DH,Y
MOV DL,X
INT 10h
ENDM
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
LEA DX,String
INT 21h
ENDM
;/===================================================\;
; Program : SOROT.ASM ;
; Fungsi : Membuat menu sorot untuk digunakan program ;
;\===================================================/;
.MODEL SMALL
.CODE
ORG 100h
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
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
;/==================================================\;
; Program : PAGE.ASM ;
; Fungsi : Untuk mengaktifkan halaman layar tertentu ;
;\==================================================/;
.MODEL SMALL
.CODE
ORG 100h
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
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 :$'
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 ' '
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