Anda di halaman 1dari 32

BAB I

PENGENALAN BAHASA MESIN & BAHASA ASSEMBLY


Bahasa Mesin
Setiap jenis CPU memiliki bahasa mesin-nya masing-masing. Instruksi bahasa mesin
dinyatakan dalam bilangan numeric (Binari) yang tersimpan sebagai byte dimemori. Masingmasing instruksi memiliki kode numerik yang unik yang disebut sebagai operation code
atau opcode. Setiap perintah diawali dengan suatu opcode dan dapat diikuti oleh data.

Bahasa Assembly
Karena Bahasa Mesin sangat rumit untuk diprogram secara langsung (karena berupa
bilangan numeric), sehingga dibuat suatu symbol pelambang (mnemonic) untuk mewakili
masing-masing instruksi tersebut yang lebih mudah diingat dan dibaca oleh manusia
(bayangkan apakah anda lebih mudah mengingat nama teman anda atau nomor telepon
rumahnya?).

Apa itu Assembler


Sebagaimana dijelaskan sebelumnya bahwa bahasa Assembly menggunakan
mnemonic sebagai penganti bagi instruksi bahasa Mesin, sehingga program yang ditulis
dalam bahasa Assembly tidak dapat secara langsung dieksekusi oleh CPU. Dalam hal ini
Assembler berperan untuk menterjemahkan mnemonic tersebut menjadi bahasa Mesin yang
dapat dieksekusi oleh CPU. Untuk melakukan assembler dapat menggunakan program
DEBUG.EXE maupu berbagai aplikasi compiler seperti TASM, MASM, NASM, FASM
maupun emulator8086.

Apa itu disassembler


Jika proses Assembler menterjemahkan program yang ditulis dengan bahasa
Assembly menjadi bahasa mesin, maka proses disassembler adalah mengembalikan suatu
binary program menjadi (mnemonic) bahasa Assembly. Tujuan dari disassembler adalah
untuk keperluaan reversed engineering, dimana kita mempelajari maupun memperbaiki suatu
software tanpa memiliki source code, misalnya untuk mempelajari teknik penyerangan suatu
program malware untuk dibuat anti malwarenya, ataupun memeriksa kemungkinan suatu
program terdapat payload.

Mengapa belajar Assembly


Dewasa ini adalah tidak relevan lagi membuat buat suatu program yang secara
keseluruhan ditulis dengan bahasa assembly. Assembly biasanya digunakan untuk rutinrutin
penting tertentu. Mengapa? Karena adalah lebih mudah memprogram dengan menggunakan
bahasa tingkat tinggi dari pada menggunakan assembly. Pemakaian assembly akan
mengakibatkan program sulit untuk dialihkan ke platform yang berbeda (ingat bahwa
masing-masing CPU memiliki bahasa Mesin yang berbeda), dan berikut ini adalah alasan
mengapa anda mempelajari bahasa Assembly :
1. Program yang ditulis dengan assembly akan lebih cepat dan lebih kecil
dibandingkan dengan kode yang dihasilkan dengan menggunakan compiler.
2. Assembly memungkinkan akses langsung ke fasilitas system hardware yang
mungkin tidak dapat dilakukan dengan menggunakan bahasa tingkat tinggi
(membaca/menulis data langsung ke sector, memformat harddisk).

Muhammad Taqiyyuddin Alawiy, ST., MT

3. Mempelajari assembly akan membantu pengertian yang lebih mendalam


bagaimana computer bekerja.
4. Mempelajari pemrograman assembly akan membantu pengertian yang lebih baik
tentang bagaimana compiler dan bahasa tingkat tinggi seperti C bekerja.
5. Dengan mengerti bahasa Assembly anda dapat melakukan proses disassembly
untuk menganalisa program tertentu.

Latihan :
Topik: Memahami bahasa mesin dan bahasa assembly, serta
register dengan program Debug.Exe
Debug merupakan program yang tersedia sejak DOS untuk IBM PC, utility ini cukup
bermanfaat dan merupakan suatu keharusan bagi programmer assembler. Debug bekerja pada
level bahasa mesin, dan memiliki kemampuan disassembler serta melakukan assembler
instruksi (mnemonic) secara langsung ke bahasa mesin.

Mengaktifkan program Debug


1. Aktifkan MS-DOS Prompt (Start, All Programs, Command Prompt
2. Ubah keaktifkan ke folder anda
C:\> E:
E:\> CD \920403024\ASM
E:\920403024\ASM>
3. Ketikan perintah Debug.exe untuk mengaktifkan program Debug
E:\920403024\ASM>Debug.exe

Tanda keaktifan program Debug


Tanda keaktifan anda dalam program Debug ditandai dengan sebuah prompt (-), pada tanda
prompt inilah anda mengetikan perintah debug.

Menampilkan tanggal BIOS Revision


Pada computer IBM PC Compatible menyimpan BIOS Revision Date pada alamatn
FFFF:0005, sehingga anda dapat menggunakan perintah D (Display untuk menampilkan isi
pada alamat tersebut diatas.
Pada tanda prompt (-) ketikan D FFFF:0005

Pada gambar diatas dapat dijelaskan bahwa pada sisi kiri ditampilkan alamat dari memori
yang ditampilkan dalam format Segment (FFFF) dan Offset (0000), pada bagian tengah
adalah representasi isi memori pada masing-masing alamat dalam format hexadesimal,

Muhammad Taqiyyuddin Alawiy, ST., MT

kemudian pada bagian kanan adalah representasi isi memori dalam format ASCII (sesuatu hal
yang perlu diperhatikan adalah tidak semua karakter ASCII dapat diprint dilayar, untuk
karakter ASCII yang tidak dapat di print dilayar ditampilkan sebagai titik (.).

Menampilkan isi register


Dalam pemrograman ASM, kita akan banyak berinteraksi dengan Register untuk
berbagai proses pengolahan oleh CPU, misalnya penjumlahan, pengurangi, perkalian,
pembagian, sampai kepada operasi logika dan bit.
Untuk menampilkan isi Register dapat menggunakan perintah R (Register)
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC
0B40:0100 730B JNB 010D
Pada gambar diatas dapat dijelaskan bahwa nilai register AX adalah 0000, nilai register
BX adalah 0000, dan seterusnya. Kemudian register CS:IP menunjuk kelokasi
0B40:0010, dan isi memori lokasi yang ditunjuk adalah 730B (opcode bahasa mesin)
yang direpresentasikan oleh JNB 010D (mnemonic bahasa assembly).
Kemudian juga ditampilkan status dari register Flag sebagai berikut:
FLAG NAME------------SET----------------CLEAR
Overflow------------------ov-------------------nv
Direction------------------dn-------------------up (increment)
Interrupt-------------------ei (enabled)-----di (disabled)
Sign------------------------ng (neg)-----------pl (positive)
Zero------------------------zr--------------------nz
Auxiliary carry-----------ac--------------------na
Parity-----------------------pe (even)---------po (odd)
Carry-----------------------cy-------------------nc

Trap flag (TF) tidak ditampilkan.

Mengubah nilai register


Pada beberapa perintah debug membutuhkan perubahan nilai register didalam
operasinya, contohnya kita ingin menyimpan hasil pengetikan ke disk, maka perlu melakukan
perubahan terhadap nilai register CX untuk menunjukan berapa byte data yang akan di tulis
ke disk.
Perubahan
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC
0B40:0100 730B JNB 010D
-RAX
AX 0000
:1234
-R
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC
0B40:0100 730B JNB 010D

Catatan:
Untuk menganti isi dari register flag dapat dilakukan dengan mengetikan perintah RF
(Register Flag), kemudian ketikan state dari flag yang mau diganti misalnya DN EI CY.

Muhammad Taqiyyuddin Alawiy, ST., MT

Program bahasa mesin anda yang pertama


Agar anda dapat lebih memahami perbedaan antara bahasa mesin dengan bahasa
assembly, maka berikut ini kita akan membuat sebuah program yang menampilkan pesan
hello world!.
Bahasa mesin dalam bentuk representasi hexadesimal
EB 10
68 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0D 0A 24
B4 09
BA 02 01
CD 21
B4 4C
CD 21
Cara mengetikan bahasa mesin diatas :
a. aktifkan program Debug
b. ketik E 100 <enter> (E=Enter)
c. ketik bilangan hexadecimal diatas diikuti dengan spasi, misalnya EB <spasi> 10
<spasi> 68 <spasi> dan seterusnya sampai selesai dan diakhiri dengan <enter>
d. ketik RCX <enter>, kemudian ketik 1D.
e. ketik N hello.com <enter> (N = Name)
f. akhiri dengan perintah W (Write)
g. ketikan U 100 (U=Unassembler)
h. ketikan D 100 (D=Display)
i. keluar dari program Debug dengan perintah Q (Quit).

Muhammad Taqiyyuddin Alawiy, ST., MT

Bab 2
Pemrograman 8086
Pemrograman 8086 merupakan dasar dari pemrograman untuk processor seri 80x86,
dan seterusnya. Perintah Debug mensimulasikan lingkungan 8086 merupakan tools yang
tersedia sejak DOS versi 2.0

Pengalamatan 8086
Pengalamatan memori pada 8086 adalah terbagi atas segment-segment. Suatu alamat
direpresentasikan dalam dua bagian yaitu segment dan offset yang masing-masing merupakan
alamat 16-bit unsigned. Karena Offset merupakan pengalamatan 16-bit, maka jangkauan
masing-masing offset dalam segment adalah 64 Kb (64 x 1024).Contoh:
FFFF:0005
dimana FFFF adalah segment, dan 0005 adalah offset.
Secara fisik, pengalamatan 8086 menggunakan pengalamatan 20-bit, sehingga untuk
mendapat alamat fisik, angka pada Segment digeser sebesar 8 bit ke kiri, dan kemudian
dijumlahkan kembali ke offset, sehingga FFFF:0005 merepresentasikan alamat fisik FFFF5,
yaitu FFFF0+0005 = FFFF5.

Data pada 8086


Pada pemrograman 8086 kita bekerja dengan data 16-bit yang disebut sebagai word
atau dua byte (8-bit). Satu word disimpan didalam memori dengan urutan low byte terlebih
dahulu dan diikuti dengan high byte, contoh misalnya kita ingin menyimpan $1234
(hexadesimal), maka pada memori akan tersimpan $34 diikuti dengan $12, hal ini sejalan
untuk proses increment pada IP (instruction pointer) yang mengakses low byte terlebih
dahulu.

Bilangan Signed dan Unsigned


CPU bekerja dengan data biner dan menggunakan bit tertentu sebagai tanda untuk
bilangan, sebagai contoh data byte 8-bit dapat merepresentasikan 256 jenis objek yang
berbeda. Pada bilangan unsigned (tidak bertanda) maka jangkauan nilai yang dapat dicapai
adalah 0 s/d 255, sedangkan untuk bilangan yang sign(bertanda) kita dapat merepresentasikan
nilai negatif -128 s/d -1, dan bilangan positif 0 s/d 127, sedangkan kalau dengan data word
16-bit dapat menjangkau -32,768 s/d 32,767, dan dengan data double word (dword) 32-bit
dapat menjangkau -2,147,483,648 s/d 2,147,483,647, sehingga secara umum n-bit dapat
menjangkau nilai -2n-1 s/d 2n-1-1.
Sekarang kita telah mengerti bagaimana jangkauan representasi data bertanda, tetapi
bagaimana caranya kerjanya pada CPU 8086. CPU 8086 menggunakan notasi two's
complement (komplemen dua). Pada sistem komplemen dua most significant bit (MSB)
digunakan sebagai sign bit (bit tanda). Jika MSB adalah nol, bilangan tersebut adalah positif,
dan jika MSB adalah satu, maka bilangan adalah negatif. Representasi bilanganbertanda
untuk 8-bit adalah sebagai berikut.
Untuk mengkonversi suatu bilangan positif, menjadi bilangan negatif komplemen dua
dilakukan dengan cara sebagai berikut:
1. Invers semua bit pada bilangan (aplikasikan operasi NOT)
2. Tambah satu pada hasil Invers (aplikasikan operasi INC)
Contoh:

Muhammad Taqiyyuddin Alawiy, ST., MT

not 00000001
11111110 + 1
-----------11111111 (komplemen dua dari satu)

Konversi bilangan positif ke negatif dan sebaliknya pada 8086 dapat menggunakan
perintah NEG.

Proses eksekusi
Processor mengambil perintah yang akan dieksekusi dari memori berdasarkan alamat
yang ditunjuk oleh register CS (Code Segment) dan IP (Instruction Pointer). Pada sistim
operasi DOS, suatu program COM akan ditempatkan mulai dari offset $100. Nilai dari
register IP maupun CS akan berubah sesuai dengan perubahan titik eksekusi oleh processor.
Perubahan nilai CS:IP dapat dipengaruhi oleh perintah seperti JMP dan LOOP. Sesuatu yang
perlu diperhatikan pada program COM adalah data dan kode terganbung pada segment yang
sama, sehingga kita perlu menggunakan perintah JMP untuk melewati data, ataupun data
ditempatkan dibawah kode.

Register 8086
Semua register pada 8086 adalah 16-bit, yang dapat dibagi menjadi low byte dan high
byte. Ada empat register general purpose yaitu AX, BX, CX, dan DX, masing-masing
register tersebut dibagi menjadi AL, AH, BL, BH, CL, CH, dan DL, DH. Register AX
dikenal sebagai accumulator untuk hasil artimatika, register BX sering digunakan untuk
menyimpan alamat base, register CX sering digunakan untuk counter pada proses perulangan,
sedangkan register DX sering untuk pengalamatan I/O dan data. Selain register generalpurpose, terdapat juga index register yaitu SI (source index) dan DI (destination index) yang
umumnya digunakan untuk pengalamatan dan operasi string. Kemudian terdapat register
untuk pengelolaan data terkait dengan stack yaitu SP (Stack Pointer, BP (Base Pointer) dan
SS (Stack Segment). Untuk pengelolaan data dapat menggunakan DS (Data Segment) dan ES
(Extra Segment). Selain register tersebut diatas, pada 8086 terdapat sebuah register special
yaitu register Flag yang menunjukan status yang dihasilkan dari hasil eksekusi dari suatu
instruksi atau operasi kendali lainnya.
Ada enam flag sebagai flag status yaitu AF, CF, OF, SF, PF dan ZF, dan tiga sisanya
adalah flag kendali yaitu DF, IF dan TF
Penjelasan dari masing-masing flag adalah sebagai berikut:
AF (auxiliary flag), flag ini di set ketika terjadi carry out atau borrow pada 4 bit
LSB. Flag ini digunakan pada saat instruksi logika dan aritmetika.
CF (carry flag), flag ini diset ketika terjadi carry out atau overflow pada MSB. Ini
digunakan oleh instruksi yang melakukan penjumlahan (ADC) dan pengurangan
(SBB) angka banyak byte.
OF (overflow flag), flag ini diset ketika suatu overflow aritmatika terjadi, dimana
terjadi kehilangan pada digit MSB karena ukuran dari hasil melebihi kapasitas
dari lokasi tujuan penampungan.
SF (sign flag), karena bilangan binari negatif direpresentasikan pada 8086 dalam
bentuk notasi komplemen dua. SF mengindikasikan sign dari hasil (0 = positif, 1
= negatif).
PF (parity flag), flag ini diset ketika hasil adalah parity even, flag ini dapat
digunakan untuk mengecek kesalahan transmisi.
ZF (zero flag), flag ini diset ketika hasil operasi adalah 0, digunakan untuk
sebagai hasil aritmatika dan perbadingan data.

Muhammad Taqiyyuddin Alawiy, ST., MT

DF (direction flag). Jika DF diset menyebabkan instruksi string melakukan autodecrement


(hitungan mundur), dalam hal ini proses dari string dari alamat yang
besar ke alamat yang kecil, atau dari kanan ke kiri. Jika nilai DF diclear menyebabkan
instruksi string ke auto-increment (count up), atau proses string dari
kiri ke kanan.
IF (interrupt-enable flag), jika nilai IF di set, artinya memperbolehkan MPU untuk
menangani eksternal maskable interrupt request. Jika nilai IF di clear artinya
MPU mengabaikan interrupt jenis tersebut. IF tidak ada efek terhadap nonmaskable
interrupt (NMI) dan internal generated interrupt.
TF (trap flag), setting TF menempatkan processor pada modus single-step untuk
debugging. Pada modus ini MPU secara otomatis membuat suatu internal
interrupt setelah setiap instruksi.

Stack
Suatu stack adalah suatu bagian dari memori yang disisihkan untuk menyimpan alamat dan
data ketika suatu subrutin dijalankan maupun terjadinya interrupt. Pada MPU 8086, suatu 64
Kb segment dicadangkan sebagai stack. 16 bit alamat awal segment disimpan pada register
Stack Segment (SS), dan register Stack Pointer (SP) mengandung 16-bit offset dimulai dari
awal segment ke lokasi memori dimana suatu word yang paling akhir disimpan ke Stack.
Gambar tersebut diatas dapat dijelaskan bahwa SS=$5000, dan SP=$FFE0, alamat fisik dari
Top of the stack saat ini adalah $5FFE0.

Instruksi 8086
Suatu instruksi pada 8086 dapat terdiri dari satu sampai enam byte, ditambah dengan byte
opsional pengendali segment.
machine code :
xxxxxxdw|[mdregr/m]|[xxxxxxxx[xxxxxxxx]]|[xxxxxxxx[xxxxxxxx]]
opcode |mdr/m byte| disp 1 / 2 bytes |imm. data 1 / 2 bytes

Contoh:
JMP unconditional jump
direct within segment 11101001 disp16bit
direct within segment-short 11101011 disp8bit
indirect within segment 11111111 md100r/m
direct intersegment 11101010 offset:seg32bit
indirect intersegment 11111111 md101r/m
MOV move data
register/mem. to/from register 100010dw mdregr/m
immediate to reg./mem. 1100011w md000r/m data8/16bit
immediate to register 1011wreg data8/16bit
mem. to accu (AX/AL) 1010000w address16bit
accu to mem. (AX/AL) 1010001w address16bit
reg./mem. to segm. reg. 10001110 md0srr/m
segm. reg. to reg./mem. 10001100 md0srr/m

INT interrupt
type specified 11001101 type8bit
type 3 11001100

Muhammad Taqiyyuddin Alawiy, ST., MT

Opcode Byte
Setiap byte pertama dari instruksi adalah byte opcode, yang menspesifikasikan
operasi yang akan dilakukan. Jika ada data yang harus ditangani, maka byte kedua adalah
byte pengalamatan, jika ada pemindahan (displacement) atau data lain diperlukan, maka akan
ditambahkan pada byte berikutnya. Opcode dari suatu instruksi transfer data, dapat dibagi
menjadi tiga bagian opcode, bit d, dan bit w. bit d menspesifikasikan bit direction, bit w
adalah menspesifikan ukuran w =0 adalah operasi 8 bit, dan w = 1 adalah operasi 16 bit.
Opcode untuk instruksi yang tidak memanipulasi data tidak memiliki bit d atau w.
Sebagai contoh, instruksi untuk duplikasi data dari memori ke register, dari register ke
memori, atau dari register ke register memiliki opcode 1000 10dw

Byte Pengalamatan
Byte kedua memspesifikasikan modus pengalamatan, byte ini dalam bentuk
mdregr/m. Bit md memspesifikasikan interpretasi dari bit r/m, dan memberikan jumlah dari
byte pemindahan yang harus dilakukan, dan bit reg mespesifikasikan register.
r/m mem w=0 w=1
000 BX+SI AL AX
001 BX+DI CL CX
010 BP+SI DL DX
011 BP+DI BL BX
100 SI AH SP
101 DI CH BP
110 ABS DH SI
111 BX BH DI
Jenis register yang dispesifikasikan tergantung kepada bit w. Berdasarkan tabel diatas untuk
nilai r/m=000 dapat menspesifikasikan register AL untuk w=0, dan register AX untuk w=1.
Jika bit d=0, maka source adalah reg dan destination adalah r/m, dan jika d =1, maka source
adalah r/m dan destination adalah reg.
Jika bit md=11, maka bit r/m juga mengacu kepada suatu register, dengan
menggunakan kode yang sama untuk reg. Jika bit md=00, maka referensi memori adalah
pada kolom kedua dari tabel, dan tidak ada byte perpindahan, kecuali untuk kasus r/m = 110
(absolute), ketika suatu offset 16-bit
dispesifikasikan pada dua byte berikutnya. Secara default hal ini relatif terhadap register
segment DS.
Jika bit md=01, maka merupakan offset 8 bit.
Jika bit md=10, maka merupakan offset 16 bit.
Contoh:
EB 10
68 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0D 0A 24
B4 09
BA 02 01
CD 21
B4 4C
CD 21
JMP unconditional jump
direct within segment 11101001 disp16bit
direct within segment-short 11101011 disp8bit
indirect within segment 11111111 md100r/m
direct intersegment 11101010 offset:seg32bit
indirect intersegment 11111111 md101r/m

Muhammad Taqiyyuddin Alawiy, ST., MT

EB 10
EB = 11101011 = JMP
jadi EB 10 adalah JMP 10 dalam hal ini adalah melakukan jump sebanyak 16 byte
kedepan.
68 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0d 0A 24
dalam hal ini adalah
Hello World !, 0d,0a, $
yaitu pesan Hello World ! diikuti dengan CR, dan LF, dan $ yang merupakan end of
string yang secara total adalah 16 byte atau $10.
B4 09
MOV move data
register/mem. to/from register 100010dw mdregr/m
immediate to reg./mem. 1100011w md000r/m data8/16bi
immediate to register 1011wreg data8/16bit
mem. to accu (AX/AL) 1010000w address16bit
accu to mem. (AX/AL) 1010001w address16bit
reg./mem. to segm. reg. 10001110 md0srr/m
segm. reg. to reg./mem. 10001100 md0srr/m

B4 = 10110100
dimana w = 0, dan reg = 100, untuk reg = 100 dan w = 0 adalah AL
jadi perintah B4 09 adalah MOV AH, 9
BA 02 01
BA = 10111010
dimana w = 1, dan reg = 010, untuk reg = 010 dan w = 1 adalah DX
02 01 adalah word $102 dengan low byte adalah 02 dan high byte adalah 01
jadi perintah BA 02 01 adalah MOV DX, 102
CD 21
INT interrupt
type specified 11001101 type8bit
type 3 11001100

CD = 11001101
Jadi CD 21 adalah INT 21
B4 4C adalah MOV AH, 4C
CD 21 adalah INT 21

Latihan
1. Buatlah program bahasa mesin untuk program assembly berikut ini :
JMP
Selamat Belajar Assembly, CR, LF, $
MOV AH, 9
MOV DX, 102
INT 21
MOV AH, 4C
INT 21
2. Buatlah program bahasa mesin yang dapat menampikan nama dan nim anda
dengan dua kali cetak.

Muhammad Taqiyyuddin Alawiy, ST., MT

1. Ujilah program bahasa mesin anda dengan menggunakan program debug.

Bab 3
Bahasa rakitan x86
Pada bagian sebelumnya kita telah membahas tentang pemrograman 8086 dengan
menggunakan bahasa mesin, dan pada bagian ini kita akan membahas tentangm
pemrograman x86 Assembly.

Mnemonic dan Opcode


Setiap perintah assembly x86 direpresentasikan dengan suatu mnemonic yang mana
merupakan kombinasi dari satu atau lebih operand, dan diterjemahkan menjadi satu atau lebih
byte yang disebut sebagai opcode, misalnya perintah INT 21 diterjemahkan menjadi CD 21.

Assembler
Setiap program yang ditulis dengan menggunakan perintah assembly tidak dapat
secara langsung dieksekusi oleh mesin, tetapi membutuhkan proses Assembly menggunakan
software Assembler. Software Assembler yang paling sederhana adalah dengan
menggunakan Debug.exe, dan untuk program yang lebih besar dan kompleks, tentu saja
pemakaian Debug.exe tidak memadai, sehingga anda dapat menggunakan program assember
seperti TASM, MASM, dan NASM.

Assembler pada Debug


Untuk pembuatan program assembly dengan Debug dapat dilakukan dengan
menggunakan perintah A (Assembly), adapun keterbatasan pada program Debug adalah
hanya dapat membuat program COM, dan setiap program COM harus ditempatkan mulai dari
lokasi memori $100.
Contoh:
-a 100
0B40:0100 jmp 112
0B40:0102 db 'Hello World !',0d,0a,'$'
0B40:0112 mov ah,9
0B40:0114 mov dx,102
0B40:0117 int 21
0B40:0119 mov ah,4c
0B40:011B int 21

10

Muhammad Taqiyyuddin Alawiy, ST., MT

0B40:011D
-n helloasm.com
-h 11D 100
021D 001D
-rcx
CX 0000
:1d
-w
Writing 0001D bytes
Proses diatas dapat dijelaskan bahwa pada awalnya kita memberikan perintah A
(Assembler), dimana hasil assembler ditempatkan pada lokasi memori $100, kemudian kita
mengetikan perintah-perintah dalam bahasa assembly (mnemonic), kemudian dilanjutkan
dengan menyimpan hasil assembler ke suatu file helloasm.com, dan melakukan penulisan
sebanyak $1d byte dengan merubah nilai register CX, dan diakhiri dengan perintah w.
Nilai $1d diperoleh dengan mengurangkan $11d dengan $100, proses Hexa arithmetic
(fasilitas kalkulator pada DEBUG) dapat menggunakan perintah h11D 100, dan akan
ditampilkan hasil penjumlahan ($21d) dan hasil pengurangan ($1d).
-h 11D 100
021D 001D

UnAssembler pada Debug


Program hasil assembler dapat di UnAssember dengan memberikan perintah U
(UnAssembler) yang diikuti dengan lokasi memori bahasa mesin yang akan di
UnAssembler.
Contoh:
D:\920403024\ASM>debug helloasm.com
-u 100
0BB0:0100 EB10 JMP 0112
0BB0:0102 48 DEC AX ;Hello World
0BB0:0103 65 DB 65
0BB0:0104 6C DB 6C
0BB0:0105 6C DB 6C
0BB0:0106 6F DB 6F
0BB0:0107 20576F AND [BX+6F],DL
0BB0:010A 726C JB 0178
0BB0:010C 64 DB 64
0BB0:010D 2021 AND [BX+DI],AH
0BB0:010F 0D0A24 OR AX,240A ;CR, LF, '$'
0BB0:0112 B409 MOV AH,09
0BB0:0114 BA1201 MOV DX,0102
0BB0:0117 CD21 INT 21
0BB0:0119 B44C MOV AH,4C
0BB0:011B CD21 INT 21 ;exit to DOS

Pada sisi kolom pertama adalah alamat memori yang masing instruksi mesin, pada kolom
kedua adalah opcode dari masing-masing perintah, pada kolom terakhir adalah bahasa
assembly.

Latihan
1. Buatlah program dalam bahasa assembly yang dapat mencetak Belajar Bahasa
Assembly !.

11

Muhammad Taqiyyuddin Alawiy, ST., MT

2. Buatlah program assembly berikut ini :


-a 100
0BB0:0100 jmp 127
0BB0:0102 db 'Selamat belajar program assembly !',0d,0a,'$'
0BB0:0127 mov cx,5
0BB0:012A mov ah,9
0BB0:012C mov dx,102
0BB0:012F int 21
0BB0:0131 loop 12a
0BB0:0133 mov ah,4c
0BB0:0135 int 21
0BB0:0137 mov ah,4c
0BB0:0139
3. Modifikasi program tersebut diatas untuk mencetak pesan selamat belajar
program assembly menjadi 20 baris.
4. Cobalah program Caps_On berikut ini :
mov ax,0040
mov ds,ax
or byte ptr [0017],40
mov ah,1
int 16
mov ax,4c00
int 21

5. Cobalah program Caps_Off berikut ini :


mov ax,0040
mov ds,ax
and byte ptr [0017],bf
mov ah,1
int 16
mov ax,4c00
int 21

12

Muhammad Taqiyyuddin Alawiy, ST., MT

Bab 4
Interrupt dan Pemakaiannya
Kadang-kadang proses dalam CPU mengalami interrupsi untuk kejadian-kejadian
yang perlu segera mendapat respon, seperti pengetikan pada keyboard, proses I/O lainnya,
dan clock tick untuk mengupdate waktu system. Pada prinsipnya interrupt terbagi atas
eksternal, dan internal. Eksternal interrupt dibangkitkan oleh proses diluar program seperti
proses I/O, dan clock, sedangkan proses Internal interrupt dibangkitkan oleh proses program
seperti devide for zero error (Traps interrupt) dan Software interrupt (dibangkitkan dengan
perintah INT).
Ketika suatu interrupt terjadi, processor akan menyelesaikan siklus memori saat ini,
dan bercabang kepada rutin khusus menanggani interrupt tersebut, status dari program saat
ini akan disimpan dan rutin interrupt handle umumnya akan mengembalikan kendali ke
program termasuk semua nilai register seakan-akan tidak pernah terjadi sesuatu (hanya
kehilangan beberapa siklus CPU), sedangkan Traps interrupt tidak akan kembali ke program
dan menghentikan program tersebut.
Catatan : Pada bagian ini kita akan lebih memfokuskan diri pada Software interrupt

Maskable Interrupt
Processor dapat mencegah interrupt dengan menggunakan mask bit khusus interrupt.
Mask bit ini adalah bagian dari flag register pada microprocessor 8086 yang dikenal sebagai
interrupt flag (IF), jika bit ini clear (IF=0), dan terjadi permintaan interrupt pada pin Interrupt
Request, maka permintaan tersebut akan
diabaikan.

Non-Maskable Interrupt (NMI)


Ada beberapa interrupt yang mana tidak dapat di mask atau diabaikan oleh processor,
hal ini terkait dengan tugas-tugas prioritas tinggi yang tidak boleh diabaikan (seperti terjadi
pariti pada memori atau kegagalan BUS). NMI memiliki prioritas yang absolut, dan ketika itu
terjadi, processor menyelesaikan siklus memori saat ini, dan kemudian bercabang ke rutin
khusus yang ditulis untuk menangani permintaan interrupt.

Interrupt pada 8086


Adapun urutan dari proses interrupt pada microprocessor 8086 dapat dijelaskan
sebagai berikut:
1. Interface eksternal mengirim suatu sinyal interrupt ke pin Interrupt Request
INTR), atau suatu internal interrupt terjadi.
2. CPU menyelesaikan instruksi yang berlangsung dan mengirim (untuk suatu
hardware interrupt) dan mengirim Interrupt Acknowledge (INTA) ke interface
hardware.
3. Interrupt jenis N (masing-masing interrupt memiliki nomor) dikirim ke Central
Processing Unit (CPU) melalui data bus dari interface hardware.
4. Isi dari register flag didorong ke stack.
5. Flag interrupt (IF) dan trap (TF) di clear, hal ini akan mencegah pin INTR dan
kemampuan single-step untuk proses debugging (trap)
6. Isi dari register CS didorong ke Stack
7. Isi dari register IP didorong ke Stack

13

Muhammad Taqiyyuddin Alawiy, ST., MT

8. Isi dari vektor interrupt diambil, dari (4 x N) dan kemudian ditempatkan ke IP dan
dari (4 x N + 2) ke CS, sehingga instruksi berikutnya yang akan dijalankan adalah
procedure dari interrupt service berdasarkan alamat pada interrupt vector.
9. Ketika kembali dari rutin interrupt-service oleh instruksi Interrupt Return (IRET),
nilai IP, CS dan register Flag akan ditarik dari Stack dan kembali ke kondisi
sebelum terjadinya interrupt.

Software Interrupt
Software interrupt merupakan fungsi-fungsi yang disediakan oleh BIOS maupun
sistim operasi, dimana fungsi-fungsi tersebut membuat tugas pemrograman menjadi lebih
mudah, dari pada menulisnya sendiri dari awal, anda cukup mengirimkan nilai input yang
dibutuhkan melalui register, kemudian memanggil rutin interrupt tersebut, dan selanjutnya
rutin interrupt akan melakukan fungsinya dan mengembalikan nilai hasil melalui register.
Fungsi yang tersedia dalam interrupt dapat terdiri dari layanan hardware seperti screen,
diskdrive, printer, serial port dan keyboard, maupun layanan secara software seperti directory
dan file.
Untuk melakukan panggilan terhadap rutin interrupt menggunakan perintah
INT N Dimana N merupakan nomor interrupt yang dapat bernilai 0 s/d 255, yang umumnya
ditulis secara hexadecimal 0 s/d FF Pada kenyataannya masing-masing interrupt terbagi lagi
sub-sub layanan, yang ditentukan pada nilai register AH, sebelum interrupt tersebut
dipanggil, sehingga kita dapat memiliki 256 x 256 = 65536 fungsi layanan.

Pemakaian Interrupt
Seperti yang telah dijelaskan sebelumnya, salah satu parameter layanan fungsi
interrupt adalah sub layanan yang ditentukan oleh nilai register AH, selain nilai register AH,
kita juga perlu mengisi nilai-nilai register lainnya sesuai dengan kebutuhan layanan interrupt
tersebut.
Contoh:
INT 21,9 - Print String
AH = 09
DS:DX = menunjuk alat suatu striung yang diakhir dengan "$"
returns nothing
- outputs character string to STDOUT up to "$"
- backspace is treated as non-destructive
- if Ctrl-Break is detected, INT 23 is executed
Berdasarkan data tersebut diatas, maka untuk pemakaian interrupt $21, sub layanan
$9 dengan fungsi Print String, maka perlu ditentukan nilai register AH=$9, dan kemudian
nilai register DS:DX menunjuk ke alamat suatu string yang diakhiri dengan '$'. Coba kita
review kembali program hello world sebelumnya. Dimana kita menggunakan INT $21 sub
layanan AH=$9 untuk mencetak tulisan yang berada dioffset DX=$102. Jadi dalam hal ini
AH dan DX merupakan parameter bagi INT $21.
0B11:0100 jmp 112
0B11:0102 db 'hello world !',0d,0a,'$'
0B11:0112 mov ah,9
0B11:0114 mov dx,102
0B11:0117 int 21
0B11:0119 mov ah,4c
0B11:011B int 21

Dalam hal ini kita tidak menentukan nilai DS, karena secara default pada program
jenis COM, nilai DS, ES, dan SS adalah sama dengan CS. Pada contoh sebelumnya kita

14

Muhammad Taqiyyuddin Alawiy, ST., MT

bekerja dengan rutin interrupt yang tidak mengembalikan hasil, tetapi hanya proses mencetak
string ke layar, berikut ini kita akan membahas rutin
interrupt yang mengembalikan hasil.
INT 21,8 - Console Input Without Echo
AH = 08
on return:
AL = character from STDIN
- returns 0 for extended keystroke, then function must be
called again to return scan code
- waits for character from STDIN and returns data in AL
- if Ctrl-Break is detected, INT 23 is executed
Berdasarkan data tersebut diatas, maka untuk menjalankan fungsi Int $21 Console
Input Without Echo, kita perlu ditentukan nilai register AH=$8, dan interrupt rutin akan
menunggu karakter dari STDIN, jika ada karakter yang diketik, maka akan disimpan di
register AL.
Untuk kongkritnya mari kita lihat contoh berikut ini, dimana setelah mencetak pesan
Ketik huruf A untuk selesai, program akan menanti input dari keyboard dengan
menggunakan INT $21 sub layanan AH=$8, dan nilai ASCII dari input keyboard akan
dikembalikan di register AL. Selanjutnya program dapat membandingkan nilai register AL
dengan $41 (65 desimal).
0B11:0100 mov ah,9
0B11:0102 mov dx,113
0B11:0105 int 21
0B11:0107 mov ah,8 ;baca dari STDIN tanpa echo
0B11:0109 int 21 ;karakter dikembalikan ke AL
0B11:010B cmp al,41
0B11:010D jnz 100
0B11:010F mov ah,4c
0B11:0111 int 21
0B11:0113 db Ketik huruf A untuk selesai,0d,0a,$
0B11:0131

Latihan
1. Misalkan diberikan suatu data interrupt sebagai berikut:
INT 21,39 - Create Subdirectory (mkdir)
AH = $39
DS:DX = pointer to ASCIIZ path name
on return:
CF = 0 if successful
= 1 if error
AX = error code (see DOS ERROR CODES)
- creates specified subdirectory
- returns error if directory already exists, element of the path
is not found, directory full or write protected disk
Catatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0)
Buatlah sebuah program assembly yang dapat membuat directory di E:\Nama Anda
2. Misalkan diberikan suatu data interrupt sebagai berikut:
INT 21,3B - Change Current Directory (chdir)
AH = $3B
DS:DX = pointer to ASCIIZ path name

15

Muhammad Taqiyyuddin Alawiy, ST., MT

on return:
CF = 0 if successful
= 1 if error
AX = error code if CF set (see DOS ERROR CODES)
- changes the current directory to the directory specified
by pointer DS:DX
Buat program yang dapat mengaktifkan ke directory E:\Hendra.
3. Misalkan diberikan suatu data interrupt sebagai berikut:
INT 21,56 - Rename File
AH = $56
DS:DX = pointer to old ASCIIZ path/filename
ES:DI = pointer to new ASCIIZ path/filename
on return:
AX = error code if CF set (see DOS ERROR CODES)
- supports full pathnames and allows renaming files across
directories and in DOS 3.x allows renaming subdirectories
- does not support use of wildcards unless invoked from via
INT $21, $5D in which case error code $12 is returned
- unpredictable result may occur if an opened file is renamed
- see Bibliography reference to "Undocumented DOS"
Buatlah program yang dapat mengubah directori E:\Hendra menjadi E:\Susan
SOAL QUIS
1. Jika anda diberi data sebagai berikut
INT 10h / AH = 2 setting posisi cursor.
input:
DH = baris.
DL = kolom.
BH = nomor halaman (0..7).
Contoh:
mov dh, 10
mov dl, 20
mov bh, 0
mov ah, 2
int 10h
Buatlah program yang dapat mencetak tulisan Hello World pada lokasi 10,10.
2. Jika anda diberi data sebagai berikut
INT 10h / AH = 03h mendapatkan posisi cursor dan ukuran.
input:
BH = page number.
return:
DH = row.
DL = column.
CH = cursor start line.
CL = cursor bottom line.
Untuk menyimpan nilai register 16-bit ke Stack anda dapat mengunakan perintah
PUSH, dan untuk mengambil kembali nilai dari Stack anda dapat menggunakan
POP.

16

Muhammad Taqiyyuddin Alawiy, ST., MT

Contoh:
Push DX
Pop DX
Buatlah program yang dapat mencetak tulisan Hello World pada lokasi 10,10
dan mengembalikan posisi cursor ke lokasi semula sebelum proses pencetakan.
3. Jika anda diberi data sebagai berikut
INT 10h / AH = 06h menggulung layar ke atas.
INT 10h / AH = 07h menggulung layer ke bawah.
input:
AL = jumlah baris yang digulung (00h = membersihkan layar).
BH = attribute untuk baris kosong pada bagian bawah window.
CH, CL = row, column sisi kiri atas jendela.
DH, DL = row, column sisi kanan bawah jendela.
Atribut
HEX BIN COLOR
0 0000 black
1 0001 blue
2 0010 green
3 0011 cyan
4 0100 red
5 0101 magenta
6 0110 brown
7 0111 light gray
8 1000 dark gray
9 1001 light blue
A 1010 light green
B 1011 light cyan
C 1100 light red
D 1101 light magenta
E 1110 yellow
F 1111 white

Jika nilai BH = $07, berarti warna background adalah black (0), dan warna
foreground adalah light gray (7).
Jumlah Baris = 0 s/d 24
Jumlah Kolom = 0 s/d 79
Buatlah program yang mensimulasi perintah CLS pada DOS, dan mengeser
kursor ke posisi sudut kiri atas.
4. Jika anda diberi data berikut :
INT 16h / AH = 00h - ambil keystroke dari keyboard (no echo).
return:
AH = BIOS scan code.
AL = ASCII character.
(if a keystroke is present, it is removed from the keyboard buffer).
INT 10h / AH = 0Eh - teletype output.
input:
AL = karakter yang dicetak.
Fungsi ini menampilkan suatu karakter pada layer, memajukan cursor dan
mengulung layer bila perlu, pencetakan dilakukan pada halaman yang aktif.
Contoh:
mov al, 'a'

17

Muhammad Taqiyyuddin Alawiy, ST., MT

mov ah, 0eh


int 10h
Buatlah program yang mengambil satu ketukan dari keyboard dan mencetak
kelayar pada posisi cursor aktif.

18

Muhammad Taqiyyuddin Alawiy, ST., MT

BAB 5
PENGALAMATAN MEMORI
Arsitektur x86 mengimplementasikan memori tersegmentasi, dimana memori dibagi
menjadi bagian-bagian yang dapat dialamatkan oleh sebuah register index tunggal (16- bit)
tanpa mengubah bagian selektor 16-bit. Masing-masing segment selalu berukuran 64 Kb
(menggunakan offset 16-bit). Pengalamatan fisik memori pada 8086 menggunakan
pengalamatan 20-bit (5 digit Hexa) yang dalam penulisannya dibagi atas segment dan offset,
misalnya sebuah alamat 0040:0010 secara fisik adalah 00410.

Modus pengalamatan Register


Kebanyakan instruksi pada 8086 beroperasi pada register general purpose dengan
menspesifikasikan nama dari register sebagai operand pada instruksi, anda dapat mengakses
kepada isi dari register tersebut dengan perintah MOV dest, source. Instruksi ini
menduplikasi data dari operand source ke operand target. Sesuatu hal yang perlu diperhatikan
adalah kedua operand harus berukuran yang sama.
Contoh:
mov ax, bx ;Copies the value from BX into AX
mov dl, al ;Copies the value from AL into DL
mov si, dx ;Copies the value from DX into SI
mov sp, bp ;Copies the value from BP into SP
mov dh, cl ;Copies the value from CL into DH
mov ax, ax ;Yes, this is legal!

Sesuatu hal yang perlu diingat adalah register merupakan tempat yang terbaik
untukmenyimpan variabel yang sering digunakan, instruksi yang menggunakan register
adalah lebih pendek dan cepat dibandingkan dengan akses memori. Anda tidak dapat
melakukan operasi mov terhadap suatu register segment ke register
segment lainnya, untuk melakukan hal ini anda dapat menggunakan instruksi sebagai berikut
:
mov ax, cs
mov ds, ax
atau
push ax
pop ds

Modus pengalamatan Memori


CPU 8086 menyediakan berbagai cara yang berbeda untuk mengakses memori,
modus pengalamatan yang disediakan adalah displacement, base, displacement+base,
base+indexed, dan displacement+base+indexed. Secara default jika tidak dituliskan, maka
register segment yang digunakan untuk data adalah DS, dan untuk stack adalah SS.

Displacement
Merupakan modus pengalamatan yang paling umum, dan yang paling mudah
dipahami, displacement terdiri dari konstanta 16-bit yang menspesifikasikan alamat offset
dari memori target. Instruksi MOV AL,[8088] adalah mengisi register AL dengan isi memori
yang secara fisik ditunjuk oleh DS:8088, dan sebaliknya MOV [1234],DL adalah mengisi
lokasi memori DS:1234 dengan nilai register DL.
Pada contoh diatas, kita bekerja dengan register satu byte, bagaimana kalau kita menulis
MOV AX,[1234], dimana AX adalah register word. Perintah ini akan menduplikasi nilai byte
dari lokasi memori DS:1234 ke register AL, dan DS:1235 ke register AH.

19

Muhammad Taqiyyuddin Alawiy, ST., MT

Pemakaian modus displacement cocok jika kita mengacu pada variable tunggal, tetapi
jika kita melakukan pengolahan Array maupun String tentu saja metode ini kurang sesuai.
Secara default modus displacement bekerja pada data-segment, jika anda bermaksud
mengacu pada alamat memori berdasarkan register segment lainnya, maka anda perlu
menuliskan MOV AX, ES:[0017] yang artinya mengisi register AX dengan nilai word dari
lokasi memori ES:0017. Jika source adalah immediately, secara default adalah dianggap
sebagai WORD, jika anda
immediately tersebut dimaksud adalah byte, maka anda perlu menambahkan kata byte
contoh :
mov [1234], 10 'akan mengisi byte 10 ke memori DS:1234
'dan byte 00 ke memori DS:1235
mov byte [1234],10 'akan mengisi byte 10 ke memori DS:1234

Modus Pengalamatan Register Indirect


CPU 8086 memperbolehkan anda mengakses memori secara indirect dengan
menggunakan modus pengalamatan indirect. Adapun register yang dapat digunakan
untuk mengakses memori secara indirect adalah bx, bp, si dan di. Sebagaimana pada
penulisan berikut:
mov al, [bx]
mov al, [bp]
mov al, [si]
mov al, [di]

Penulisan tersebut diatas akan menduplikasi nilai byte yang ditunjuk oleh ds:[bx], ss:[bp],
ds:[si], dan ds[di] ke register al.
Sesuatu hal yang perlu anda perhatikan adalah bahwa khusus untuk register BP secara default
menggunakan SS. Jika anda ingin mengacu pada register segment lainnya, maka anda dapat
menambahkan segment register pada penulisan.
mov al, cs:[bx]
mov al, ds:[bp]
mov al, ss:[si]
mov al, es:[di]

Modus pengalamatan Indexed


Modus pengalamatan indexed menggunakan sintak penulisan sebagai berikut:
mov al, [bx+disp]
mov al, [bp+disp]
mov al, [si+disp]
mov al, [di+disp]
mov al, ss:[bx+disp]
mov al, es:[bp+disp]
mov al, cs:[si+disp]
mov al, ss:[di+disp]

Displacement merupakan suatu konstanta 8-bit ataupun 16-bit


Jika bx berisi nilai $1000 dan konstanta disp adalah $234, maka MOV AL,[bx+234]
adalah mengisi nilai byte dari lokasi DS:1234 ke register AL.

Modus Pengalamatan Base Index


Pengalamatan modus base index secara sederhana mengkombinasikan register base
(bx atau bp) dengan register index (si atau di), adapun bentuk penulisan yang ada yaitu:
mov al, [bx+si]

20

Muhammad Taqiyyuddin Alawiy, ST., MT

mov al, [bx+di]


mov al, [bp+si]
mov al, [bp+di]

Secara default untuk register bx mengacu kepada DS, dan register bp mengacu kepada SS.

Modus pengalamatan Base+Index+Displacement


Modus pengalamatan ini mengkombinasikan register base (bx atau bp) dengan
register index (si atau di) dan ditambah dengan sebuah konstanta disp 8-bit atau 16-bit,
adapun bentuk penulisan yang ada adalah:
mov al, [bx+si+disp]
mov al, [bx+di+disp]
mov al, [bp+si+disp]
mov al, [bp+di+disp]

Berdasarkan kombinasi dari berbagai modus pengalamatan tersebut diatas, maka pada
CPU 8086 terdapat 17 bentuk pengalamantan yaitu : disp, [bx], [bp], [si], [di], disp[bx],
disp[bp], disp[si], disp[di], [bx][si], [bx][di], [bp][si], [bp][di], disp[bx][si], disp [bx][di], disp[bp][si],
and disp[bp][di].

Untuk memudahkan anda mengingat berbagai macam pengalamatan tersebut diatas.

Pertukaran nilai
Perintah XCHG dapat digunakan untuk pertukaran data antara register dengan
register, register dengan memori, memori dengan register.
Contoh:
Mov AX, 5
Mov [10], 7
XCHG AX,[10]

Mengambil nilai dari Tabel


Perintah XLATB dapat digunakan untuk menduplikasi nilai byte dari DS:[BX+AL]
ke
register AL.
Contoh:
-a 100
0B40:0100 jmp 112
0B40:0102 db '0123456789ABCDEF'
0B40:0112 mov bx,102
0B40:0115 mov al,0a
0B40:0117 xlat
0B40:0118
Maka nilai al adalah 9

Latihan
1. Misalkan anda diberi data sebagai berikut:
Pada lokasi memori FFFF:0005 s/d FFFF:000C berisi BIOS Revision Date
-d FFFF:0005
FFFF:0000 30 36 2F-31 32 2F 30 38 00 FC 00 06/12/08...
FFFF:0010 34 12 00 00 00 00 00 00-00 00 00 00 00 00 00 00 4...............

Dan perintah untuk mencetak karakter ke STDOUT adalah sebagai berikut


INT 21,2 - Display Output
AH = 02

21

Muhammad Taqiyyuddin Alawiy, ST., MT

DL = character to output
returns nothing
- outputs character to STDOUT
- backspace is treated as non-destructive cursor left
- if Ctrl-Break is detected, INT 23 is executed
Buatlah program yang dapat mencetak BIOS Revision Date is 06/12/08.
2. Misalkan anda diberi data sebagai berikut:
INT 21,1 - Keyboard Input with Echo
AH = 01
on return:
AL = character from standard input device
- waits for keyboard input from STDIN and echoes to STDOUT
- returns 0 for extended keystroke, then function must be
called again to return scan code
- if Ctrl-Break is detected, INT 23 is executed
Buatlah program yang dapat menerima 3 karakter, dan mencetak kembali Anda
mengetik huruf : XXX
3. Misalkan anda diberi data sebagai berikut:
INT 21,39 - Create Subdirectory (mkdir)
AH = 39h
DS:DX = pointer to ASCIIZ path name
on return:
CF = 0 if successful
= 1 if error
AX = error code (see DOS ERROR CODES)
- creates specified subdirectory
- returns error if directory already exists, element of the path
is not found, directory full or write protected disk
Catatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0)
Untuk program jenis COM, program line parameter dapat diperoleh pada Program
Segment Prefix (PSP), dimana byte ke $80 menunjukan jumlah byte parameter
pada command-line, dan byte ke $80 s/d $FF (127 byte) adalah Command-line
yang diakhir dengan $0d.
Buatlah program yang dapat membuat Subdirectori berdasarkan parameter yang
dibuat user.
-a 100
0B40:0100 xor bx,bx
0B40:0102 mov bl,[80]
0B40:0106 mov byte [bx+81],0
0B40:010B mov ah,39
0B40:010D mov dx,82
0B40:0110 int 21
0B40:0112 mov ah,4c
0B40:0114 int 21
0B40:0116
-n buatdir.com
-rcx

22

Muhammad Taqiyyuddin Alawiy, ST., MT

CX 0000
:16
-w
Writing 00016 bytes
-q
Untuk mencobanya ketik buatdir Hello
Otomatis akan terbentuk sebuah Subdirectori baru dengan nama Hello.
4. Perbaiki soal latihan no 2 dan 3 bab sebelumnya dengan kemampuan
penggunakan parameter.

23

Muhammad Taqiyyuddin Alawiy, ST., MT

BAB 6
PERULANGAN
Program komputer umumnya terdiri dari tiga struktur dasar, yaitu urutan perintah,
keputusan, dan perulangan. Suatu keputusan dilakukan untuk melakukan percabangan
berdasarkan kondisi tertentu. Pada CPU 8086 menyediakan berbagai perintah untuk proses
percabangan, baik yang bersifat unconditional jump maupun conditional jump.

Jump Tanpa kondisi


Perintah unconditional melakukan transfer titik eksekusi ke titik lain dengan
menggunakan perintah JMP. Secara sederhana perintah JMP dapat ditulis sebagai:
JMP lokasi
Contoh :
0B11:0100 jmp 112
0B11:0102 db 'hello world !',0d,0a,'$'
0B11:0112 mov ah,9
0B11:0114 mov dx,102
0B11:0117 int 21
0B11:0119 mov ah,4c
0B11:011B int 21

Jump dengan kondisi


Berbeda dengan perintah JMP yang melakukan jump tanpa kondisi, perintah-perintah
berikut ini melakukan jump (ke posisi -128 byte kebelakang atau 127 byte kedepan)
berdasarkan kondisi. Perintah ini terbagi atas tiga kempok
Jump berdasarkan bit Flag
Instruksi Keterangan Kondisi Instruksi lawan
JZ, JE Jump if Zero (Equal) ZF=1 JNZ, JNE
JC, JB, JNAE Jump if Carry (Below, Not Above Equal) CF=1 JNC, JNB, JAE
JS Jump if Sign SF=1 JNS
JO Jump if Overflow OF=1 JNO
JPE, JP Jump if Parity Even PF=1 JPO

Jump untuk bilangan bertanda


Instruksi Keterangan Kondisi Instruksi lawan
JE, JZ Jump if Equal (=).
Jump if Zero.
ZF =1 JNE, JNZ
JNE, JNZ Jump if Not Equal (<>). ZF = 0 JE, JZ
Jump if Not Zero.
JA , JNBE Jump if Above (>).
Jump if Not Below or Equal (not <=).
CF = 0
and
ZF = 0
JNA, JBE
JB , JNAE, JC Jump if Below (<).
Jump if Not Above or Equal (not >=).

24

Muhammad Taqiyyuddin Alawiy, ST., MT

Jump if Carry.
CF = 1 JNB, JAE, JNC
JAE , JNB, JNC Jump if Above or Equal (>=).
Jump if Not Below (not <).
Jump if Not Carry.
CF = 0 JNAE, JB
JBE , JNA Jump if Below or Equal (<=).
Jump if Not Above (not >).
CF = 1
or
ZF = 1
JNBE, JA

Jump untuk bilangan bertanda


Instruksi Keterangan Kondisi Instruksi lawan
JE , JZ Jump if Equal (=).
Jump if Zero.
ZF = 1 JNE, JNZ
JNE , JNZ Jump if Not Equal (<>).
Jump if Not Zero.
ZF = 0 JE, JZ
JG , JNLE Jump if Greater (>).
Jump if Not Less or Equal (not <=).
ZF = 0
and
SF = OF
JNG, JLE
JL , JNGE Jump if Less (<).
Jump if Not Greater or Equal (not >=).
SF <> OF JNL, JGE
JGE , JNL Jump if Greater or Equal (>=).
Jump if Not Less (not <).
SF = OF JNGE, JL
JLE , JNG Jump if Less or Equal (<=).
Jump if Not Greater (not >).
ZF = 1
or
SF <> OF
JNLE, JG

Pemakaian perintah Jumps


Misalkan anda diberi data sebagai berikut:
INT 21,39 - Create Subdirectory (mkdir)
AH = 39h
DS:DX = pointer to ASCIIZ path name
on return:
CF = 0 if successful
= 1 if error
AX = error code (see DOS ERROR CODES)
- creates specified subdirectory
- returns error if directory already exists, element of the path
is not found, directory full or write protected disk

25

Muhammad Taqiyyuddin Alawiy, ST., MT

Catatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0)
Untuk program jenis COM, program line parameter dapat diperoleh pada Program
Segment Prefix (PSP), dimana byte ke $80 menunjukan jumlah byte parameter
pada command-line, dan byte ke $80 s/d $FF (127 byte) adalah Command-line
yang diakhir dengan $0d. Dan anda ditugaskan untuk membuat program yang dapat
Subdirectori berdasarkan parameter yang diketikan oleh user, serta melaporkan apakah proses
pembuatan Subdirectori berhasil atau tidak.
Contoh:
BuatDir Hello
Direktori berhasil dibuat
BuatDir Hello
Direktori gagal dibuat
-a 100
0BB0:0100 jmp 139
0BB0:0102 db 'Direktori berhasil dibuat.',0d,0a,'$'
0BB0:011F db 'Direktori gagal dibuat.',0d,0a,'$'
0BB0:0139 xor bx,bx
0BB0:013B mov bl,[80]
0BB0:013F mov byte [bx+81],0
0BB0:0144 mov ah,39
0BB0:0146 mov dx,82
0BB0:0149 int 21
0BB0:014B jc 152
0BB0:014D mov dx,102
0BB0:0150 jmp 155
0BB0:0152 mov dx,11f
0BB0:0155 mov ah,9
0BB0:0157 int 21
0BB0:0159 mov ah,4c
0BB0:015B int 21
0BB0:015D
-n buatdir.com
-rcx
CX 005C
:5d
-w
Writing 0005D bytes
-

Latihan
1. Gambarkan flowchart untuk contoh BuatDir.
2. Buatlah program yang dapat membuat Subdirectori berdasarkan parameter yang
dimasukan oleh pemakai, dan menampilkan status hasil.
3. Buatlah program yang dapat menghapus Subdirectori berdasarkan parameter yang
dimasukan oleh pemakai, dan menampilkan status hasil.

26

Muhammad Taqiyyuddin Alawiy, ST., MT

BAB 8
OPERASI LOGIKA
Ada empat operasi logika yang sering dilakukan, yaitu AND, OR, XOR dan NOT,
dimana pada masing-masing operasi dilakukan untuk pengaturan bit pada suatu data biner.

Operasi AND
Operasi AND sering digunakan untuk operasi masking bit tertentu menjadi nol,
maupun untuk mendeteksi apakah suatu bit aktif atau tidak, setelah dilakukan operasi AND,
maka akan diperiksa ZF=1, jika benar artinya bit tersebut tidak aktif. Adapun operasi dari
AND adalah sebagai berikut:
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1

Contoh:
MOV AL, 'a' ; AL = 01100001b
AND AL, 11011111b ; AL = 01000001b ('A')
RET

Operasi AND juga dapat digunakan untuk menghitung sisa bagi dest := dest MOD 2n
and ax, 3 ;AX := AX mod 4
and ax, 0Fh ;AX := AX mod 16
and ax, 1Fh ;AX := AX mod 32
and ax, 3Fh ;AX := AX mod 64
and ax, 7Fh ;AX := AX mod 128
mov ah, 0 ;AX := AX mod 256
; (Same as ax and 0FFh)

Operasi OR
Operasi OR sering digunakan untuk operasi masking bit tertentu menjadi satu, adapun
operasi OR adalah sebagai berikut:
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1

Example:
MOV AL, 'A' ; AL = 01000001b
OR AL, 00100000b ; AL = 01100001b ('a')
RET

Perintah OR juga sering digunakan untuk memeriksa apakah suatu register berisi nilai
nol.

Contoh:
CMP AX, 0 dapat ditulis juga OR AX, AX

27

Muhammad Taqiyyuddin Alawiy, ST., MT

Operasi XOR
Operasi OR sering digunakan untuk membalikkan kondisi bit tertentu, maupun untuk
menolkan suatu register, misalnya penulisan MOV AX, 0 dapat diganti dengan XOR
AX,AX,
B80000 MOV AX,0000
31C0 XOR AX,AX ;lebih efisien

Dalam hal ini XOR AX, AX lebih pendek dari pada MOV AX,0
Adapun operasi dari XOR adalah sebagai berikut :
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

Contoh:
MOV AL, 00000111b
XOR AL, 00000010b ; AL = 00000101b
RET

Operasi NOT
Operasi NOT digunakan untuk membuat bilangan komplemen satu yaitu membalikan
keaktifkan bit, adapun operasi NOT adalah sebagai berikut:
NOT 0 = 1
NOT 1 = 0

Contoh:
MOV AL, 00011011b
NOT AL ; AL = 11100100b

Pemakaian Operasi Logika


Operasi logika sering digunakan untuk memanipulasi status dari perangkat keras,
misalnya untuk mendeteksi, mengaktifkan maupun mematikan bit-bit tertentu. Pada IBM PC
Compatible data daftar peralatan dapat diperoleh dari data word di lokasi 0040:0010 pada
BIOS Data Area dengan setting sebagai berikut ini: bit 0 Jika bernilai 0, artinya komputer
tidak memiliki drive disket bit 1 1 berarti terdapat numeric coprocessor bit 2-3 memori
motherboard: 01=16K; 10=32K; 11=64K+ (biasanya bernilai 00 pada PC modern, sehingga
tidak ada artinya) Pada PS/2, jika bit 2 bernilai 1 ketika suatu mouse terdeteksi pada saat
POST bit 4-5 Video adaptor yang sedang aktif 00 = reserver, 01 = 40 clm color, 10 = 80- clm
color, 11 = TTL Monochrome bit 6-7 Jumlah drive disket yang terdeteksi 00=1;
01=2;10=3;11=4 bit 8 1 = hardware DMA tersedia (tidak reliable) bit 9-11 RS-232 serial port
yang terdeteksi 000=0, 001=1, ... 100=4 ... 111=7 bit 12 1 = adapter game (joystick)
terdeteksi oleh POST bit 13 (hanya pada PCjr) 1 = printer serial terpasang bit 14- 15 jumlah
dari port printer parallel 00=0, 01=1, 10=2, 11=3 Sehingga untuk mendeteksi keberadaan
drive disket kita dapat melakukan operasi AND word settting tersebut diatas dengan nilai $1,
jika hasil operasi tersebut not zero (zero flag), maka berarti disk drive terpasang. Untuk
mendeteksi keberadaan coprocessor dapat dilakukan dengan melakukan operasi And word
setting tersebut diatas dengan nilai $2.

Operasi logika pada x86


Tata cara penulisan operasi logika pada x86 dan register flag yang terpengaruh
ditunjukan pada tabel berikut ini: Format instruksi Fungsi Flags terpengaruh AND dest, src

28

Muhammad Taqiyyuddin Alawiy, ST., MT

operasi logika and dari dua operand, dan mengembalikan hasil pada dest. CF, OF, PF, SF, ZF
(AF tak terdefinisi) OR dest, src operasi logika or dari dua operand, dan mengembalikan hasil
pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) XOR dest, src operasi logika or dari dua
operand, dan mengembalikan hasil pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) NOT
dest mengembalikan invers bit pada dest TEST dest, src melakukan operasi AND dari dua
operand dan mengupdate register CF, OF, PF, SF, ZF (AF tak terdefinisi) flag, tetapi tidak
mengembalikan hasil pada dest.
-a 100
0B46:0100 mov ax,0040
0B46:0103 mov ds,ax
0B46:0105 mov ax,[0010]
0B46:0108 and ax,1
0B46:010B
-t
AX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B46 ES=0B46 SS=0B46 CS=0B46 IP=0103 NV UP EI PL NZ NA PO NC
0B46:0103 8ED8 MOV DS,AX
-t
AX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0105 NV UP EI PL NZ NA PO NC
0B46:0105 A11000 MOV AX,[0010] DS:0010=C822
-t
AX=C822 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0108 NV UP EI PL NZ NA PO NC
0B46:0108 250100 AND AX,0001
-t
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=010B NV UP EI PL ZR NA PE NC
Operasi tersebut diatas dapat dijelaskan bahwa pada awalnya akan diduplikasi nilai 0040 ke
register AX, kemudian nilai dari register AX akan diduplikasi ke register DS, dan akan
diduplikasi nilai dari lokasi memori 0040:0010 ke register AX, dan kemudian akan dilakukan
operasi AND register AX dengan nilai $1. Berdasarkan hasil T (Trace) yang dilakukan
terlihat bahwa hasil akhir register AX adalah 0000 dan ZR (Zero flag aktif), berarti bahwa
tidak ada drive disket yang terpasang.
org 100h
push ds
mov ax,40h
mov ds,ax
mov ax,[10h]
pop ds
and ax,2h
jz cetak_tidak_ada
mov dx, offset ada
jmp cetak
cetak_tidak_ada:
mov dx, offset tidak_ada
cetak:
mov ah,9h
int 21h
mov ah,4ch

29

Muhammad Taqiyyuddin Alawiy, ST., MT

int 21h
ada db 'ada coprocessor.',0dh,0ah,'$'
tidak_ada db 'tidak ada coprocessor.',0dh,0ah,'$'

Adapun program tersebut diatas dapat dijelaskan bahwa pada awalnya akan didorong
nilai register DS ke stack, kemudian duplikasi nilai 40 ke register AX, kemudian diduplikasi
nilai AX ke DS, kemudian diduplikasi isi memori yang ditunjuk oleh DS: [0010] dalam hal
ini adalah 0040:1000 ke register AX, dan kemudian register AX di AND dengan nilai $2, dan
tarik kembali nilai dari stack ke register DS, berdasarkan hasil operasi AND akan diuji nilai
Zero flag, jika aktif akan dicetak tidak ada coprocessor dan sebaliknya akan dicetak ada
coprocessor. Sesuatu hal yang perlu diingat bahwa perintah TEST tidak menyimpan nilai
hasil operasi, tetapi hanya mempengaruhi flag. Perintah test dapat digunakan untuk
memeriksa apakah suatu register bernilai nol atau tidak, contoh: Sesuatu hal yang perlu
diingat bahwa operasi TEST tidak menyimpan nilai hasil operasi, tetapi hanya mempengaruhi
flag. Test dapat digunakan untuk memeriksa apakah suatu register bernilai nol atau tidak.
85C0 TEST AX,AX
3D0000 CMP AX,0000

Dalam hal ini TEST AX,AX lebih pendek dibandingkan dengan CMP AX,AX.

Latihan
Byte pada 0040:0017 pada BIOS Data Area menunjukan status keyboard sebagai berikut ini :
bit Status 0 shift sebelah kanan ditekan
1 shift sebelah kiri ditekan
2 ctrl ditekan
3 alt ditekan
4 keaktifkan ScrollLock
5 keaktifan NumLock
6 keaktifkan CapsLock
7 Keaktifan Insert
1. Buatlah program Assembly yang dapat menampilkan pesan keaktifan tombol
CapsLock (CapsLock Aktif, CapsLock tidak Aktif).
2. Buatlah program Assembly yang menon-aktifkan tombol Capslock
3. Buatlah program Assembly yang mengaktifkan tombol NumLock
4. Buatlah program Assembly yang dapat membalikkan status tombol Capslock (On
menjadi Off dan sebaliknya).
5. Modifikasi soal latihan nomor tiga bab sebelumnya agar password yang
dimasukan tidak case sensitif.

LATIHAN TAMBAHAN
CGA video memori untuk text mode terdapat dilokasi memori B800:0000 s/d
B800:0F9F untuk halaman pertama. Masing-masing karakter yang ditampilkan pada layar
terdiri dari menggunakan satu WORD, yaitu low byte adalah nilai ASCII dari karakter, dan
high byte adalah atribut (background dan foreground). Misalnya pada posisi baris 0, kolom 0

30

Muhammad Taqiyyuddin Alawiy, ST., MT

ditampilkan huruf A dengan warna latarbelakang black dan warna tulisan light gray, maka isi
memori B800:0000 adalah $41 dan isi memori B800:0001 adalah $07.
1. Buatlah program yang dapat mengubah atribut layar menjadi latarbelakang
merah dan warna tulisan light gray tanpa mengubah tulisan yang ada.
2. Buatlah program yang dapat mengubah karakter pada layar menjadi huruf
besar semua.
3. Buatlah program yang dapat mengubah karakter pada layar menjadi huruf
kecil semua.
4. Dengan menggunakan nested loop, buatlah program yang dapat menampilkan
urutan angka berikut :
12345 54321
1234 5432
123 543
12 54
15
5. Buatlah program yang dapat menampilkan suatu daftar ASCII dengan tampilan
sebagai berikut:

31

Muhammad Taqiyyuddin Alawiy, ST., MT

REVERENSI

Pemrograman Bahasa Assembly, Sutanto assembly


Randall Hyde, The Art of Assembly Language
http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.ht
ml
Documentation for 8086 assembler and
emulator http://www.emu8086.com/assembler_tutorial

32

Muhammad Taqiyyuddin Alawiy, ST., MT