Bahasa Assembly merupakan bahasa pemrograman yang tidak akan hilang oleh tren zaman, bahasa ini akan tetap dipakai dan tidak akan tergantikan oleh bahasa pemrograman lainnya. Bahasa assembly dapat digunakan dalam berbagai bidang seperti hacking, keamanan, analisis malware, optimasi kecepatan algoritma dan lainnya. Dengan mempelajari bahasa assembly dapat dipelajari cara kerja perangkat keras komputer sehingga mempelajari bahasa ini penting. Buku ini membahas bahasa pemrograman assembly dengan metode yang lebih memudahkan pembaca melalui penggunaan flowchart . Dengan menggunakan flowchart pada setiap programnya diharapkan dapat membuat pembaca lebih mudah mengerti cara kerja assembly dan algoritma programnya.
Developing systems application based on android as tool for determinant stunt...
Pemrograman Assembly Mikroprosesor 8086
1. See discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/338143747
PEMROGRAMAN BAHASA ASSEMBLY MIKROPROSESOR 8086
Book · December 2019
CITATIONS
0
READS
5,454
1 author:
Some of the authors of this publication are also working on these related projects:
Information Security View project
Assembly Programming View project
Indra Gunawan
Sekolah Tinggi Teknologi Ronggolawe Cepu
12 PUBLICATIONS 1 CITATION
SEE PROFILE
All content following this page was uploaded by Indra Gunawan on 29 January 2021.
The user has requested enhancement of the downloaded file.
4. Pemrograman Assembly Mikroprosesor 8086
2
Pemrograman Assembly Mikroprosesor 8086
Penulis: Indra Gunawan
Editor: Guepedia
Tata Letak: Guepedia
Sampul: Guepedia
Diterbitkan Oleh:
Guepedia
The First On-Publisher in Indonesia
E-mail: guepedia@gmail.com
Fb. Guepedia
Twitter. @guepedia
Website: www.guepedia.com
Hak Cipta dilindungi Undang-undang
All right reserved
5. Indra Gunawan, ST., M.Kom., CEH., CHFI
3
KATA PENGANTAR
Terima kasih yang sebesar besarnya terutama
kepada istri tercinta yang telah memberikan banyak
dorongan, semangat dan doa sehingga buku ini dapat
terselesaikan, dan tak lupa terima kasih kepada semua
pihak yang turut membantu secara langsung maupun
tidak langsung atas terbitnya buku ini. Semoga buku ini
dapat bermanfaat bagi pembaca semuanya.
Terima kasih
Batam
Penulis
(Indra Gunawan)
.
6. Pemrograman Assembly Mikroprosesor 8086
4
Daftar Isi
Bagian 1 Perkembangan Mikroprosesor................................. 8
Bagian 2 Komponen Dasar Mikroprosesor................................... 10
2.1 ARSITEKTUR MIKROPROSESOR 8086 ........................................ 10
2.1.1 BUS INTERFACE UNIT ............................................................ 11
2.1.2 EXECUTION UNIT................................................................... 13
Bagian 3 Interupsi........................................................................... 17
3.1 BIOS INTERRUPT ....................................................................... 18
3.2 DOS INTERRUPT ........................................................................ 20
Bagian 4 Memulai Assembly........................................................... 24
4.1 KODE EDITOR ........................................................................... 24
4.2 MENJALANKAN PROGRAM DOSBOX.......................................... 24
4.3 MENJALANKAN APLIKASI EMU8086......................................... 28
4.3 DEBUGGING DENGAN EMU8086............................................... 29
4.4 STRUKTUR KODE ASSEMBLY.............................................. 31
4.4.1 Sintak .Model ............................................................. 32
4.4.2 Sintak Org 100h......................................................... 32
4.4.3 Sintak .Code............................................................... 32
4.4.4 Sintak .Data ............................................................... 32
4.4.5 Sintak Label ............................................................... 32
Bagian 5 Transfer Data................................................................... 33
5.1 MOV ......................................................................................... 33
5.2 LOAD EFFECTIVE ADDRESS ...................................................... 34
5.3 LOAD SEGMENT REGISTER ....................................................... 35
5.4 EXCHANGE ............................................................................... 36
5.6 COMPARE ................................................................................. 38
5.7 TRANSLATE .............................................................................. 39
5.8 CONVERT.................................................................................. 41
Convert Byte To Word (Cbw) .................................................... 41
Convert Word To Double (Cwd)................................................ 41
Bagian 6 Cetak Karakter Dan Kalimat ......................................... 43
6.1 CETAK SATU KARAKTER (INT 21H/AH=02H) ........................... 43
6.2 CETAK BANYAK KARAKTER (INT 21H/AH=02H)...................... 44
6.3 CETAK KALIMAT DSENGAN PERULANGAN (INT 21H/AH=02H) 47
6.4 CETAK KALIMAT DENGAN VARIABEL (INT 21H/AH=09H) ....... 48
7. Indra Gunawan, ST., M.Kom., CEH., CHFI
5
6.5 CETAK KALIMAT BERWARNA (INT 10H/AH=09H).................... 51
6.6 CETAK KALIMAT BERWARNA (INT 10H/AH=1300H)................ 52
6.7 CETAK KALIMAT BERWARNA REAL TIME ................................ 55
6.7.1 Cetak 1 Karakter............................................................... 55
6.7.2 Cetak Banyak Karakter..................................................... 57
6.7.3 Cetak Animasi Kalimat Menggunakan Memori Layar ..... 58
6.8 CETAK DARI INPUT KEYBOARD ................................................. 61
6.8.1 Baca 1 Karakter Dengan Int 16h/Ah=0h.......................... 62
6.8.2 Baca 1 Karakter Dengan Int 21h/Ah=01h........................ 63
6.8.2 Baca Banyak Karakter...................................................... 64
Bagian 7 Operasi Logika................................................................. 66
7.1 OPERASI AND ..................................................................... 66
7.2 OPERASI OR....................................................................... 68
7.3 OPERASI XOR ..................................................................... 70
7.4 OPERASI NOT ..................................................................... 72
Bagian 8 Tipe Data .......................................................................... 74
Bagian 9 Mode Pengalamatan ........................................................ 76
9.1 REGISTER ADDRESSING............................................................. 77
9.2 IMMEDIATE ADDRESSING ......................................................... 78
9.3 DIRECT MEMORI ADDRESSING ................................................. 79
9.4 INDIRECT MEMORI ADDRESSING .............................................. 80
9.5 BASE RELATIVE ADDRESSING .................................................. 83
9.6 DIRECT INDEX ADDRESSING..................................................... 84
9.7 SCALE FACTOR ADDRESSING.................................................... 87
Bagian 10 Array............................................................................... 91
10.1 ARRAY SATU DIMENSI............................................................ 91
10.2 ARRAY MULTI DIMENSI.......................................................... 94
Bagian 11 Percabangan Dan Perulangan ...................................... 99
11.1 LABEL..................................................................................... 99
11.2 PERCABANGAN DENGAN LOMPATAN ................................... 101
11.2.1 Lompatan Tanpa Syarat................................................ 102
11.2.2 Lompatan Bersyarat ..................................................... 104
11.3 PERULANGAN ....................................................................... 108
11.3.1 Perulangan Tanpa Syarat............................................. 108
11.3.2 Perulangan Bersyarat................................................... 111
Bagian 12 Stack (Tumpukan)........................................................ 113
8. Pemrograman Assembly Mikroprosesor 8086
6
Bagian 13 Procedure Dan Macro .................................................. 116
13.1 PROSEDUR ........................................................................ 116
13.2 MACRO............................................................................. 121
Bagian 14 Operasi Aritmatika...................................................... 125
14.1 BILANGAN ............................................................................ 125
14.1.1 Mencetak Bilangan Desimal......................................... 126
14.1.2 Mencetak Bilangan Heksadesimal................................ 129
14.2 OPERASI PENAMBAHAN........................................................ 132
14.3 OPERASI PENGURANGAN ...................................................... 135
14.4 OPERASI PERKALIAN ............................................................ 137
14.5 OPERASI PEMBAGIAN ........................................................... 138
Bagian 15 Operasi File .................................................................. 141
Bagian 16 String............................................................................. 152
Bagian 17 Grafik Pada Assembly................................................. 157
17.1 GRAFIK TITIK PIXEL ............................................................. 157
17.2 GRAFIK GARIS LURUS .......................................................... 159
17.3 GRAFIK HURUF DENGAN GARIS LURUS ............................... 162
17.4 GRAFIK TABEL BINER........................................................... 165
17.5 GRAFIK TABEL BINER DENGAN KONTROL KEYBOARD ....... 171
Bagian 18 Interrupt Yang Sering Digunakan ............................. 177
18.1 INTERRUPT 21H (DOS SERVICE)............................................. 177
Int 21h / Ah=1h........................................................................ 177
Int 21h / Ah=2h........................................................................ 177
Int 21h / Ah=5h........................................................................ 177
Int 21h / Ah=6h........................................................................ 178
Int 21h / Ah=7h........................................................................ 179
Int 21h / Ah=9h........................................................................ 179
Int 21h / Ah=0ah...................................................................... 180
Int 21h / Ah=0bh...................................................................... 180
Int 21h/ Ah=0ch....................................................................... 180
Int 21h/ Ah= 19h...................................................................... 181
Int 21h/ Ah=2ah....................................................................... 181
Int 21h/ Ah= 39h...................................................................... 182
Int 21h/ Ah= 3ah...................................................................... 182
Int 21h/ Ah= 3bh...................................................................... 183
Int 21h/ Ah= 3ch...................................................................... 183
9. Indra Gunawan, ST., M.Kom., CEH., CHFI
7
Int 21h/ Ah=3dh....................................................................... 184
Int 21h/ Ah= 3fh ...................................................................... 184
Int 21h/ Ah= 3eh...................................................................... 185
Int 21h/ Ah= 40h...................................................................... 186
Int 21h/ Ah= 41h...................................................................... 187
Int 21h/ Ah= 42h...................................................................... 187
Int 21h/ Ah= 47h...................................................................... 188
Int 21h/ Ah=4ch....................................................................... 189
Int 21h/ Ah= 56h...................................................................... 189
18.2 INTERRUPT 10H (GRAPHIC MODE )........................................ 190
18.3 INTERRUPT 16H (KEYBOARD SERVICE)................................... 201
18.4 INTERRUPT 19H (REBOOT) .................................................... 202
18.5 INTERRUPT 1AH/AH=00H (KOMPUTER TIME).................... 202
18.6 INTERRUPT 20H (END PROGRAM)...................................... 203
Daftar Pustaka ............................................................................... 204
10. Pemrograman Assembly Mikroprosesor 8086
8
Bagian 1 Perkembangan Mikroprosesor
Mikroprosesor atau sering disingkat dengan
prosesor adalah produk dari pengembangan komputer
era sebelumnya yang masih bersifat mekanis dan
berukuran besar. Era mikroprosesor menandai
diawalinya komputer berukuran kecil (komputer),
mikroprosesor – mikroprosesor tersebut diantaranya
dapat dilihat pada Tabel 1 berikut ini :
Tabel 1 Perkembangan mikroprosesor (Brey, 2009).
No Seri Penjelasan
1 Intel 4004 Rilis tahun 1946
4 bit
50.000 instruksi per detik
Dikembangkan selanjutnya
menjadi seri Intel 4040
dengan penambahan
kecepatan.
2 Intel 8008 Rilis tahun 1971
8 bit
16K byte memori
3 Intel 8080 Rilis tahun 1973
8 bit
64K byte memori
500,000 instruksi per detik
4 Intel 8085 Rilis tahun 1977
8 bit
769,230 instruksi per detik
5 Intel 8086 Mikroprosesor modern
pertama.
16 bit
2,5 juta instruksi per detik
11. Indra Gunawan, ST., M.Kom., CEH., CHFI
9
No Seri Penjelasan
Mampu mengalamatkan
1024K byte memori
Dikembangkan selanjutnya
menjadi seri Intel 8080
dan 80286.
6 Intel 80386 Rilis tahun 1986
32 bit
4 Gigabyte memori
7 Intel 80486 Rilis tahun 1989
32 bit
Kecepatan 50Mhz
8 Intel
80586/Pentium
Rilis tahun 1993
Multi Core
32 bit
4 Gigabyte memori
Kecepatan lebih dari 3GHz
Dikembangkan menjadi
banyak seri yaitu Pentium
II, Pentium III, Pentium IV,
Core2
9 Itanium Rilis tahun 2002 gabungan
antara perusahaan Intel
dan Hewlett-Packard
Multi Core
64 bit
1 Tbyte Memori
Dikembangkan menjadi
banyak seri Itanium 2,
Itanium 9300, 9500, 9700
12. Pemrograman Assembly Mikroprosesor 8086
10
Bagian 2 Komponen Dasar Mikroprosesor
Mikroprosesor 8086 merupakan mikroprosesor
modern pertama yang menjadi dasar arsitektur
mikroprosesor selanjutnya, oleh karena itu seri 8086
inilah yang akan dipelajari di jurusan komputer dan
turunannya. Gambar 1 menunjukkan bentuk fisik
mikroprosesor 8086.
Gambar 1 Mikroprosesor 8086 (General Software, 1998)
2.1 Arsitektur Mikroprosesor 8086
Arsitektur internal mikroprosesor 8086 terbagi
menjadi 2 unit yaitu BIU(Bus Interface Unit) dan
EU(Execution Unit).
13. Indra Gunawan, ST., M.Kom., CEH., CHFI
11
Gambar 2 Skema Diagram Mikroprosesor 8086 (S. P. Das,
2019)
2.1.1 Bus Interface Unit
Bus Interface Unit (BIU) secara umum mempunyai
tugas :
Mengirim tugas ke bagian lain .
Mengambil instruksi dari memori.
Membaca/menulis perintah dari dan ke memori dan port.
Dapat dikatakan tugas BIU adalah pengalamatan dan transfer
data.
Komponen-komponen BIU adalah sebagai berikut :
1. Bus
Adalah jalur data tempat mengalirnya instruksi dan data antar
komponen.
2. Queue
Pada dasarnya queue adalah kumpulan register yang
berukuran 6 byte (1 byte=8bit) yang bertugas sebagai pintu antrian
14. Pemrograman Assembly Mikroprosesor 8086
12
perintah sebelum masuk ke ALU. Queue akan terisi kembali dengan
perintah dari BIU ketika isinya telah berkurang sebanyak 2byte/16bit
karena masuk ke ALU.
Mengapa harus ada queue ? Pada dasarnya memori
lebih lambat daripada mikroprosesor sehingga untuk
mempercepat proses pengiriman data antara memori dan
mikroprosesor/mengurangi gap antar keduanya maka
dibuatlah queue (media penyimpanan kecil) yang terletak
di dalam mikroprosesor yg tugasnya sebagai media
simpan sementara.
3. Segment Register
Register sendiri adalah komponen penting
mikroprosesor yang berupa memori kecil sebesar 16bit
tiap-tiap registernya. Secara umum dapat dikatakan
tugas register adalah menyimpan nilai yang diambil dari
memori yang akan dieksekusi oleh ALU.
Segment Register adalah salah satu dari register yang
fungsinya menyimpan alamat memori fisik berupa
segment address, terdapat 4 segment register yaitu :
Code segment (CS) register
Stack segment (SS) register
Extra segment (ES) register
Data segment (DS) register
Keempat segment register tersebut mewakili alamat
segment memori yang terdiri dari (Code segment, data
segment, extra segment dan stack segment) yang dibagi-
bagi lagi menjadi 16 logical segment yang tiap
segmentnya berukuran 64 KByte.
4. Instruction Pointer
15. Indra Gunawan, ST., M.Kom., CEH., CHFI
13
Adalah register 16 bit yang fungsinya menampung
offset address memori fisik. Gabungan antara offset
address dan segment address dari segment register akan
menunjukkan posisi alamat fisik dalam memori.
Contoh perhitungannya sebagai berikut :
segment address - 1005H
Offset address - 5555H
segment address - 1005H - 0001 0000 0000 0101
Digeser 4-bit - 0001 0000 0000 0101 0000
+
Offset address - 0101 0101 0101 0101
Physical address - 0001 0101 0101 1010 0101
1 5 5 A 5
Maka alamat fisik memorinya adalah 155A5H
2.1.2 Execution Unit
Execution Unit (EU) secara umum mempunyai tugas :
Menerjemahkan perintah dari BIU
Mengeksekusi perintah dari BIU
Memberitahu BIU dari mana mengambil instruksi atau data.
Komponen-komponen EU adalah sebagai berikut :
1. Arithmetic Logic Unit
ALU (Arithmetic Logic Unit) adalah komponen inti
dari mikroprosesor atau disebut otaknya komputer.
Tugas ALU adalah mengeksekusi perintah yang
berhubungan dengan aritmatika dan logika yaitu
meliputi operasi-operasi : +,-,×,/ OR, AND, NOT
2. Flags
Flags atau disebut flag register adalah salah satu
register yang berfungsi menyimpan penandaan hasil
operasi yang dikerjakan ALU, misalnya adalah
menyimpan penandaan bahwa hasil operasi yang saat
16. Pemrograman Assembly Mikroprosesor 8086
14
ini dikerjakan ALU adalah genap, ganjil, nol dan lain-
lain.
Flag register terdiri dari 9 bit yaitu :
Carry Flag : Berfungsi untuk menandai hasil operasi yang
melebihi lebar general purpose register. Misalnya digunakan
register 8 bit AL dan BH, dijumlahkan ternyata hasilnya 9 bit,
maka operasi ini ditandai dengan 1 di carry Flag, sedangkan 1 bit
sisanya disimpan di General purpose Register. Flag ini untuk
menandai bilangan unsigned (tidak bertanda/bilangan positif
saja).
Overflow Flag : sama seperti carry flag, tetapi untuk bilangan
signed (bertanda/bilangan positif negatif).
Auxiliary Flag : Bernilai 1 jika operasi ALU pada 4 bit rendah
melakukan operasi meminjam bit sebelah kirinya, dan bernilai 0
jika tidak.
Zero Flag : Bernilai 1 jika operasi ALU hasilnya nol, bernilai 0 jika
operasi tidak nol.
Parity Flag: Bernilai 1 jika operasi ALU hasilnya genap, dan
bernilai 0 jika ganjil.
Direction Flag : Bernilai 1, maka operasi ALU berjalan mundur,
bernilai 0 berjalan maju.
Sign Flag : Bernilai 1 jika operasi ALU negatif, bernilai 0 jika
positif.
Trap Flag : Untuk menandai proses debugging, bernilai 1 maka
interrupt dilakukan dari device external.
Interrupt flag : Untuk menandai pengaktifan interrupt, bernilai 1
jika aktif, bernilai 0 jika tidak aktif.
17. Indra Gunawan, ST., M.Kom., CEH., CHFI
15
3. Operand
Operand adalah data yang dioperasikan, operand bisa
berupa nilai, register, variabel.
Contoh : Operasi ADD AL, 5h
Pada operasi diatas, ADD adalah opcode, AL dan 5h
adalah operand.
4. Instruction Decoder and Control
Adalah komponen yang bertugas mengontrol ALU
lintas antar komponen ALU, BIU dan memori sekaligus
mendecode perintah dari BIU untuk diberikan ke ALU.
5. General purpose Register
Adalah register yang dapat diisi nilai untuk dioperasikan.
General purpose register dibagi menjadi 4 register 16 bit,
yang terbagi-bagi lagi menjadi 8 bit high dan 8 bit low.
Jika pada program ditulis mode 38086 dapat digunakan
register 32bit. Register-register tersebut yaitu :
32-bit register (EAX, EBX, ECX, EDX, ESI, EDI, ESP, dan EBP).
16- register (AX, BX, CX, DX, SI, DI, SP, dan BP).
8-bit register (AH, BH, CH, DH, AL, BL, CL, dan DL)
Penggunaan register ini berbeda-beda caranya
tergantung operasi interrupt dan service yang digunakan
(Intel, 1998).
6. Index Register dan Pointer Register
Adalah register terdiri dari 4 register yaitu :
Stack Pointer : Register 16 bit yang berisi alamat offset stack
pada stack segment di memori.
Base Pointer : Register 16 bit yang berisi alamat offset data pada
stack segment di memori.
Source Index : Register 16 bit yang berisi alamat sumber pada
operasi string.
19. Indra Gunawan, ST., M.Kom., CEH., CHFI
17
Bagian 3 Interupsi
Interupsi atau interrupt adalah sinyal yang
digunakan sebagai metode untuk menghentikan
sementara pekerjaan yang sedang dikerjakan
mikroprosesor untuk melakukan pekerjaan yang sedang
diinterupsikan. Prinsipnya mirip seperti sekelompok
orang yang sedang rapat membahas suatu hal kemudian
ada seseorang yang melakukan interupsi, maka
pembicaraan rapat terhenti dan beralih sementara
menuju orang yang sedang menginterupsi, setelah
selesai dengan orang tersebut maka pembahasan beralih
kembali ke pembicaraan rapat semula.
Interrupt terbagi menjadi dua yaitu hardware
interrupt dan software interrupt.
1. Hardware interrupt adalah jenis interrupt yang berasal dari
perangkat keras. Ketika suatu device mengirim sinyal interrupt ke
pin NMI dan INTR pada mikroprosesor maka mikroprosesor akan
menghentikan pekerjaannya sementara dan akan mengeksekusi
perintah dari device yang diinterupsikan.
2. Software interrupt adalah jenis interrupt yang berasal dari
perangkat lunak. Terdapat 256 software interrupt yang memiliki
kode 0 sampai 255 yang setiap kodenya khusus untuk melakukan
suatu pekerjaan tertentu. DOS interrupt dan BIOS interrupt
termasuk dalam interrupt jenis ini, selanjutnya buku ini akan
lebih banyak membahas software interrupt karena erat
kaitannya dengan bahasa assembly.
20. Pemrograman Assembly Mikroprosesor 8086
18
3.1 BIOS Interrupt
Adalah fasilitas interrupt untuk menghubungkan
antara sistem operasi, program aplikasi, DOS dengan
BIOS. Umumnya interrupt ini dipakai ketika suatu
perangkat lunak membutuhkan hubungan dengan
perangkat keras. Tabel 1 adalah daftar BIOS interrupt.
Tabel 2 Daftar BIOS interrupt (General Software, 1998)
Interrupt Type Function or Service
00h CPU Divide by zero trap
01h CPU Single-step trap
02h CPU NMI interrupt
03h CPU Breakpoint trap (INT 3)
04h CPU Arithmetic overflow trap
05h CPU Array bounds exception
06h CPU Invalid Opcode Trap
07h CPU Device Not Available Trap
08h IRQ0 18.2 Hz Timer Tick
09h IRQ1 Keyboard
0ah IRQ2 Cascaded toPIC 2
Interrupt Type Function or Service
0bh IRQ3 COM2 Serial Port
0ch IRQ4 COM1 Serial Port
0dh IRQ5 LPT2 Parallel Port
0eh IRQ6 Floppy Disk Controller
0fh IRQ7 LPT1 Parallel Port
10h Service Video Services
11h Service Equipment List Service
12h Service Low Memori Size Service
21. Indra Gunawan, ST., M.Kom., CEH., CHFI
19
13h Service Floppy/IDE/ROM/Remote
Disk Services
14h Service Serial Port Services
15h Service General Services, Up-Calls
16h Service Keyboard Services
17h Service Parallel Port Services
18h Up-
Call
Boot Fault Up-Call
19h Up-
Call
Bootstrap Up-Call
1ah Service Date/Time Services
1bh Up-
Call
Control-Break Up-Call
1ch Up-
Call
18.2 Hz Application Timer Up-
Call
1dh Table Pointer to Video Control Param
Table
1eh Table Pointer to Diskette Parameter
Table
1fh Table Pointer to Video Graphics
Table
Interrupt Type Function or Service
20h-3fh DOS -- reserved by DOS --
40h Redire
ctor
Floppy disk services redirected
by IDE
41h Table Fixed Disk Parameter Table
(Drive 80h)
42h Extens
ion
EGA Default Video Driver
43h Extens
ion
Video Graphics Characters
22. Pemrograman Assembly Mikroprosesor 8086
20
44h-45h N/A -- not used --
46h Table Fixed Disk Parameter Table
(Drive 81h)
47h-49h N/A -- open --
4ah Up-
Call
User Alarm
4bh-6fh N/A -- open --
70h IRQ8 Real-Time Clock Interrupt (1
Khz)
71h IRQ9 -- open --
72h IRQ10 -- open --
73h IRQ11 -- open --
74h IRQ12 PS/2 Mouse
75h IRQ13 Math Coprocessor
76h IRQ14 IDE Drive Controller
77h IRQ15 APM Suspend Request
78h-ffh N/A -- open --
3.2 DOS Interrupt
Adalah interrupt yang input dan outputnya
memakai aplikasi DOS. DOS interrupt berasal dari
perangkat lunak yang membutuhkan output pada DOS.
Sebagian DOS interrupt dapat dilihat pada table 2
dibawah ini. Contoh kode program penggunaan masing-
masing interrupt pada Tabel 2 dapat dilihat pada Bagian
15.
23. Indra Gunawan, ST., M.Kom., CEH., CHFI
21
H Description AH Description
1
Read
character
from STDIN
2
Write
character to
STDOUT
5
Write
character to
printer
6
Console
Input/Output
7
Direct char
read (STDIN),
no echo
8
Char read
from STDIN,
no echo
9
Write string to
STDOUT
0A Buffered input
H Description AH Description
0B
Get STDIN
status
0C
Flush buffer
for STDIN
0D Disk reset 0E
Select default
drive
Tabel 3 DOS interrupt
24. Pemrograman Assembly Mikroprosesor 8086
22
19
Get current
default drive
25
Set interrupt
vector
2A
Get system
date
2B
Set system
date
2C
Get system
time
2D
Set system
time
2E Set verify flag 30
Get DOS
version
35
Get Interrupt
vector
H Description AH Description
36
Get free disk
space
39
Create
subdirectory
3A
Remove
subdirectory
3B
Set working
directory
3C Create file 3D Open file
26. Pemrograman Assembly Mikroprosesor 8086
24
Bagian 4 Memulai Assembly
4.1 Kode Editor
Bahasa assembly dapat diketik pada beragam
aplikasi text editor seperti notepad, wordpad, notepad++,
sublime maupun langsung pada aplikasi emulator 8086
seperti DOSBOX atau emu8086. Buku ini akan
menggunakan emu8086 sebagai editornya dengan
pertimbangan kepraktisan.
Gambar 3 Editor Emu8086.
4.2 Menjalankan Program DOSBOX
Terdapat dua cara untuk mengkompilasi dan
menjalankan program assembly, cara pertama dengan
cara manual menggunakan DOSBOX, cara kedua
otomatis menggunakan emu8086.
Langkah-langkah menggunakan DOSBOX emulator
1. Instal DOSBOX
2. Ekstrak 8086.zip ke c:/8086
3. Klik DOSBOX option, lihat gambar 4
27. Indra Gunawan, ST., M.Kom., CEH., CHFI
25
Gambar 4 DOSBOX option
4. Ketik mount c: c:/8086 pada file config DOSBOX, kemudian
simpan, lihat gambar 5.
Gambar 5 Konfigurasi DOSBOX Option.
5. Jalankan aplikasi DOSBOX
28. Pemrograman Assembly Mikroprosesor 8086
26
6. Ketikkan
c:
7. kemudian enter, lalu ketik
edit
Kemudian enter, akan muncul editor untuk mengetik
kode assembly, ketikkan kode program assembly anda
seperti pada gambar 6
Gambar 6 DOSBOX editor.
8. Untuk menyimpan, ketika alt+f, kemudian pilih save, beri nama
pertama.asm lalu tekan enter, tekan lagi alt+f, pilih exit.
9. Untuk berpindah antar jendela windows dan DOSBOX gunakan
alt+tab.
10. Untuk menjalankan program, ketikkan perintah-perintah seperti
dibawah ini
Tasm pertama.asm
Tlink pertama.obj
29. Indra Gunawan, ST., M.Kom., CEH., CHFI
27
Pertama.exe
Gambar 7 Melakukan kompilasi kode menjadi exe
11. Untuk melakukan debug memori ketikkan
Debug pertama.exe
d
Gambar 8 Debugging dengan memori
12. Untuk melakukan debug register ketikkan
30. Pemrograman Assembly Mikroprosesor 8086
28
t
secara berulang-ulang sampai baris program habis.
Gambar 9 Debugging dengan Register
4.3 Menjalankan Aplikasi Emu8086
Buku ini untuk selanjutnya akan selalu
menggunakan aplikasi emu8086 sebagai editornya.
Untuk memulai aplikasi emu8086 lakukan langkah-
langkah sebagai berikut :
1. Untuk memulai aplikasi, klik new.
2. Ketikkan kode program pada area putih. Perlu diperhatikan
bahwa Emu8086 tidak membedakan huruf besar kecil.
3. Untuk menjalankan program klik emulate kemudian klik run.
31. Indra Gunawan, ST., M.Kom., CEH., CHFI
29
Gambar 10 Memulai aplikasi Emu8086
4.3 Debugging dengan Emu8086
Salah satu kelebihan aplikasi Emu8086 dibanding
DOSBOX adalah ketika melakukan debugging, kita dapat
melihat semua bagian secara paralel baik itu debug
memori, debug register, debug flag, debug variable,
maupun debug stack. Langkah-langkah untuk
melakukan debugging adalah sebagai berikut :
1. Untuk melakukan debug dengan melihat isi register klik emulate,
klik menu debug kemudian klik menu single step berkali-kali
sampai kode program sampai akhir, seperti gambar 11.
1
2
32. Pemrograman Assembly Mikroprosesor 8086
30
Gambar 11 Debug register dengan Emu8086.
2. Untuk melakukan debug dengan melihat isi memori klik emulate,
klik menu aux -> memori, ganti kolom segment dan offset
(0700:0109) sesuai keinginan kemudian pilih update seperti
gambar 12.
1
2
3
33. Indra Gunawan, ST., M.Kom., CEH., CHFI
31
Gambar 12 Debug memori dengan Emu8086
4.4Struktur Kode Assembly
Struktur kode assembly yang dibahas dibawah ini
adalah struktur kode inti untuk menjalankan assembly,
masih banyak sintak-sintak assembly yang bisa anda
pelajari sendiri untuk menjadi lebih expert.
.model small
Org 100h
.code
label1:
; Tulis kode program disini
End label1
.data
; Tulis data disini
1
2
34. Pemrograman Assembly Mikroprosesor 8086
32
4.4.1 Sintak .MODEL
Sintak ini berhubungan dengan penggunaan
memori yang akan digunakan oleh assembly (S’to, 2001).
Terdapat beberapa tipe .model yang dapat digunakan
yaitu :
.MODEL TINY : Hanya dapat digunakan 1 segment
(program com)
.MODEL SMALL : Kode dan Program < 64kb
.MODEL MEDIUM : Program < 64kb, kode > 64kb
.MODEL COMPACT : Program > 64kb, kode < 64kb
.MODEL LARGE : Program dan kode > 64kb
.MODEL HUGE : Program, kode dan array > 64kb
4.4.2 Sintak ORG 100H
Adalah perintah yang digunakan pada assembly
untuk memesan tempat pada memori sejumlah 100H
(256byte).
4.4.3 Sintak .CODE
Adalah perintah yang digunakan untuk menandai
bahwa kode-kode perintah dibawahnya adalah kode
program (bukan data).
4.4.4 Sintak .DATA
Adalah perintah yang digunakan untuk menandai
bahwa kode-kode perintah dibawahnya adalah data
(bukan kode program).
4.4.5 Sintak Label
Adalah perintah yang digunakan untuk
mengelompokkan kode-kode program sehingga dapat
digunakan untuk lompatan, perulangan dan lainnya.
Dalam satu program dapat digunakan banyak label
dengan nama bebas.
35. Indra Gunawan, ST., M.Kom., CEH., CHFI
33
Bagian 5 Transfer Data
Bagian ini akan membahas perintah-perintah
assembly yang berkaitan dengan bagaimana
mikroprosesor 8086 melakukan transfer data. Transfer
data tersebut dapat berupa transfer antar register atau
register ke memori. Metode transfer data tersebut atau
biasa disebut dengan mode pengalamatan akan dibahas
di Bagian yang lain. Perintah-perintah yang akan
dibahas pada Bagian ini yaitu :
MOV
LOAD EFFECTIVE ADDRESS
LOAD SEGMENT REGISTER
EXCHANGE
BYTE SWAP
COMPARE
TRANSLATE
CONVERT
(Cavanagh, 2013).
5.1 MOV
MOV adalah perintah untuk menyalin data dari
register ke register, register ke memori dan memori ke
register. Format perintah MOV adalah :
MOV Tujuan, Sumber
Tujuan dan sumber dapat berupa register atau
alamat memori. Cara berbagai macam pengalamatan
dengan perintah MOV dapat dilihat pada Bagian mode
pengalamatan. Contoh penggunaan perintah MOV dapat
dilihat pada program #1 dibawah ini :
36. Pemrograman Assembly Mikroprosesor 8086
34
; Program #1
.MODEL SMALL
ORG 100h
.CODE
MOV AX,0107H
MOV [0108],03H
MOV AL,A
MOV AX,OFFSET A
MOV AL,[0118]
MOV BX,0106H
MOV DL, BYTE PTR [BX]
.DATA
A DB 'Coba'
Penjelasan :
MOV AX,0107H: Salin 0107H ke register AX
MOV [0108],03H : Salin 03H ke alamat 0108H
MOV AL,A : Salin karakter pertama pada varibel A ke register AL.
MOV AX,OFFSET A : Salin alamat offset A ke register AX
MOV AL,[0118] : Salin isi alamat 0118H ke register AL
MOV BX,0106H : Salin 0106H ke register BX
MOV DL, BYTE PTR [BX] : Salin isi alamat offset pada register BX
sebanyak 1 byte ke register DL
5.2 Load Effective Address
Load effective address adalah perintah untuk
menyalin alamat offset ke suatu target operand, target
operand dapat berupa register atau alamat memori.
Format perintah Load effective address adalah :
LEA Tujuan, Sumber
37. Indra Gunawan, ST., M.Kom., CEH., CHFI
35
Perintah LEA dapat dilakukan juga dengan MOV
dengan tujuan dan hasil yang sama dengan format
berikut ini.
LEA Tujuan, Sumber
MOV Tujuan, Offset Sumber
Contoh penggunaan perintah LEA dapat dilihat
pada program #2 dibawah ini :
; Program #2
.MODEL SMALL
ORG 100h
.CODE
LEA AX, A
MOV AX, OFFSET A
.DATA
A DB 'Coba'
Penjelasan : Dimisalkan alamat offset variabel A =
0108H, maka perintah LEA dan MOV diatas
menghasilkan AX=0108H.
5.3 Load Segment Register
Load segment register adalah perintah untuk
menyalin isi segment register ke general purpose register.
Variasi perintah ini ada dua macam yaitu LDS (Load
data segment) dan LES (Load extra segment).
LDS Tujuan, Sumber
LES Tujuan, Sumber
MOV Tujuan, Offset Sumber
Contoh penggunaan perintah LDS dan LES dapat
dilihat pada program #3 dibawah ini :
; Program #3
.MODEL SMALL
.CODE
LDS AX, A
LES DX, A
.DATA
A DB 'Coba'
38. Pemrograman Assembly Mikroprosesor 8086
36
5.4 Exchange
Exchange adalah perintah untuk menukar data
antar operand, operandnya dapat berupa register
maupun memori. Format perintah exchange adalah :
XCHG Tujuan, Sumber
XCHG register/memori, register/memori
Contoh penggunaan perintah exchange dapat
dilihat pada program #4 dibawah ini :
; Program #4
.MODEL SMALL
ORG 100H
.CODE
MOV BX, OFFSET X
MOV AX,05H
MOV DX,08H
XCHG AX,DX
XCHG [0110H], AX
.DATA
X DB 'Coba'
39. Indra Gunawan, ST., M.Kom., CEH., CHFI
37
Gambar 13 Diagram alir program #4 (exchange).
Penjelasan :
Offset variabel A adalah 0110H, AX=05H, BX=08H.
Perintah XCHG AX, DX menghasilkan perpindahan data register
AX dengan register DX, AX=08H, BX=05H.
Perintah XCHG [0110H], AX menghasilkan perpindahan data isi
alamat offset [0110H] dengan register AX, maka AX=6F43(String
40. Pemrograman Assembly Mikroprosesor 8086
38
‘Co’), alamat [0110H] =(08 00 62 61) H, jika dikonversi menjadi
string adalah ‘..ba’.
5.6 Compare
Compare adalah perintah assembly untuk
membandingkan dua operand. Perintah ini tidak akan
mengubah kedua operand tersebut, yang berubah nilai
dari perintah compare adalah flag register. Flag register
yang berubah tergantung perintah yang mengikuti
compare. Format perintah compare adalah sebagai
berikut :
CMP Sumber1, Sumber2
Sumber1 dan sumber2 dapat berupa register, memori
maupun nilai.
CMP register/memori/nilai,
register/memori/nilai
Contoh penggunaan perintah compare dapat
dilihat pada program #5 dibawah ini :
; Program #5
.MODEL SMALL
ORG 100H
.CODE
MOV AX,05H
MOV DX,08H
CMP AX,DX
CMP AX,06H
CMP [0112H], 07H
.DATA
X db 'Coba'
41. Indra Gunawan, ST., M.Kom., CEH., CHFI
39
Gambar 14 Diagram alir program #5 (compare).
5.7 Translate
Translate adalah perintah pada assembly untuk
menyalin isi data pada alamat data segment ke register
AL. Untuk melakukan uji coba perintah ini, isilah
terlebih dahulu register BX, lalu isilah alamat DS:[BX]
dengan nilai tertentu, akhirnya lakukan perintah XLATB.
Dengan cara ini dapat ditelusuri dengan mudah bahwa
nilai 77H disalin dari alamat memori 0119H ke register
AL.
Contoh penggunaan perintah XLATB dapat dilihat
pada program #6 dibawah ini :
; Program #6
.MODEL SMALL
ORG 100H
42. Pemrograman Assembly Mikroprosesor 8086
40
.CODE
MOV BX,0119H
MOV DS:[BX],77H
XLATB
Gambar 15 Diagram alir program #6 (translate).
Penjelasan :
Isi alamat offset [0119H]=9090H
Perintah BX, 0119H menghasilkan nilai BX=0119H.
43. Indra Gunawan, ST., M.Kom., CEH., CHFI
41
Perintah DS:[BX],77H menghasilkan alamat offset
[0119H]=7790H
Perintah XLATB menghasilkan register AL=77H
5.8 Convert
Convert Byte to Word (CBW)
CBW adalah perintah pada assembly yang
berfungsi untuk mengkonversi nilai register AL 8 bit
menjadi nilai 16 bit. Konversi tersebut berjalan dengan
cara menyalin keseluruhan nilai pada register AL ke
register AH sehingga nilai AL dan AH menjadi sama.
Convert Word to Double (CWD)
CWD adalah perintah pada assembly yang
berfungsi untuk mengkonversi nilai register AX 16 bit
menjadi nilai 32 bit. Konversi tersebut berjalan dengan
cara menyalin bit ke 15 register AX ke register DX, hasil
akhir bilangan 32bit adalah pasangan register DX:AX.
Contoh penggunaan perintah convert dapat
dilihat pada program #7 dibawah ini :
; Program #7
.MODEL SMALL
ORG 100H
.CODE
MOV AL,0FFH
CBW
MOV AX,-90D
MOV DX,77H
CWD
MOV AX,90D
CWD
44. Pemrograman Assembly Mikroprosesor 8086
42
MOV AL,0FFH
=
Register AL=0FFH
CBW
Register
AL=FFH
AH=FFH
AX=FFFFH
MOV AX,-90D
=
Register AX=FFA6H
MOV DX,77H
=
Register DX=77H
CWD
Register
AX=FFA6H
DX=0000H
MOV AX,90H
=
Register AX=005AH
CWD
Register
AX=005AH
DX=FFFFH
SELESAI
MULAI
Gambar 16 Diagram alir program #7 (CWD).
Penjelasan :
Perintah CWB menyalain nilai AL ke AH, sehingga nilai AX=AH:AL.
Perintah CWD, jika AX bilangan negatif maka nilai DX=0000H, jika
AX positif maka nilai DX=FFFFH.
45. Indra Gunawan, ST., M.Kom., CEH., CHFI
43
Bagian 6 Cetak Karakter Dan Kalimat
Bagian ini akan membahas tentang penggunakan
tiga interrupt yaitu INT 21H service 02H, INT 21H service
09H dan INT 10H service 1300H. Ketiga interrupt
tersebut beserta service nya dapat digunakan untuk
mencetak karakter ke layar.
Karakter yang dicetak dapat berasal dari string
yang didalam program maupun dari input keyboard,
tetapi dalam Bagian ini hanya membahas mencetak
karakter dengan string berada didalam program.
6.1 Cetak satu karakter (INT 21H/AH=02H)
Mencetak satu karakter ke layar tanpa warna
dapat digunakan INT 21h service 02H. Untuk
menggunakan interrupt ini caranya sangatlah mudah.
Pertama isi register AH dengan nilai 2 heksadesimal,
kedua isi register DL dengan string yang akan dicetak,
ketiga lakukan INT 21H. Perlu diperhatikan bahwa
register DL besarnya 8 bit maka hanya dapat
menampung satu karakter saja. Kode program
selengkapnya dapat dilihat pada program #8 dibawah ini.
; Program #8
.MODEL SMALL
org 100h
.CODE
mov ah, 02h
mov dl, 'A'
int 21h
int 20h
46. Pemrograman Assembly Mikroprosesor 8086
44
Gambar 17 Diagram alir program #8 (cetak 1 karakter).
Penjelasan : Tercetak string ‘A’.
AH = nilai service
DL = string yang akan dicetak
6.2 Cetak banyak karakter (INT 21H/AH=02H)
Mencetak banyak karakter ke layar tanpa warna
dapat digunakan INT 21h service 02H dengan cara
diulang-ulang perintah interruptnya sebanyak karakter
yang diinginkan, tetapi perlu diingat bahwa isi register
DL harus diganti-ganti sesuai string yang akan dicetak.
Kode program selengkapnya dapat dilihat pada program
#9 dibawah ini.
; Program #9
.MODEL SMALL
org 100h
.CODE
47. Indra Gunawan, ST., M.Kom., CEH., CHFI
45
mov ah,02h
mov dl, 'A'
int 21h
mov dl,10
int 21h
mov dl,13
int 21h
mov dl, 'B'
int 21h
int 20h
48. Pemrograman Assembly Mikroprosesor 8086
46
Gambar 18 Diagram alir program #9(Cetak banyak
karakter).
Penjelasan : Akan tercetak huruf A kemudian B
dibawahnya.
49. Indra Gunawan, ST., M.Kom., CEH., CHFI
47
6.3 Cetak Kalimat dsengan Perulangan (INT
21H/AH=02H)
Untuk mencetak kalimat/banyak karakter dengan
cara yang lebih elegan dan efisien adalah dengan
menggunakan perulangan. Cara menggunakannya
adalah letakkan perintah interrupt dalam suatu label,
kemudian buat perulangan dengan loop terhadap label
tersebut. Perlu anda perhatikan bahwa banyaknya
perulangan sesuai nilai register CX. Kode program
selengkapnya dapat dilihat pada program #10 dibawah
ini.
; Program #10
.MODEL SMALL
org 100h
.CODE
MOV AH,02h
MOV DL,'A'
MOV CX,03h
Cetak:
INT 21h
INC DL
LOOP Cetak
INT 20h
50. Pemrograman Assembly Mikroprosesor 8086
48
INT 21H
Cetak ‘A’
LOOP
Loop 3x
Register AH=2 Register DL=’A’ Register CX=3H
MULAI
SELESAI
Gambar 19 Diagram alir Program #10 (Cetak banyak
karakter + loop).
Penjelasan : Akan tercetak ‘ABC’.
6.4 Cetak Kalimat dengan Variabel (INT 21H/AH=09H)
Mencetak kalimat atau banyak karakter dengan INT
21H service 09H memiliki pendekatan alur yang berbeda
dengan program sebelumnya. Untuk menggunakan
service ini, pertama, isi register AH dengan 09H, kedua,
isi register DX dengan alamat offset variabel string
dengan perintah LEA atau MOV. Ketiga, buat
variabel/data terlebih dahulu. Variabel ini yang akan
menampung string yang akan dicetak. Jangan lupa
gunakan tipe data DB (1byte) pada variabel tersebut.
Kode program selengkapnya dapat dilihat pada program
#11 dibawah ini.
51. Indra Gunawan, ST., M.Kom., CEH., CHFI
49
; Program #11
.MODEL SMALL
org 100h
.CODE
MOV AH,09h
MOV DX,offset kal0
INT 21h
LEA DX,kal0
INT 21h
LEA DX,kal0+2
INT 21h
LEA DX,kal1
INT 21h
INT 20h
.DATA
kal0 DB 'Coba',13,10,'$'
kal1 DB 'SETELAH $ TIDAK BISA DICETAK '
52. Pemrograman Assembly Mikroprosesor 8086
50
Gambar 20 Diagram alir program #11(Cetak kalimat isi
variabel).
Penjelasan : Akan tercetak ‘Coba’, ‘ba’ dan ‘Setelah’.
53. Indra Gunawan, ST., M.Kom., CEH., CHFI
51
6.5 Cetak Kalimat Berwarna (INT 10H/AH=09H)
Untuk mencetak kalimat berwarna dapat digunakan
INT 10H service 09H, akan tetapi interrupt ini memiliki
kekurangan dibanding INT 10H service 1300H yaitu
tidak ada fitur tebal tipis huruf, tidak ada fitur tulisan
berkedip, dan warna yang dimiliki terbatas serta tidak
dapat memposisikan tulisan secara bebas pada layar.
Cara menggunakan interrupt ini adalah :
AH = nilai service, 09H
BL = atribut warna, 1 digit pertama warna tulisan, 1 digit sebelah
kanan warna latar.
BH = halaman
CX = banyaknya karaktar yang akan dicetak
Kode program selengkapnya dapat dilihat pada
program #12 dibawah ini.
; Program #12
.MODEL SMALL
ORG 100h
.CODE
MOV AH,09h
MOV AL,'A'
MOV BH,00h
MOV BL,95h
MOV CX,03h
INT 10h
INT 20h
54. Pemrograman Assembly Mikroprosesor 8086
52
Gambar 21 Diagram alir program #12 (cetak kalimat warna)
Penjelasan : Pada register BL, angka 9 adalah warna
background sedangkan angka 5 adalah warna font.
Register CX menentukan banyaknya karakter tercetak.
6.6 Cetak Kalimat Berwarna (INT 10H/AH=1300H)
Mencetak berwarna tidak dapat dilakukan oleh INT
21H, maka kita akan menggunakan INT 10H service
1300 H. Interupt ini dapat digunakan untuk mencetak
kalimat dengan warna latar dan font yang berwarna.
Untuk menggunakan interrupt ini ketentuannya adalah
sbb :
AX = nilai service, 1300H
55. Indra Gunawan, ST., M.Kom., CEH., CHFI
53
BL = atribut warna, 3 digit kiri adalah warna font, Red Green
Blue, 1 digit berikutnya untuk mengaktifkan tulisan kedip, 3 digit
berikutnya adalah warna latar. 1 digit paling kanan adalah
mengaktifkan tulisan tebal/tipis.
DL = koordinat X
DH =koordinat Y
CX = banyaknya karaktar yang akan dicetak
BP = menampung variabel kalimat
Kode program selengkapnya dapat dilihat pada
program #13 dibawah ini.
;Program #13
.MODEL SMALL
org 100h
.CODE
MOV AX,1300h
MOV BL,10010101b
MOV BH,00
MOV DL,20
MOV DH,12
MOV CX,08H
LEA BP,kal0
INT 10h
INT 20h
.DATA
kal0 DB 'Uji coba'
56. Pemrograman Assembly Mikroprosesor 8086
54
Gambar 22 Diagram alir program #13 (Cetak warna lanjutan)
Penjelasan : Tercetak ‘Uji coba’ dengan warna sesuai isi
register BL, pada halaman 0, baris ke 20 dan kolom ke
12. Konfigurasi properti register BL dapat dilihat pada
gambar 23 dibawah ini.
57. Indra Gunawan, ST., M.Kom., CEH., CHFI
55
Gambar 23 Konfigurasi INT 10H/AX=1300H (Cetak warna).
6.7 Cetak Kalimat Berwarna Real Time
6.7.1 Cetak 1 Karakter
Pada pembahasan sebelumnya, mencetak kelayar
pada pemrograman assembly selalu menggunakan
interrupt, tetapi perlu diketahui bahwa ada metode
lainnya untuk mencetak kelayar tanpa interrupt, Bagian
ini akan membahas bagaimana mencetak karakter
menggunakan memori layar. Kelebihan metode ini
adalah dapat menampilkan karakter ke layar secara real
time yaitu dapat merubah-rubah karakter pada posisi
koordinat x dan y yang sama (seperti animasi) baik
karakternya, warna tulisannya maupun warna latarnya.
Metode tanpa interrupt ini melibatkan alamat
memori pada segment ke 0B800H:offset, ketika data
pada alamat ini diganti-ganti melalui perulangan
misalnya, maka tampilan di layar juga akan berganti-
ganti seketika. Jadi metode ini cocok untuk membuat
animasi tulisan berbasis assembly.
Contoh penggunaan memori layar dan hasilnya
dapat dilihat pada program #14 dan gambar #24
dibawah ini.
58. Pemrograman Assembly Mikroprosesor 8086
56
Gambar 24 Hasil tampilan program #14 (memori layar)
;Program #14
cetak macro x,y,kal,atr
MOV AX,0B800h
MOV ES,AX
MOV AH,Y
MOV AL,160
MUL AH
MOV BX,AX
MOV AH,X
MOV AL,2
MUL AH
ADD BX,AX
MOV AL,Kal
MOV AH,Atr
MOV ES:BX, AL
MOV ES:BX+1,AH
ENDM
;############### MACRO ###########
.MODEL SMALL
ORG 100h
.CODE
cetak 40 23 'A' 95
INT 20h
59. Indra Gunawan, ST., M.Kom., CEH., CHFI
57
Gambar 25 Diagram alir program #14 (memori layar)
6.7.2 Cetak Banyak Karakter
Untuk mencetak banyak karakter dengan memori
layar metodenya sama dengan satu karakter, caranya
60. Pemrograman Assembly Mikroprosesor 8086
58
adalah dengan mengulang-ulang metode cetak satu
karakter dengan mengubah-ubah parameter koordinat x,
y, warna, dan atribut.
Contoh penggunaan memori layar dan hasilnya
dapat dilihat pada program #15 dan gambar #26
dibawah ini.
Gambar 26 Hasil program #15 (memori layar)
;Program 15
.MODEL SMALL
ORG 100h
.CODE
cetak 40 15 'S' 95
cetak 41 15 'T' 97
cetak 42 15 'T' 65
cetak 40 17 'I' 23
cetak 41 17 'B' 35
cetak 42 17 'N' 63
cetak 43 17 'U' 58
cetak 40 19 'S' 14
cetak 41 19 'I' 37
cetak 42 19 'N' 33
cetak 43 19 'A' 48
INT 20h
6.7.3 Cetak animasi kalimat menggunakan memori
layar
Cetak animasi pada sub Bagian ini maksudnya
adalah, lihat gambar 27 terdapat tulisan ‘Yayasan Ibnu
Sina Batam’ dengan warna tulisan dan latar yang
berbeda-beda. Jika menggunakan mode interrupt 10H
maka hasilnya statis, tidak bisa berubah. Dengan
61. Indra Gunawan, ST., M.Kom., CEH., CHFI
59
memori layar seperti pada program #16 tulisan tersebut
akan terus berganti-ganti warna tulisan dan latarnya.
Gambar 27 Hasil program #16 (animasi memori layar).
;Program #16
Delay MACRO x
LOCAL Ulang
mov dx,0h
Ulang:
inc dx
cmp dx,x
je ulang
ENDM
cetak macro x,y,kal,atr
MOV AX,0B800h
; ES Menunjuk pada segment layar
MOV ES,AX
MOV AH,Y
MOV AL,160
; Hitung offset baris
MUL AH
; Simpan hasilnya pada BX
MOV BX,AX
MOV AH,X
MOV AL,2
; Hitung offset kolom
MUL AH
; Tambahkan hasilnya pada BX
ADD BX,AX
; AL=karakter yang akan ditampilkan
MOV AL,kal
; AH=Atribut yang akan ditampilkan
62. Pemrograman Assembly Mikroprosesor 8086
60
MOV AH,atr
; Tampilkan Karakter dan atributnya
MOV ES:BX,AL
; pada posisi kolom X dan baris Y
MOV ES:BX+1,AH
ENDM
;############### MACRO ###########
.MODEL SMALL
ORG 100h
.CODE
proses:
; Setiap selesai cetak kalimat, nol kan bx,
set ulang kolom ke 40d
xor bx,bx
mov ah,017h
mov kolom,ah
proses3:
; menyimpan nilai bx untuk dipakai lg
push bx
mov dl,var[bx]
cetak kolom baris dl warna
; isi bx dari stack
pop bx
; naikkan nilai warna
xor ah,ah
mov ah,warna
add ah,0Ah
mov warna,ah
; naikkan nilai kolom
xor ah,ah
mov ah,kolom
add ah,01h
mov kolom,ah
63. Indra Gunawan, ST., M.Kom., CEH., CHFI
61
; sleep program dgn loop sebanyak
1111x agar animasi terlihat
delay 0fffh
;naikkan nilai bx
inc bx
cmp bx,017H
push bx
je proses
loop proses3
loop proses
INT 20h
.DATA
jmp proses
var db 'Yayasan Ibnu Sina Batam'
warna db 0fh
kolom db 017h
baris db 0fh
Penjelasan : Program #15 ini mirip dengan program #14,
bedanya adalah ditambahkan delay sehingga perubahan
warna tulisan dan latar antar karakter tidak terlalu
cepat, selain itu digunakan perulangan yang bertujuan
untuk merubah-rubah warna tulisan dan warna latar
secara terus menerus.
6.8 Cetak Dari Input Keyboard
Pada Bagian ini kita akan membahas bagaimana
mencetak ke layar satu karakter dan banyak karakter
yang berasal dari ketikan keyboard. Metode ini bekerja
dengan cara menyimpan data ketikan keyboard pada
register AL dan variabel. Ada tiga metode pembacaan
keyboard menggunakan assembly yaitu :
Interrupt 16H Service 0H untuk membaca ketikan keyboard tanpa
cetak ke layar.
64. Pemrograman Assembly Mikroprosesor 8086
62
Interrupt 21H Service 01H untuk membaca ketikan keyboard
sekaligus cetak ke layar.
Interrupt 21H Service 0AH untuk membaca ketikan keyboard
banyak karakter .
6.8.1 Baca 1 Karakter dengan INT 16H/AH=0H
Untuk membaca ketikan keyboard 1 karakter
maka digunakan Interrupt 16H service 0H, interrupt ini
hanya dapat membaca 1 karakter ketikan keyboard per
interrupt, jika ingin dilakukan pembacaan banyak
karakter, maka harus diulang-ulang interruptnya
menggunakan perulangan seperti pada contoh. Contoh
program interruptnya dapat dilihat pada program #17
dibawah ini.
;Program #17
.MODEL SMALL
ORG 100h
.CODE
satu:
mov AH,0H
INT 16h
LOOP satu
65. Indra Gunawan, ST., M.Kom., CEH., CHFI
63
Gambar 28 Diagram alir program #17 (INT 16H/AH=0H)
6.8.2 Baca 1 Karakter dengan INT 21H/AH=01H
Interrupt 21H service 1H hanya dapat membaca 1
karakter ketikan keyboard per interrupt, jika ingin
dilakukan pembacaan banyak karakter, maka harus
diulang-ulang interruptnya seperti pada contoh. Contoh
program interrupt ini ada pada program#18 dibawah ini.
;Program #18
.MODEL SMALL
ORG 100h
.CODE
satu:
mov AH,1H
INT 21h
LOOP satu
66. Pemrograman Assembly Mikroprosesor 8086
64
Gambar 29 Diagram alir program #18 (INT 21/AH=01H).
6.8.2 Baca Banyak Karakter
Metode pembacaan ketikan keyboard yang ketiga
ini melibatkan variabel dan interrupt 21H service 0AH.
Untuk memakai cara ini harus dibuat variabel array tiga
elemen untuk menyimpan hasil ketikan keyboard.
Contoh program dan penjelasannya dapat dilihat pada
program #19 dan gambar 30.
;Program #19
.MODEL SMALL
ORG 100h
.CODE
MOV AH,0AH
MOV DX,OFFSET var
INT 21H
.DATA
var DB 9,?,9 DUP(?)
67. Indra Gunawan, ST., M.Kom., CEH., CHFI
65
Gambar 30 Diagram alir program #19 (INT 21H/AH=0AH).
Penjelasan : Variabel kata memiliki 3 elemen
Angka 9 paling kiri adalah 9 byte (9 karakter) maksimal yang bisa
ditampung.
Tanda tanya ‘?’ akan terisi panjang karakter yang telah
diketikkan pada keyboard.
Angka 9 paling kanan adalah 9 byte yang akan terisi karakter
yang telah diketikkan pada keyboard.
Variabel kata ini akan terisi setelah pengguna menekan enter.
68. Pemrograman Assembly Mikroprosesor 8086
66
Bagian 7 Operasi Logika
Seperti pada umumnya bahasa pemrograman
lainnya, assembly juga dapat melakukan berbagai
operasi logika seperti AND, OR, XOR serta NOT.
Operator-operator logika tersebut dapat dimanfaatkan
dalam banyak hal. Contohnya dalam buku ini, operator
AND akan digunakan untuk menggambar grafik
(menemukan nilai 1 pada kumpulan angka biner),
operator XOR digunakan untuk membuat nol isi register,
operator NOT digunakan untuk menemukan lawan bit
dari suatu nilai, dan terakhir operator OR digunakan
untuk menemukan nilai 0 pada kumpulan angka biner.
7.1Operasi AND
Operasi AND adalah operasi yang bernilai TRUE jika
A dan B bernilai TRUE. Jika diterjemahkan kedalam
bilangan biner artinya adalah apabila kita mempunyai
dua variabel A dan B berisi bilangan biner dan dikenakan
operasi AND, maka hasilnya bernilai 1 jika dan hanya
jika A dan B bernilai 1, selain itu hasilnya 0. Untuk lebih
mudahnya dapat dilihat pada gambar 31 dibawah ini.
Gambar 31 Logika AND (Leiterman, 2010).
Untuk menggunakan operasi AND dalam assembly
silakan liat pada program #8 dibawah ini.
;Program #8
.MODEL SMALL
org 100h
.CODE
69. Indra Gunawan, ST., M.Kom., CEH., CHFI
67
MOV AH,01H
MOV BL,00H
AND AH,BL
Gambar 32 Diagram alir program #8 (operasi AND)
Penjelasan : Program diatas tidak memiliki output
sehingga untuk melihat hasilnya harus melalui debug
register (silakan lihat Bagian 4.3), hasil debug registernya
dapat dilihat pada debug #8 dibawah ini.
Debug #8
AX=0000 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0100 NV UP EI PL NZ NA PO NC
Pada awalnya nilai AH=00H, BL=00H.
0700:0100 B401 MOV AH, 01h
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0102 NV UP EI PL NZ NA PO NC
Dengan perintah MOV AH, 01h maka nilai AH menjadi
01H (tulisan merah).
0700:0102 B300 MOV BL, 00h
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0104 NV UP EI PL NZ NA PO NC
70. Pemrograman Assembly Mikroprosesor 8086
68
Dengan perintah MOV BL, 00h maka nilai BL menjadi
00H (tulisan merah).
0700:0104 22E3 AND AH, BL
AX=0000 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0106 NV UP EI PL ZR NA PE NC
0700:0106 90 NOP
Dengan perintah AND AH,BL maka nilai AH menjadi 00H
(AH sebagai hasil).
7.2Operasi OR
Operasi OR adalah operasi yang bernilai TRUE jika A
atau B bernilai TRUE. Jika diterjemahkan kedalam
bilangan biner artinya adalah apabila kita mempunyai
dua variabel A dan B berisi bilangan biner dan dikenakan
operasi OR, maka hasilnya bernilai 1 jika A atau B
bernilai 1, dan hanya bernilai 0 jika A dan B bernilai 0.
Untuk lebih mudahnya dapat dilihat pada gambar 33.
Gambar 33 Logika OR (Leiterman, 2010).
Untuk menggunakan operasi OR dalam assembly
silakan liat pada program #9 dibawah ini.
;Program #9
.MODEL SMALL
org 100h
.CODE
MOV AH,01H
MOV BL,00H
OR AH,BL
71. Indra Gunawan, ST., M.Kom., CEH., CHFI
69
Gambar 34 Diagram alir program #9(Operasi OR)
Penjelasan : Program diatas tidak memiliki output
sehingga untuk melihat hasilnya harus melalui debug
register (silakan lihat Bagian 4.3), hasil debug registernya
dapat dilihat pada debug #9 dibawah ini.
Debug #9
AX=0000 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0100 NV UP EI PL NZ NA PO NC
Kondisi awal
0700:0100 B401 MOV AH, 01h
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0102 NV UP EI PL NZ NA PO NC
Perintah MOV AH, 01H menjadikan AH = 01H.
72. Pemrograman Assembly Mikroprosesor 8086
70
0700:0102 B300 MOV BL, 00h
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0104 NV UP EI PL NZ NA PO NC
Perintah MOV BL, 00H menjadikan BL = 00H.
0700:0104 0AE3 OR AH, BL
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0106 NV UP EI PL NZ NA PO NC
Perintah OR AH, BL menjadikan AH = 01H.
7.3Operasi XOR
Operasi XOR (Exclusive OR) adalah operasi yang
bernilai TRUE jika salah satu A atau B bernilai TRUE.
Jika diterjemahkan kedalam bilangan biner artinya
adalah apabila kita mempunyai dua variabel A dan B
berisi bilangan biner dan dikenakan operasi XOR, maka
hasilnya bernilai 1 jika salah satu A atau B bernilai 1,
dan hanya bernilai 0 jika A dan B sama-sama bernilai 0
atau sama-sama berniai 1. Untuk lebih mudahnya dapat
dilihat pada gambar 35.
Gambar 35 Operasi XOR (Leiterman, 2010).
Untuk menggunakan operasi XOR dalam assembly
silakan liat pada program #10 dibawah ini.
;Program #10
.MODEL SMALL
org 100h
.CODE
MOV AH,01H
MOV BL,00H
XOR AH,BL
73. Indra Gunawan, ST., M.Kom., CEH., CHFI
71
Gambar 36 Diagram alir program #10 (Operasi XOR)
Penjelasan : Program diatas tidak memiliki output
sehingga untuk melihat hasilnya harus melalui debug
register (silakan lihat Bagian 4.3), hasil debug registernya
dapat dilihat pada debug #10 dibawah ini.
Debug #10
AX=0000 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0100 NV UP EI PL NZ NA PO NC
Kondisi awal
0700:0100 B401 MOV AH, 01h
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0102 NV UP EI PL NZ NA PO NC
Perintah MOV AH, 01h menjadikan AH=01H.
0700:0102 B300 MOV BL, 00h
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0104 NV UP EI PL NZ NA PO NC
Perintah MOV BL, 00h menjadikan BL=00H.
0700:0104 32E3 XOR AH, BL
AX=0100 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0106 NV UP EI PL NZ NA PO NC
Perintah XOR AH,BL menjadikan AH=01H.
74. Pemrograman Assembly Mikroprosesor 8086
72
7.4Operasi NOT
Operasi NOT adalah operasi lawan dari/negasi, jika
variabel A bernilai 0 maka NOT A bernilai 1, demikian
juga sebaliknya jika variabel A bernilai 1 maka NOT A
bernilai 0. Untuk lebih mudahnya dapat dilihat pada
gambar 37.
Gambar 37 Operasi NOT (Leiterman, 2010).
Untuk menggunakan operasi NOT dalam assembly
silakan liat pada program #11 dibawah ini.
;Program #11
.MODEL SMALL
org 100h
.CODE
MOV AH,01H
NOT AH
Gambar 38 Diagram alir program #11 (Operasi NOT)
75. Indra Gunawan, ST., M.Kom., CEH., CHFI
73
Penjelasan : Program diatas tidak memiliki output
sehingga untuk melihat hasilnya harus melalui debug
register (silakan lihat Bagian 4.3), hasil debug registernya
dapat dilihat pada debug #11 dibawah ini.
Debug #11
AX=0000 BX=0000 CX=0004 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0100 NV UP EI PL NZ NA PO NC
Kondisi awal
0700:0100 B401 MOV AH, 01h
AX=0100 BX=0000 CX=0004 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0102 NV UP EI PL NZ NA PO NC
Perintah MOV AH, 01H menjadikan AH=01H.
0700:0102 F6D4 NOT AH
AX=FE00 BX=0000 CX=0004 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0700 ES=0700 SS=0700 CS=0700 IP=0104 NV UP EI PL NZ NA PO NC
Perintah NOT AH menjadikan AH=FEH.
Penyelesaian dengan bilangan biner
AH = 0000 0001 h
NOT AH = 1111 1110 h = FEh
76. Pemrograman Assembly Mikroprosesor 8086
74
BAGIAN 8 TIPE DATA
Tipe data penting dalam suatu bahasa
pemrograman, dengan adanya tipe data yang
disesuaikan dengan kebutuhan program yang akan
dibuat, maka program tersebut dapat menggunakan
space pada memori secara lebih efisien dan optimal serta
tidak membuang-buang space memori secara sia-sia.
Tipe data pada assembly terdiri dari 5
(Dandamudi, 2005) yaitu :
DB (Define Byte) = 1 Byte
DW (Define Word) = 2 Byte
DD (Define DoubleWord) = 4 Byte
DQ (Define Quadword) = 8 Byte
DT (Define Ten Bytes)= 10 Byte
Perlu diketahui bahwa tipe data DQ dan DT tidak
dikenali oleh mikroprosesor 8086, karena kedua tipe
data tersebut baru muncul pada mikroprosesor versi
atasnya, maka emulator Emu8086 juga tidak dapat
mengenali tipe data tersebut, jika anda ingin tetap
mencoba tipe data tersebut, gunakan emulator lainnya
seperti TASM dan NASM atau DOSBOX. Untuk
memahami tipe data diatas, perhatikan program #12
dibawah ini beserta debugnya.
;Program #12
.MODEL SMALL
ORG 100H
.CODE
.DATA
77. Indra Gunawan, ST., M.Kom., CEH., CHFI
75
A DB 'z'
B DB 'Uji coba dengan kalimat'
C DB 3Ah
D DW 123Fh
E DD 98761234h
Penjelasan : Program #12 diatas tidak memiliki output
sehingga untuk melihat hasilnya harus melalui debug
memori (silakan lihat Bagian 4.3), hasil debug memori
dapat dilihat pada gambar 39 dibawah ini. Yang
bertanda merah merupakan data pada variabel A, B, C,
D, E dimana satu pasang nilai misalnya 55H (huruf ‘U’)
berukuran 1 byte.
Gambar 39 Debug #12 Memori
78. Pemrograman Assembly Mikroprosesor 8086
76
Bagian 9 Mode Pengalamatan
Instruksi perintah assembly pada mikroprosesor
8086 atau biasa disebut x86 memiliki beberapa macam
ragam jumlah operand. Ada instruksi tanpa operand
misalnya perintah RET (RETURN : kembali ke program
utama). Ada instruksi dengan satu operand misalnya
MUL AX (instruksi perkalian). Ada pula instruksi dengan
dua operand, misalnya ADD AX, 05H (instruksi
pertambahan) (Cavanagh, 2013, p. 86). Ragam cara
operand/register dalam menerima nilai tersebut disebut
dengan mode pengalamatan.
Mode pengalamatan dalam assembly dibagi
menjadi tujuh mode yaitu :
Tabel 4 Tujuh mode pengalamatan
N
o
Nama Mode Alat/
Metode
Kecepata
n/
Kapasitas
1 Register Addr GP Register/
Langsung
Tertinggi/
Terkecil
2 Immediate Addr GP Register/
Langsung
Sangat
tinggi/
Terkecil
3 Direct Memori
Addr
GP Register
+Memori/
Langsung
Tinggi/
Kecil
4 Indirect Memori
Addr
GP Register
+Memori/
Tidak
Langsung
Sedang/
Sedang
79. Indra Gunawan, ST., M.Kom., CEH., CHFI
77
N
o
Nama Mode Alat/
Metode
Kecepata
n/
Kapasitas
5 Base Relatif Addr GP Register
+Memori/
Tidak
Langsung
Sedang/
Sedang
6 Direct Index Addr GP Register
+segmentRegist
er
+ Memori/
Tidak
Langsung
Lambat/
Besar
7 Scale Factor Addr GP Register
+segmentRegist
er
+ Memori /
Tidak
Langsung
Lambat/
Terbesar
9.1 Register Addressing
Register addressing adalah mode pengalamatan
tercepat dan terpendek, tercepat karena register diencode
langsung kedalam instruksi, terpendek rutenya karena
pengalamatan ini hanya melibatkan mikroprosesor saja
tanpa melibatkan komponen lain seperti bus dan memori.
Proses Diagram alir pada pengalamatan ini dapat dilihat
pada gambar 40 dibawah ini.
80. Pemrograman Assembly Mikroprosesor 8086
78
Gambar 40 Diagram alir register addressing.
Contoh perintah assembly yang termasuk dalam
register addressing adalah :
INC AX
DEC CX
MOV AX,BX
ADD AX,BX
SUB AX,BX
9.2 Immediate Addressing
Register addressing dan immediate addressing
adalah mode pengalamatan tercepat karena hanya
melibatkan mikroprosesor. Perbedaan keduanya adalah
register addressing bekerja dengan cara mengkopi data
antar register, sedangkan immediate register bekerja
dengan cara mengisi register langsung dengan nilai.
Proses Diagram alir pada pengalamatan ini dapat dilihat
pada gambar 41 dibawah ini.
Gambar 41 Diagram alir immediate addressing.
Contoh perintah assembly yang termasuk dalam
immediate addressing adalah :
MOV AX, 05H
MOV CL, 14H
81. Indra Gunawan, ST., M.Kom., CEH., CHFI
79
ADD BX, 27H
SUB AX, 44H
9.3 Direct Memori Addressing
Direct memori addressing adalah mode
pengalamatan dimana register diisi oleh nilai yang
berasal dari alamat pada memori. Maka pengalamatan
ini melibatkan mikroprosesor, memori dan bus sehingga
relatif lebih lambat dibandingkan dengan dua mode
pengalamatan sebelumnya.
Contoh perintah assembly yang termasuk dalam
direct memori addressing adalah :
MOV BX, [0108]
MOX AH, [0700]
Contoh penggunaan direct memori addressing
dapat dilihat pada program #13 dibawah ini :
;Program #13
.MODEL SMALL
ORG 100H
.CODE
MOV AX,[0108]
.DATA
A DW 'Coba'
Proses Diagram alir pada program #13 dapat
dilihat pada gambar 42 dibawah ini.
82. Pemrograman Assembly Mikroprosesor 8086
80
MOV
AX,[0108]
Data pada
Offset 0108H
(variabel A)
=
‘Coba’
MULAI
Register
AX=’Coba’
SELESAI
Gambar 42 Diagram alir program #13 (direct memori
addressing).
Penjelasan : Perintah diatas assembly akan mencari nilai
pada alamat 0108h yaitu ‘Coba’ dan diisikan pada
register AX.
9.4 Indirect Memori Addressing
Base memori/register indirect addressing adalah
mode pengalamatan dimana register diisi oleh nilai yang
berasal dari alamat memori yang berada pada suatu
register. Pengalamatan ini melibatkan mikroprosesor,
memori dan bus. Perbedaan dengan pengalamatan
sebelumnya, pada pengalamatan ini nilai alamat memori
berada dalam register sehingga membutuhkan langkah
yang lebih panjang sehingga kecepatannya lebih lambat.
83. Indra Gunawan, ST., M.Kom., CEH., CHFI
81
Contoh perintah assembly yang termasuk dalam
Base memori/register indirect addressing adalah :
MOV AX, [BX]
MOV BX, [BX]
MOX DX, [CX]
Contoh penggunaannya dapat dilihat pada
program #13 dibawah ini :
;Program #13
.MODEL SMALL
ORG 100H
.CODE
;MOV BX, A (SALAH)
MOV BX, OFFSET A ;(BENAR)
MOV AX,[BX]
.DATA
A DW 'Coba'
Proses diagram alir pada program #13 dapat
dilihat pada gambar 43 dibawah ini.
84. Pemrograman Assembly Mikroprosesor 8086
82
MOV AX, [BX]
Variabel A
=
‘Coba’
MULAI
SELESAI
MOV BX,OFFSET A
Register BX
= 0108H
Register AX
= ‘Coba’
Gambar 43 Diagram alir program #13 (indirect memori
addressing).
Perbedaan MOV BX, A dan MOV BX, OFFSET A adalah :
MOV BX, A (Isi BX = 6F43H = ‘Coba’)
MOV BX, OFFSET A (Isi BX = 0108H)
Jika kemudian diberikan perintah MOV AX, [BX] yang
artinya adalah mengisi AX dengan nilai pada alamat BX
maka yang terjadi adalah :
MOV BX, A
MOV AX,[BX]
Pada perintah diatas assembly akan mencari nilai pada
alamat memori 6F43H yaitu kosong, maka AX = 0000h.
MOV BX, OFFSET A
MOV AX,[BX]
85. Indra Gunawan, ST., M.Kom., CEH., CHFI
83
Sedang pada perintah diatas assembly akan mencari
nilai pada alamat 0108h yaitu ‘Coba’.
9.5 Base Relative Addressing
Base relatif addressing adalah mode
pengalamatan dimana kita mengakses alamat asal suatu
variabel array (base) yang alamat ini selanjutnya
digunakan untuk mengakses elemen-elemen dalam array
tersebut (relatif). Kecepatan pengalamatan ini lebih
lambat dari pengalamatan sebelumnya seBagian untuk
mengakses alamat memori (yang akan diisikan kedalam
register tujuan), diperlukan akses ke register lain yang
isinya adalah alamat variabel, barulah selanjutnya
menuju ke memori untuk mengakses data array dan
elemennya.
Contoh perintah assembly yang termasuk dalam
base memori/register indirect addressing adalah :
MOV AX, [BX +1]
MOX DX, [BX +2]
Contoh penggunaannya dapat dilihat pada
program #14 dibawah ini :
;Program #14
.MODEL SMALL
ORG 100H
.CODE
MOV AX,[A+1]
.DATA
A DW 'Coba'
Proses Diagram alir pada program #14 ini dapat dilihat
pada gambar 44 dibawah ini.
86. Pemrograman Assembly Mikroprosesor 8086
84
Gambar 44 Diagram alir program #14 (base relative
addressing).
Penjelasan : Kita umpamakan alamat offset A adalah
0106H. Maka perintah diatas menghasilkan
AX=[0106H+1]=[0107H], selanjutnya assembly akan
mencari isi alamat 0107H kedalam memori, dan data
pada alamat 0107H adalah huruf ‘o’. Maka program
diatas menghasilkan AX=’o’.
9.6 Direct Index Addressing
Direct index addressing adalah mode
pengalamatan dimana diperlukan segment register
sebagai perantara antara general purpose register dan
memori. Kecepatan pengalamatannya tentu saja lebih
lambat dari pengalamatan sebelumnya karena
melibatkan segment register.
Contoh perintah assembly nya adalah :
MOV DL, ES:[BX][SI]
Contoh penggunaannya dapat dilihat pada program #15
dibawah ini :
;Program #15
.MODEL SMALL
ORG 100H
87. Indra Gunawan, ST., M.Kom., CEH., CHFI
85
.CODE
MOV CX,9H
MOV AX,0700H
MOV ES, AX
MOV BX,0119H
XOR SI, SI
MOV AH,02H
Ulang:
MOV DL,ES:[BX][SI]
INT 21H
INC SI
Loop Ulang
INT 20H
.DATA
A DB 'Coba saja'
88. Pemrograman Assembly Mikroprosesor 8086
86
Gambar 45 Diagram alir program #15 (Direct Index
Addressing)
Penjelasan : Pada program #15 proses pengkopian data
dari memori ke general purpose register memerlukan
89. Indra Gunawan, ST., M.Kom., CEH., CHFI
87
segment register sebagai perantara. Hasil output dari
program diatas adalah.
DL=0700:0119+[0…12]
DL=’Coba saja’
Jika dilihat kedalam memori, alamat 0700H:0119H
adalah string ‘Coba saja’.
9.7 Scale Factor Addressing
Scale factor addressing adalah mode
pengalamatan yang biasa digunakan untuk mengakses
array dan elemennya. Direct index dan scale factor
adalah dua mode pengalamatan yang paling lambat
karena melalui perantara segment register, dan sekaligus
memiliki kapasitas terbesar karena berhubungan dengan
data array banyak dimensi. Contoh perintah assembly
nya adalah :
MOV [BX][SI],’S’
MOV [BX][SI],01H
Contoh penggunaannya dapat dilihat pada program #16
dibawah ini :
;Program #16
.MODEL SMALL
ORG 100H
.CODE
XOR SI,SI
MOV BX, OFFSET fak
MOV CX,27d
ulang:
MOV AH,satu[SI]
MOV [BX][SI],AH
INC SI
loop ulang
XOR SI,SI
MOV CX,27d
MOV AH,02H
90. Pemrograman Assembly Mikroprosesor 8086
88
ulang2:
MOV DL,fak[SI]
INT 21H
INC SI
loop ulang2
INT 20H
.DATA
satu DB '01',' ','informatika',10d,13d,'02','
','industri'
fak DB 1 DUP (?)
Proses diagram alir pada program #16 ini dapat
dilihat pada gambar 46 dibawah ini.
91. Indra Gunawan, ST., M.Kom., CEH., CHFI
89
Gambar 46 Diagram alir Program #16
Penjelasan : Sebenarnya mikroprosesor 8086 tidak
mengenal istilah array multidimensi dalam penyimpanan
memori nya, array multidimensi hanyalah bersifat logika
diatas program, sedangkan secara fisik penyimpannya
92. Pemrograman Assembly Mikroprosesor 8086
90
teteplah seperti array linier satu dimensi, oleh karena itu
untuk membuat array multidimensi dibutuhkan trik
seperti pada program #16. Program diatas bekerja
dengan cara mengkopy isi variabel satu kedalam array
fak menggunakan loop kemudian mencetak isinya
dengan INT 21H service 02H.
93. Indra Gunawan, ST., M.Kom., CEH., CHFI
91
Bagian 10 Array
Array merupakan kumpulan data yang bertipe
data sama, dalam bidang lain disebut dengan himpunan.
Array dapat berupa kumpulan data satu dimensi, dua
dimensi maupun banyak dimensi. Semua bahasa
pemrograman tingkat tinggi relatif lebih mudah dalam
membuat array berdimensi, sedangkan dalam bahasa
assembly khususnya pada mikroprosesor 8086
sebenarnya tidak mengenal istilah banyak dimensi, array
dengan dimensi berapapun akan disimpan dalam
memori dengan cara satu dimensi, maka diperlukan trik
dalam membuatnya, pada sub Bagian selanjutnya akan
dibahas array satu dimensi sampai banyak dimensi
beserta contoh programnya.
10.1 Array Satu Dimensi
Array satu dimensi dalam bahasa assembly
dibuat dengan cara mendefisinikan suatu variabel, lalu
menentukan tipe data yang sesuai dan kemudian
mengisi data dengan dipisah koma. Data dapat
dimasukkan berupa bilangan biner, desimal, oktal,
heksadesimal maupun string.
Contoh array satu dimensi dapat dilihat pada
program #17 dibawah ini :
;Program #17
.MODEL SMALL
ORG 100H
.CODE
XOR SI,SI
MOV CX,5d
MOV AH,02H
ulang:
MOV DL,kar[SI]
95. Indra Gunawan, ST., M.Kom., CEH., CHFI
93
Gambar 47 Diagram alir program #17 (Array 1 dimensi)
Penjelasan : Program diatas akan melakukan
perulangan 5 kali untuk mencetak angka 12345 ke layar.
Untuk mendefinisikan string dalam array maka
digunakan tanpa petik.
96. Pemrograman Assembly Mikroprosesor 8086
94
10.2 Array Multi Dimensi
Sesungguhnya array multi dimensi tidak dikenal
dalam mikroprosesor 8086. Penyimpanan array multi
dimensi dalam memori tetaplah seperti satu dimensi
yaitu secara linier.
Contoh dibuat array dua dimensi seperti dibawah
ini :
.DATA
A DB 1,2,3,4,5
B DB 6,7,8,9,10
Jur DW 1 DUP(OFFSET A, OFFSET B)
Maka sesungguhnya didalam memori,
penyimpannya akan tetap linier seperti berikut ini :
1,2,3,4,5,6,7,8,9,10, Jur…
Sehingga dalam pemrograman assembly, untuk
membuat array multi dimensi diperlukan trik dalam
membuat kode programnya. Yang perlu diperhatikan
adalah :
Tentukan tipe data yang tepat, sesuaikan dengan lebar data pada
tiap elemen.
Gunakan pointer untuk mengakses data per byte atau per word.
Gunakan tanda 0 sebagai pemisah antar elemen sebagai
penanda untuk memudahkan pencarian.
Buatlah satu baris satu variabel, kemudian buat variabel lain
sebagai array untuk menampung offset masing-masing variabel.
Rumus untuk mengakses offset elemen adalah :
Offset elemen : (baris x - 1 * 2)
Misalnya ingin mengakses angka 8, maka langkah-
langkahnya adalah :
1. Register SI = Jur [(2-1) * 2]= Jur [2] = 0601H
97. Indra Gunawan, ST., M.Kom., CEH., CHFI
95
2. Register BL = Elemen Jur ke [SI]= 06H
3. Register BH= Elemen Jur ke [SI+1]= 01H
4. Register BX = 0106H
5. Lakukan loop sebanyak 5x(jumlah kolom=5) pada alamat [BX].
6. Jika bertemu tanda 0 keluar dari loop, jika tidak terus lakukan
loop dan naikkan nilai BX.
7. Jika Loop no 6 sudah berhenti, maka BX berisi OFFSET angka 8,
misalkan BX=0108H.
8. Lakukan loop lagi untuk mencetak karakter pada alamat OFFSET
[BX]/0108H.
9. Maka akan tercetak angka 8
Contoh array satu dimensi dapat dilihat pada
program #18 dibawah ini :
;Program #18
;Cetak 'Industri'
.MODEL SMALL
ORG 100H
.CODE
;String ‘industri’ berada pada var D
;Letak 'OFFSET D' dalam array Jur
;Baris-1 * 2 = 4-1*2 = 6
;index array dimulai dari 0
MOV SI,6H
;BX=OFFSET D
;Mengisi BX dengan cara terbalik
MOV BL,BYTE PTR Jur[SI]
MOV BH,BYTE PTR Jur[SI+1]
;Loop utk menemukan penanda 0 pd baris ke
4(variabel D)
cek:
98. Pemrograman Assembly Mikroprosesor 8086
96
MOV AL,BYTE PTR [BX]
INC BX
CMP AL,0
JNE cek
MOV CX,8h
JE ulang
;cetak 'industri'
;alamat offset 'industri' ada di BX
ulang:
MOV AH,02H
MOV DL,BYTE PTR [BX]
INT 21H
INC BX
loop ulang
INT 20H
.DATA
A DB '00001',0,'Ekonomi',0,'Gedung A',0
B DB '00002',0,'Hukum',0,'Gedung B',0
C DB '00003',0,'Kimia',0,'Gedung C',0
D DB '00004',0,'Industri',0,'Gedung D',0
E DB '00005',0,'Biologi',0,'Gedung E',0
Jur DW 1 DUP(OFFSET A,OFFSET B,OFFSET
C,OFFSET D,OFFSET E)
99. Indra Gunawan, ST., M.Kom., CEH., CHFI
97
Gambar 48 Diagram alir program #19 (Array multi dimensi)
Penjelasan :
Register SI = Jur [(4-1) * 2]= Jur [6]= 6501H
Register BL= Elemen Jur ke [SI]= 65H
100. Pemrograman Assembly Mikroprosesor 8086
98
Register BH= Elemen Jur ke [SI+1]= 01H
Register BX = 0165H
Lakukan loop cek pada alamat [BX]/[0165H] sampai bertemu
tanda 0 maka keluar dari loop, jika tidak ketemu terus lakukan
loop dan naikkan nilai BX.
Jika Loop cek sudah berhenti, maka BX berisi OFFSET string
‘industri’, misalkan BX=0171H.
Lakukan loop lagi untuk mencetak karakter pada alamat OFFSET
[BX]/0171H.
Maka akan tercetak string ‘industri’.
101. Indra Gunawan, ST., M.Kom., CEH., CHFI
99
Bagian 11 Percabangan Dan Perulangan
Percabangan dan perulangan merupakan dua hal
yang harus ada dalam suatu bahasa pemrograman. Jika
diperumpamakan baris program adalah jalan raya, maka
percabangan mirip persimpangan jalan, tidak mungkin
terjadi ada jalan raya tanpa persimpangan jalan.
Demikian juga dengan perulangan, perulangan dapat
diperumpamakan bundaran pada jalan raya.
Percabangan berguna untuk mengarahkan program
kepada sub rutin tertentu jika terpenuhi suatu syarat
tertentu, sedang perulangan berguna untuk mengulang-
ulang sub rutin tertentu dengan syarat tertentu.
11.1 Label
Label merupakan bagian vital pada bahasa
pemrograman assembly, label hanya diperlukan ketika
digunakan percabangan dan perulangan. Aturan
penulisan label adalah sebagai berikut :
Karakter awal label dapat berupa huruf a sampai z maupun
karakter tertentu seperti @, $, _, ?.
Panjang label maksimal adalah 31 digit karakter.
Tidak boleh menggunakan kata-kata yang telah terpakai oleh
assembly.
Setiap label harus unik, tidak boleh ada label yang sama salam
satu program.
(L. B. Das, 2010, p. 86)
Contoh penggunaan label dapat dilihat pada
program #19 berikut ini.
;Program #19
.MODEL SMALL
102. Pemrograman Assembly Mikroprosesor 8086
100
ORG 100h
.CODE
MOV AH, 02H
abcdefghijklnopqrstuvwxyz:
MOV DL,'-'
INT 21H
@coba:
MOV DL,'A'
INT 21H
#coba2:
MOV DL,'B'
INT 21H
$coba3:
MOV DL,'C'
INT 21H
_coba4:
MOV DL,'D'
INT 21H
INT 20H
103. Indra Gunawan, ST., M.Kom., CEH., CHFI
101
Gambar 49 Diagram alir program #19 (Label).
11.2 Percabangan dengan Lompatan
Percabangan dengan lompatan pada assembly
dilakukan dengan perintah JMP (Jump), terdapat dua
macam jump yaitu bersyarat dan tanpa syarat.
104. Pemrograman Assembly Mikroprosesor 8086
102
11.2.1 Lompatan Tanpa Syarat
Lompatan tanpa syarat adalah jenis lompatan
(jump) yang terjadi tanpa didahului oleh seBagian
tertentu. Format perintah jump pada assembly adalah
sebagai berikut :
JMP Tujuan
Tujuan dapat berupa label, register maupun
alamat memori. Ketika baris program sampai pada kode
JMP, maka program akan lompat menuju
operand/tujuan yang ditunjuk oleh JMP tanpa syarat.
Maka jenis jump ini dapat digunakan untuk berpindah
antar label atau antar lokasi memori. Contoh
penggunaan perintah JMP dapat dilihat pada program
#20 dibawah ini.v
;Program #20
.MODEL SMALL
ORG 100h
.CODE
@coba:
MOV BX,0100H
MOV AH, 02H
MOV DL,'A'
INT 21H
JMP #cobalagi
#cobalagi:
JMP @coba
105. Indra Gunawan, ST., M.Kom., CEH., CHFI
103
Gambar 50 Diagram alir program #20 (perintah JMP).
Penjelasan : Ketika sampai pada baris JMP @coba,
program akan lompat ke label @coba, dan akan
melakukan perulangan tanpa henti.
106. Pemrograman Assembly Mikroprosesor 8086
104
11.2.2 Lompatan Bersyarat
Lompatan bersyarat adalah jenis lompatan (jump)
yang terjadi dengan didahului oleh seBagian tertentu.
Lompatan ini didahului perintah CMP (compare).
Terdapat banyak perintah jump yang masuk dalam
kategori jump bersyarat, perintah-perintah tersebut
dapat dilihat pada tabel 5 berikut :
Tabel 5 Jump bersyarat
No Perintah Arti Kondisi
1 JA Jump if Above CF=0 dan
ZF=0
2 JAE Jump if Above
or Equal
CF=0
3 JB Jump if Below CF=1
4 JBE Jump if Below
Or Equal
CF=1 atau
ZF=1
5 JC Jump if Carry CF=1
6 JCXZ Jump if CX
Zero
CX=0
7 JE Jump if Equal ZF=1
8 JNA Jump if Not
Above
CF=1 atau
ZF=1
9 JNAE Jump if Not
Above or Equal
CF=1
No Perintah Arti Kondisi
10 JNB Jump if Not
Below
CF=0
11 JNBE Jump if Not
Below nor
Equal
CF=0 dan
ZF=0
107. Indra Gunawan, ST., M.Kom., CEH., CHFI
105
12 JNC Jump if no
Carry
CF=0
13 JNE Jump if Not
Equal
ZF=0
14 JNP Jump if No
Parity
PF=0
15 JNZ Jump if Not
Zero
ZF=0
16 JP Jump if Parity PF=1
17 JPE Jump if Parity
Even
PF=1
18 JPO Jump if Parity
Odd
PF=0
19 JZ Jump if Zero ZF=1
Contoh penggunaan perintah JMP dapat dilihat
pada program #21 dibawah ini.
;Program #21
.MODEL SMALL
ORG 100h
.CODE
@coba:
MOV AH,02H
MOV DL,’H’
CMP DL,’Z’
JA #cobalagi
JB #cobacoba
#cobalagi:
INT 21H
JMP #akhir
#cobacoba:
INT 21H
JMP #akhir
#akhir:
109. Indra Gunawan, ST., M.Kom., CEH., CHFI
107
Gambar 51 Diagram alir program #21 (jump bersyarat).
Penjelasan :
110. Pemrograman Assembly Mikroprosesor 8086
108
Ketika perintah CMP DL,’Z’ dijalankan, komputer
membandingkan nilai DL dan Z dan mengaktifkan sejumlah flag
register.
Perintah JA #cobalagi melakukan cek ke register, jika nilai
heksadesimal DL lebih tinggi dibanding nilai heksadesimal ‘Z’
maka lompat ke label #cobalagi.
Perintah JB #cobacoba melakukan cek ke register, jika nilai
heksadesimal DL lebih kecil dibanding nilai heksadesimal ‘Z’
maka lompat ke label #cobacoba.
Berhubung nilai DL adalah ‘H’ dan nilai operand pada perintah
CMP adalah ‘Z’ maka nilai DL lebih kecil maka perintah JB
#cobacoba dieksekusi.
Label #cobacoba mencetak ke layar dengan INT 21H kemudian
lompat tanpa syarat ke label #akhir.
Label #akhir mengakhiri program dengan perintah INT 20H.
11.3 Perulangan
Perulangan pada assembly dapat dilakukan
dengan perintah LOOP dan JMP. Perintah LOOP
memberikan perulangan dengan kondisi, perintah JMP
memberikan perulangan tanpa kondisi.
11.3.1 Perulangan Tanpa Syarat
Perulangan tanpa syarat pada assembly dapat
dilakukan dengan menggunakan dengan perintah JMP.
Format penulisan perintahnya telah dibahas pada
Bagian sebelumnya. Contoh programnya dapat dilihat
pada contoh program #22 dibawah ini.
112. Pemrograman Assembly Mikroprosesor 8086
110
MULAI
MOV AH, 02H
MOV DL,’C’
INT 21H
Register
AH=02H
Register AH=’C’
JMP
@coba
Tercetak ‘C'
Label @coba
LOOP
Gambar 52 Diagram alir program #22 (JUMP)
Penjelasan : Program #22 akan melakukan loop
permanen tanpa henti karena perintah JMP selalu
terjalankan dan tidak diberikan kondisi apapun yang
bisa menyeBagiankan perintah JMP terlewati.
113. Indra Gunawan, ST., M.Kom., CEH., CHFI
111
11.3.2 Perulangan Bersyarat
Perulangan bersyarat pada assembly dapat dilakukan
dengan menggunakan dengan perintah LOOP. Perintah
LOOP berhubungan dengan register CX, perulangan
dengan LOOP akan berhenti manakala isi register CX=0,
sehingga untuk menentukan jumlah perulangannya, isi
register CX dengan nilai tertentu. Format penulisan
perintahnya adalah sebagai berikut:
Label:
LOOP Label
Contoh programnya dapat dilihat pada contoh
program #23 dibawah ini.
;Program #23
.MODEL SMALL
ORG 100h
.CODE
MOV CX,03H
@coba:
MOV AH,02H
MOV DL,'C'
INT 21H
LOOP label
115. Indra Gunawan, ST., M.Kom., CEH., CHFI
113
Bagian 12 Stack (Tumpukan)
Stack (tumpukan) adalah komponen yang sangat
penting dalam pemrograman assembly. Jika
dibandingkan dengan bahasa pemrograman tingkat
tinggi maka assembly memiliki perbedaan yang banyak,
perbedaan tersebut yang menyeBagiankan stack sangat
penting dalam pemrograman assembly dan kurang
penting pada pemrograman tingkat tinggi.
Pada pemrograman tingkat tinggi, umumnya nilai
disimpan pada variabel (memori), variabel tersebut dapat
dibuat sebanyak banyaknya sesuai besar memori
komputer sehingga pada pemrograman tingkat tinggi
hampir tidak diperlukan adanya stack.
Lain halnya dengan assembly, pada assembly
nilai tidak hanya disimpan pada variabel (memori) saja,
tetapi juga disimpan pada register (mikroprosesor). Disisi
lain banyaknya general purpose register hanya 8 buah
(AH, AL, BH, BL, CH, CL, DH, DL). General purpose
register ini sifatnya tumpuk timpa, artinya ketika suatu
register diisi nilai, maka nilai yang lama hilang tanpa
bekas. Jika program yang dibuat cukup banyak baris
kodenya dan tanpa STACK maka tentu akan sangat sulit
sekali. Sekarang bayangkan ada sebuah program
assembly menjumlahkan deretan 100 angka sekuensial,
assembly hanya mampu menjumlahkan 2 nilai dalam
satu operasi, maka setiap penjumlahan 2 nilai, hasilnya
harus disimpan untuk dijumlahkan lagi di angka
berikutnya, dan register yang dipakai juga cuma itu-itu
saja, maka disinilah fungsinya STACK yaitu sebagai
media simpan sementara.
STACK terdiri dari dua perintah yaitu PUSH dan
POP. PUSH digunakan untuk menyimpan nilai ke stack
memori, sedang POP digunakan untuk mengambilnya
kembali. Format penulisan perintahnya adalah :
PUSH operand
116. Pemrograman Assembly Mikroprosesor 8086
114
POP operand
Perintah PUSH dan POP hanya dapat digunakan
pada register 16 bit (AX, BX, CX, DX). STACK mampu
menyimpan data sebanyak 2byte x 5 baris. Tumpukan
pada stack memori bersifat LIFO (last in first out),
sehingga perintah PUSH dan POP harus dibalik
urutannya dalam program. Contoh programnya dapat
dilihat pada program #23 dibawah ini.
;Program #23
.MODEL SMALL
ORG 100h
.CODE
MOV AX,01H
MOV BX,02H
MOV CX,03H
MOV DX,04H
PUSH AX
PUSH BX
PUSH CX
PUSH DX
POP DX
POP CX
POP BX
POP AX
117. Indra Gunawan, ST., M.Kom., CEH., CHFI
115
Gambar 54 Diagram alir program #23 (PUSH dan POP).
Penjelasan : Program #23 diatas memperlihatkan bahwa
jika urutan PUSH dan POP tidak dibalik, maka nilai
registernya berbeda dengan kondisi sebelumnya.
118. Pemrograman Assembly Mikroprosesor 8086
116
Bagian 13 Procedure Dan Macro
Procedure dan macro dalam bahasa assembly
ibarat procedure dan function dalam bahasa
pemrograman tingkat tinggi, berbeda nama tetapi
mempunyai fungsi yang mirip.
Procedure dan macro adalah metode pada bahasa
assembly untuk membuat program didalam program
(sub rutin/sub program), keduanya digunakan untuk
memecah program besar menjadi program-program kecil
sehingga program lebih mudah untuk dibaca dan
dipelihara.
Perbedaan procedure dan macro mirip dengan
perbedaan procedure dan function yaitu :
Procedure tidak bisa menerima parameter/variabel dari si
pemanggil (program utama).
Hasil program yang menggunakan procedure lebih kecil
ukurannya.
Hasil program yang menggunakan procedure lebih lambat
aksesnya.
Procedure hanya dapat mengakses 1 segment yang sama.
13.1 Prosedur
Prosedur digunakan ketika diinginkan untuk
memecah-mecah program besar menjadi program-
program kecil yang tidak berorientasi kecepatan akses,
ukuran program kecil dan data yang digunakan kecil dan
sederhana. Jika digunakan procedure maka komunikasi
pertukaran data antara program utama dan procedure
adalah melalui register, stack dan variabel. Format
penulisan perintah procedure adalah sebagai berikut :
119. Indra Gunawan, ST., M.Kom., CEH., CHFI
117
;------------INI PROCEDURE---------
NAMA PROC NEAR
; tulis isi procedure disini
NAMA ENDP
; ----------INI PROGRAM UTAMA------
.MODEL SMALL
ORG 100h
.CODE
CALL NAMA
Berikut ini adalah contoh-contoh program yang
menggunakan procedure.
;Program #24
;Cetak huruf Z
.MODEL SMALL
ORG 100h
.CODE
;########### PROCEDURE
cetak proc near
mov ah,02h
mov dl, 'z'
int 21h
ret
cetak endp
;#### PROCEDURE
call cetak
int 20h
Program #24 diatas dijelaskan dengan gambar 54
dibawah ini.
120. Pemrograman Assembly Mikroprosesor 8086
118
MULAI
CALL
CETAK1
PROCEDURE
CETAK
MOV AH,02H
MOV DL,’Z’
INT 21H
Register
AH=02H
Register
DL=’Z’
Tercetak Z
Gambar 55 Diagram alir program #24 (procedure)
Penjelasan : Perintah pertama yang dibaca assembly
pada program #24 diatas adalah call cetak (program
utama), kemudian melompat ke procedure, setelah
selesai mengerjakan semua baris kode di procedure,
maka melompat kembali ke program utama dan
121. Indra Gunawan, ST., M.Kom., CEH., CHFI
119
mengerjakan perintah INT 20H. Proram #24 diatas
mencetak satu huruf ‘Z’ ke layar.
Program #25 dibawah ini untuk mencetak kata
‘SATU’ melalui variabel.
;Program #25
;Cetak ‘SATU’
.MODEL SMALL
ORG 100h
.CODE
;################## PROCEDURE
cetak1 proc near
mov ah,02h
mov dl, var[0]
int 21h
cetak1 endp
cetak2 proc near
mov ah,02h
mov dl, var[1]
int 21h
cetak2 endp
cetak3 proc near
mov ah,02h
mov dl, var[2]
int 21h
cetak3 endp
cetak4 proc near
mov ah,02h
mov dl, var[3]
int 21h
ret
cetak4 endp
;##### PROGRAM UTAMA ######
call cetak1
call cetak2
122. Pemrograman Assembly Mikroprosesor 8086
120
call cetak3
call cetak4
int 20h
.DATA
var db 'satu'
Program #25 diatas dijelaskan dengan gambar 56
dibawah ini.
Gambar 56 Diagram alir program #25 (procedure)
Penjelasan : Pada program #25 diatas program utama
dieksekusi terlebih dahulu dengan perintah call cetak1,
call cetak2, call cetak3, call cetak4, kemudian setelah
masing-masing procedure menjalankan programnya
123. Indra Gunawan, ST., M.Kom., CEH., CHFI
121
masing-masing selanjutnya kembali ke program utama.
Program #25 diatas mencetak kata ‘SATU’.
13.2 Macro
Macro digunakan ketika diinginkan kondisi untuk
memecah-mecah program menjadi subprogram yang
lebih kecil yang penggunaan datanya komplek dan besar,
ukuran file program lebih besar, kecepatan akses lebih
tinggi. Macro dapat melakukan komunikasi pertukaran
data dengan program utama melalui parameter,
menggunakan register maupun variabel dan stack
memori. Format penulisan perintah procedure adalah
sebagai berikut :
;------------INI MACRO---------
NAMA MACRO param1,param2,param3...dst
; tulis isi macro disini
ENDM
; ----------INI PROGRAM UTAMA------
.MODEL SMALL
ORG 100h
.CODE
NAMA nilai1,nilai2,nilai3
Berikut ini adalah contoh-contoh program yang
menggunakan macro.
;Program #26
;Cetak ‘aku’
;########### MACRO ############
cetak macro x
mov ah,02h
mov dl,x
int 21h
endm
;########### MACRO ############
.MODEL SMALL
ORG 100h
124. Pemrograman Assembly Mikroprosesor 8086
122
.CODE
cetak 'a'
cetak 'k'
cetak 'u'
int 20h
Gambar 57 Diagram alir program #26 (Macro).
Penjelasan : Program berjalan dimulai dari program
utama, memanggil Cetak ‘A’, Cetak ‘k’, Cetak ‘u’. Macro
Cetak menerima parameter ‘A’,’k’,’u’ sebagai variabel x,
variabel x dimasukkan ke register DL kemudian
dilakukan INT 21. Maka tercetak kata ‘Aku’.
;Program #27
125. Indra Gunawan, ST., M.Kom., CEH., CHFI
123
;Macro multi parameter
;################## MACRO
cetak macro x, y, z, a
mov dl, x
int 21h
mov dl, y
int 21h
mov dl, z
int 21h
mov dl, a
int 21h
endm
;################## MACRO
.MODEL SMALL
ORG 100h
.CODE
mov ah,02h
cetak var[0],var[1],var[2], var[3]
int 20h
.DATA
var db 'satu'
126. Pemrograman Assembly Mikroprosesor 8086
124
MULAI
Cetak var[0].var[1],
var[2],var[3]
=
Cetak ‘s’,’a’,’t’,’u’
Cetak
Macro
x,z,y,a
MOV AH,02H
MOV DL,y
INT 21H
Register
AH=02H
Register
DL,x
Tercetak
‘satu’
Variabel var
= ‘satu’
MOV DL,a
MOV DL,z
MOV DL,x
Register
DL,z
Register
DL,y
Register
DL,a
SELESAI
Gambar 58 Diagram alir program #27 (macro).
Penjelasan : Progam #27 dimulai dengan perintah MOV
ah,02H, kemudian memanggil macro cetak dengan
mengirim parameter s,a,t,u. Macro cetak menerima nilai
tersebut dan memasukkan ke register DL, kemudian INT
21 akan mencetak kelayar kata ‘satu’.
127. Indra Gunawan, ST., M.Kom., CEH., CHFI
125
Bagian 14 Operasi Aritmatika
Membahas operasi aritmatika tentu tidak bisa
lepas dari bahasan bilangan. Bagian ini akan diawali
pembahasan tentang 4 jenis bilangan yang mampu
dibaca oleh assembly, kemudian dilanjutkan
pembahasan tentang empat operasi aritmatika yaitu
penambahan, pengurangan, perkalian, pembagian.
14.1 Bilangan
Bahasa assembly mampu membaca berbagai jenis
bilangan yaitu desimal, oktadesimal, heksadesimal, dan
biner. Bagaimana assembly membedakan bilangan-
bilangan tersebut ?, tentu saja pembuat program harus
menuliskan jenis bilangan pada akhir suatu bilangan,
contohnya adalah seperti berikut :
Gambar 59 Menulis bilangan pada assembly.
Penjelasan :
Baris 06. Bilangan biner
Baris 07. Bilangan heksadesimal
Baris 08. Bilangan oktadesimal
Baris 09. Bilangan desimal
128. Pemrograman Assembly Mikroprosesor 8086
126
Perlu diketahui bahwa meskipun pembuat program
dapat memasukkan empat jenis bilangan pada assembly
secara bersama-sama, tetapi data pada register dan
memori akan tampil dalam format heksadesimal,
sehingga jika misalnya pada program dimasukkan angka
dalam format desimal kemudian dilakukan operasi
aritmatika, maka jika ingin dilakukan debugging register
maupun memori untuk melihat hasilnya, harus
dikonversi terlebih dahulu dipikiran angka-angka
tersebut menjadi format heksadesimal sehingga proses
debugging menjadi lebih mudah.
14.1.1 Mencetak bilangan desimal
Mencetak bilangan pada assembly sangatlah
berbeda dengan bahasa pemrograman tingkat tinggi.
Pada bahasa pemrograman tingkat tinggi mencetak
bilangan sama mudahnya dengan mencetak string
maupun mencetak lainnya, semua dilakukan secara
otomatis dibelakang layar tanpa dibutuhkan andil si
pembuat program. Lain halnya pada assembly, semua
dilakukan manual. Tidak ada cara otomatis pada
assembly. Jika ingin dicetak kelayar bilangan desimal
maka dibutuhkan sedikit trik untuk melakukannya.
Semua karakter yang tampil di layar berpatokan pada
tabel ASCII dalam mencetaknya.
Program #28 dibawah ini adalah program untuk
mencetak bilangan desimal.
; Program #28
.MODEL SMALL
ORG 100h
.CODE
; AX = angka yang akan dicetak
MOV AX,angka
; BX = penyebut
MOV BX,10
; CX = 0
XOR CX,CX
129. Indra Gunawan, ST., M.Kom., CEH., CHFI
127
Ulang:
; Cegah sisa bagi menjadi pembilang !
XOR DX,DX
; Bagi angka yang akan dicetak dengan 10
DIV BX
; Simpan sisa bagi dalam stack
PUSH DX
; CX ditambah 1
INC CX
; Apakah hasil bagi sudah habis ?
CMP AX,0
; Jika belum, ulangi lagi !
JNE Ulang
Cetak:
; Ambil 1 angka yang disimpan
POP DX
; Ubah angka tersebut dalam kode ASCII
ADD DL,'0'
; Cetak angka tersebut
MOV AH,02
INT 21h
; ulangi
LOOP Cetak
INT 20h
.DATA
; Angka yang akan dicetak
angka DW 243
130. Pemrograman Assembly Mikroprosesor 8086
128
Gambar 60 Diagram alir program #28 (mencetak desimal)
Penjelasan : Prinsip kerja program #28 diatas adalah.
Jika ingin dicetak nilai x, maka bagi nilai x dengan 10 dengan
operator DIV.
131. Indra Gunawan, ST., M.Kom., CEH., CHFI
129
Sisa dari pembagian tersebut simpan pada STACK.
Bagi terus bilangan x sampai habis.
Jika sudah habis terbagi, ambil angka-angka yang tersimpan pada
STACK secara berurutan.
Tambahkan angka-angka yang telah diambil dari STACK dengan
string ‘0’, kemudian cetak satu persatu sampai isi STACK kosong.
Maksud dari ditambah string ‘0’ adalah untuk mengubah angka
menjadi kode ASCII. Misal angka dari STACK adalah 4 ditambah
string ‘0’ (30H) = 30H+4H=34H (angka 4 desimal).
14.1.2 Mencetak bilangan heksadesimal
Meskipun bilangan heksadesimal adalah bilangan
yang utama pada assembly yaitu bilangan yang tampil
pada saat debugging di memori dan register, namun
mencetaknya ke layar adalah hal lain. Mencetak ke layar
selalu berpatokan dengan tabel ASCII. Program #29
dibawah ini adalah program untuk mencetak angka
heksadesimal.
; Program #29
Cetak MACRO
MOV DL,heksa[BX]
MOV AH,02
INT 21h
ENDM
.MODEL SMALL
ORG 100h
.CODE
; Jadikan BH=0
SUB BH,BH
; BL = angka yang akan dicetak
132. Pemrograman Assembly Mikroprosesor 8086
130
MOV BL,angka
; Simpan angka tersebut
PUSH BX
; Ambil 4 bit tinggi dari +
MOV CL,4
; BL untuk dicetak
SHR BL,CL
; Cetak 1 angka heksadesimal tingginya
Cetak
; Ambil angka yang disimpan
POP BX
; Ambil 4 bit rendah dari +
AND BL,0Fh
; BL untuk dicetak
Cetak
INT 20h
.DATA
Heksa DB '0123456789ABCDEF'
; Angka yang akan dicetak 255=7Bh
angka DB 123d
133. Indra Gunawan, ST., M.Kom., CEH., CHFI
131
Ga
mbar 61 Diagram alir program #29 (mencetak
heksadesimal).
Penjelasan : Prinsip utama program #29 diatas adalah.
134. Pemrograman Assembly Mikroprosesor 8086
132
Membagi bilangan yang ingin dicetak misalnya 7BH dengan 2
digit.
Digit 7 kiri diambil dengan cara menggeser bilangan tersebut 4
kali kekanan, hasilnya simpan dalam BX, BX=07H.
Cetak elemen array variabel heksa ke BX, misalnya cetak
heksa[7]= ‘7’.
Digit B kanan diambil dengan cara melakukan operasi AND 0FH
ke bilangan yang ingin dicetak tersebut. Hasilnya simpan pada
BX.
Cetak elemen array variabel heksa ke BX. Heksa [BX]=heksa
[B]=’B’.
14.2 Operasi Penambahan
Operasi penambahan pada assembly tidak
memerlukan register khusus. Semua general purpose
register boleh digunakan secara bebas. Format penulisan
perintah penambahan adalah :
ADD Operand1, Operand2
ADC Operand1, Operand2
ADD digunakan apabila bilangan yang
dijumlahkan hasilnya sama atau lebih kecil ukurannya
dibanding operand nya. ADC (ADD with CARRY)
digunakan apabila hasil penjumlahan lebih besar dari
ukuran operand nya dengan Operand1 dapat berupa
register atau alamat memori. Operand2 dapat berupa
register, alamat memori atau angka. Hasil penjumlahan
disimpan di operand1. Contoh program penggunaan ADD
dapat dilihat pada program #30 dibawah ini.
; Program #30
.MODEL SMALL
ORG 100h
136. Pemrograman Assembly Mikroprosesor 8086
134
Gambar 62 Diagram alir program #30 (ADD)
Penjelasan : Perintah ADD menyimpan hasil
penjumlahan pada operand kiri. Operand kanan dapat
berupa register, memori maupun angka.
137. Indra Gunawan, ST., M.Kom., CEH., CHFI
135
14.3 Operasi Pengurangan
Operasi pengurangan juga dapat menggunakan
general purpose register secara bebas. Format penulisan
perintahnya adalah :
SUB Operand1, Operand2
SBB Operand1, Operand2
SUB digunakan apabila bilangan yang dikurangkan
hasilnya sama atau lebih kecil ukurannya dibanding
operand nya. SBB (SUBSTRACT with CARRY) digunakan
apabila hasil pengurangan lebih besar dari ukuran
operand nya. dengan Operand1 dapat berupa register
atau alamat memori. Operand2 dapat berupa register,
alamat memori atau angka. Hasil penjumlahan disimpan
di operand1. Contoh program penggunaan SUB dapat
dilihat pada program #31 dibawah ini.
138. Pemrograman Assembly Mikroprosesor 8086
136
Gambar 63 Diagram alir program #31 (SUB).
Penjelasan : Perintah SUB menyimpan hasil
pengurangan pada operand kiri. Operand kanan dapat
berupa register, memori maupun angka.
139. Indra Gunawan, ST., M.Kom., CEH., CHFI
137
14.4 Operasi Perkalian
Operasi perkalian memiliki beberapa format
penggunaan register dan hasilnya secara khusus.
Operasi perkalian menggunakan perintah MUL, perintah
ini hanya memerlukan satu operand saja. Format
penulisan perintahnya adalah sebagai berikut.
MUL Operand2
Operasi MUL memiliki aturan sebagai berikut :
MUL Operand2=Operand1 x Operand2
Register AX adalah operand1. Isilah register AX dengan angka
yang ingin dikalikan.
Isilah Operand2 dengan angka yang ingin dikalikan.
Operand2 dapat berupa register, memori maupun angka.
Contoh penggunaan perintah MUL dapat dilihat pada
program #32 dibawah ini.
; Program #32
.MODEL SMALL
ORG 100h
.CODE
MOV AL,05H
MOV DL,02H
MUL DL
MOV AL,angka1
MOV CL,angka2
MUL CL
.DATA
angka1 DB 123d
angka2 DB 54H
140. Pemrograman Assembly Mikroprosesor 8086
138
Gambar 64 Diagram alir program #32 (MUL).
Penjelasan : Register AX menampung hasil perkalian,
jika tidak cukup, akan digunakan AX dan DX.
14.5 Operasi Pembagian
Operasi pembagian memiliki beberapa format
penggunaan register dan hasilnya secara khusus.
Operasi pembagian menggunakan perintah DIV, perintah
ini hanya memerlukan satu operand saja. Format
penulisan perintahnya adalah sebagai berikut.
DIV Operand2
141. Indra Gunawan, ST., M.Kom., CEH., CHFI
139
Operasi DIV memiliki aturan sebagai berikut :
DIV Operand2=Operand1 / Operand2
Register AX adalah operand1. Isilah register AX dengan angka
yang ingin dibagi.
Isilah Operand2 dengan angka yang ingin dibagi.
Operand2 dapat berupa register, memori maupun angka.
Contoh penggunaan perintah DIV dapat dilihat pada
program #33 dibawah ini.
; Program #33
.MODEL SMALL
ORG 100h
.CODE
MOV AL,06H
MOV DL,02H
DIV DL
MOV AL,angka1
MOV CL,angka2
DIV CL
.DATA
angka1 DB 99d
angka2 DB 3H
142. Pemrograman Assembly Mikroprosesor 8086
140
MULAI
MOV AL,06H MOV DL,02H
DIV DL
=
AL / DL
AL=03H
MOV AL,angka1 MOV CL,angka2
Variabel angka1
=
99d
Variabel angka1
=
3H
DIV CL
=
AL / CL
AX=21H
SELESAI
Gambar 65 Diagram alir program #33 (DIV).
Penjelasan : Register AX menampung hasil pembagian,
jika tidak cukup, akan digunakan AX dan DX.
143. Indra Gunawan, ST., M.Kom., CEH., CHFI
141
Bagian 15 Operasi File
Operasi file dalam bahasa assembly melibatkan
interrupt 21H. Service yang dipakai adalah AH=3Fh
untuk membaca file, AH=41H untuk menghapus file,
AH=40H untuk menulis file, AH=3EH untuk menutup
file. Beberapa variabel yang harus dibuat untuk
menggunakan interrupt ini yaitu :
Variabel untuk menampung nama file.
Variabel untuk menampung isi file.
Variabel untuk menampung text yang akan diinputkan.
Pada emulator emu8086 dengan konfigurasi default maka
file akan terbuat pada direktori :
‘C:emu8086MyBuild’
Atribut file ada 5, atribut ini berupa angka heksadesimal
yang harus diisikan ke register CX. Mode-mode itu
adalah sebagai berikut.
0H : Read only.
01H : Hidden.
02H : File system.
03H : Volume label.
04H :Nama Subdirektori.
05H : File archive.
Program untuk membuat file dapat dilihat pada
program #34 dibawah ini.
Buat MACRO namafile, atribut, tampungan
PUSH CX
PUSH DX
MOV AH,3Ch
144. Pemrograman Assembly Mikroprosesor 8086
142
MOV CX,atribut
LEA DX,namafile
INT 21h
MOV tampungan,AX
POP DX
POP CX
ENDM
;Program #34
.MODEL SMALL
ORG 100H
.CODE
Buat namafile,0h,tampungan
INT 20H
.DATA
namafile db "file.txt", 0
tampungan dw ?
text DB 'Uji coba'
145. Indra Gunawan, ST., M.Kom., CEH., CHFI
143
Ga
mbar 66 Diagram alir program #34 (Buat file)
Penjelasan :
Variabel namafile untuk menampung nama file yang diakhiri
karakter 0.