Assemblious
Oleh : Muhammad Irvan Hermawan
Hak Cipta 2012 pada Penulis
PRAKATA
Alhamdulillahirabbilaalamin, segala puja dan puji syukur penulis panjatkan kepada Allah.
Karena rahmat dan karuniaNya akhirnya buku yang berjudul Kitab Suci Assembly dapat
diselesaikan dengan tepat waktu.
Buku ini ditulis berdasarkan keinginan para programmer di beberapa situs sosial yang ingin
mempelajari bahasa assembly. Mereka sering mendapat beberapa masalah dalam
pemrograman Assembly, salah satu masalah yang terjadi adalah kurangnya buku yang
menyediakan panduan mempelajari assembly. Kalaupun ada, itu sudah terbitan lama, jadi
isi dari buku tersebut kurang menarik lagi untuk dipelajari. Berdasarkan kondisi tersebut,
penulis berusaha menyusun buku ini dengan memuat beragam panduan secara sistematis
dan lebih mudah dipahami serta didesain dengan tampilan lebih colorful agar dapat
memacu programmer untuk lebih cepat menguasai bahasa assembly.
Terselesaikannya penulisan buku ini juga tidak terlepas dari bantuan beberapa pihak.
Karena itu, penulis menyampaikan terima kasih kepada teman teman yang telah
memberikan banyak support dan masukan. Saya juga ingin mengucapkan terima kasih juga
kepada user yang tergabung dalam P.O.S.I. Community di Facebook yang telah
memberikan ide untuk merancang buku ini.
Meskipun telah berusaha untuk menghindarkan kesalahan, penulis menyadari juga bahwa
buku ini masih mempunyai kelemahan sebagai kekurangannya. Karena itu, penulis
berharap agar pembaca berkenan menyampaikan kritikan. Dengan segala pengharapan
dan keterbukaan, penulis menyampaikan rasa terima kasih dengan setulus-tulusnya. Kritik
merupakan perhatian agar dapat menuju kesempurnaan. Akhir kata, penulis berharap agar
buku ini dapat membawa manfaat kepada pembaca. Secara khusus, penulis berharap
semoga buku ini dapat menginspirasi generasi bangsa ini agar menjadi generasi yang
tanggap dan tangguh. Jadilah generasi yang bermartabat, kreatif, dan mandiri.
Daftar Isi
BAB I
Memulai Assembly
Wohoo!!!
Apakah
ah and
anda sudah siap?
Buku ini akan
ak membawa anda ke dalam dunia
Assembly...
bly...
Bersiaplah
aplah !
Buku ini disusun
dis
secara sistmatis dan terstruktur.
Agar anda dapat
d
menguasai Assembly dengan
cepat.. Bacala
Bacalah dengan beurutan dan jangan pernah
lewatkan
kan ra
rahasia menarik Assembly.
Mengenal Assembly
1. Asal Mula Assembly
Bahasa Assembly atau Bahasa Rakitan merupakan bahasa pemrograman yang
digunakan untuk memprogram microprosesor, microcontroller atau sesuatu yang
dapat diprogram. Pada masa komputer generasi pertama, Program diciptakan dengan
mengkombinasikan angka-angka biner yang dipahami mesin. Tentu ini sangat
melelahkan. Selain sulit, jika suatu saat program mengalami kesalahan, tentu sulit
untuk mengetahui letak kesalahannya.
Hingga pada akhirnya pada tahun 1940, bahasa assembly diciptakan. Bahasa assembly
menggunakan symbol dan kode perintah dalam mnemonic. Hal ini relatif lebih mudah
dipahami daripada harus mengetik jutaan baris angka biner.
Compiler assembly akan menerjemahkan symbol dan kode tersebut ke dalam bahasa
mesin, dengan begitu programmer dapat lebih cepat dan mudah untuk merancang
program yang mereka inginkan.
3. Prosesor
Micro Prosesor atau Prosesor merupakan otak dari sebuah komputer. Pada sebuah
Prosesor terdapat ribuan bahkan jutaan nano transistor. Transistor ini dibuat dari
logam semi-konduktor yang dirangkai sedemikian rupa sehingga dapat bekerja seperti
saklar otomatis berkecepatan tinggi. Rangkaian ini disebut TTL (transistor-Transistor
Logic). Rangkaian inilah yang nantinya akan melakukan operasi logika dan
perhitungan. Dalam proses perhitungan, pasti kita tidak akan jauh dengan angka. lalu
bagaimana Prosesor mengetahui angka dengan transistor-transistor tersebut?
Sebuah transistor dikatakan menyimpan angka 1 ketika emitor pada transistor
tersebut mengalirkan arus listrik, sedangkan jika tidak ada arus yang mengalir, artinya
transistor tersebut menyimpan angka 0. Hanya kedua angka inilah yang sebenarnya
diketahui oleh seluruh komputer di dunia. Kedua angka tersebut dinamakan bit(binary
digit) atau angka biner. Kombinasi dari bit tersebut dapat mewakili suatu angka
tertentu. Misal:
0000 = 0
0001 = 1
0010 = 2
0011 = 3
Prosesor biasanya memiliki kecepatan yang berbeda-beda, kecepatan tersebut
ditentukan oleh jumlah CPU cycles yang dihasilkan tiap detik. Pada umumnya memiliki
satuan Hz. Misal sebuah Prosesor memiliki kcepatan 2.000.000.000 Hz (2 GHz), artinya
Prosesor tersebut dapat menghasilkan 2.000.000.000 cycle setiap detik.
Kita telah mengetahui kecepatan Prosesor, jadi sekarang kita dapat mengetahui
seberapa cepat komputer. Pada spesifikasi Intel tertulis bahwa untuk melakukan
operasi pertambahan dengan instruksi ADD, hanya diperlukan waktu sekitar 7 cycle.
Sedangkan ntuk menyalin data antar dengan instruksi MOV hanya diperlukan 1-5 cycle
saja. Artinya dalam 1 detik komputer kita dapat melakukan perhitungan :
2.000.000.000
X
7 3
Jadi, misalkan kita punya 200.000.000 soal pertambahan pada pelajaran matematika,
komputer bisa menyelesaikannya dalam waktu 1 detik. Kecepatan dari Prosesor secara
umum dipengaruhi oleh bahan dan kualitas dari semikonduktor yang dipakai. Semakin
bagus kualitan semikonduktor, maka semakin lancar aliran listrik mengalir dan
semakin cepat pula kecepatan Prosesor tersebut. Hal lain yang menarik untuk dibahas
adalah bagaimana Prosesor bekerja. Saat bekerja, Prosesor mencoba membaca data
dari memori untuk mengetahui apa yang harus Prosesor kerjakan. Pekerjaan Prosesor
ditentukan olehinstruksi atau Operational Code (Opcode) yang telah dibaca. Misalnya,
ketika sebuah program melakukan instruksi INT 10h, sebenarnya yang dilakukan
Prosesor adalah membaca dan telah mendeteksi opcode ini dari memori :
1100 1101 0001 0000 (biner).
Contoh lain ketika Prosesor mencoba menjalankan instruksi ADD AX,2h ; instruksi
dibaca oleh Prosesor adalah :
1000 0011 1100 0000 0000 0010
Ketika opcode telah diketahui, maka Prosesor akan segera menjalankannya dan
beralih menuju instruksi opcode berikutnya. Kita bisa mendapatkan kode tersebut
dengan mengompilasi source dari program yang telah kita tulis. Compiler bekerja
dengan cara menerjemahkan kode tersebut menjadi kode biner yang dikenali oleh
mesin Prosesor.
4. Bilangan Biner
Sebenarnya komputer tidaklah sepintar manusia. Namun, hal inilah yang justru
membuatnya menarik untuk dipelajari. Sekarang, kita akan mencoba memahami lebih
mendalam bagaimana kombinasi bit tersebut dapat membentuk sebuah angka.
1000 8
0000 0
1001 9
0001 1
1010 10
0010 2
1011 11
0011 3
1100 12
0100 4
1101 13
0101 5
1110 14
0110 6
1111 15
0111 7
Dalam system penomoran desimal (0 9), bilangan terendah adalah 0, dan bilangan
tertingginya tentu adalah 9. Pada penomoran biner, bilangan terendahnya juga 0,
namun bilangan tertingginya hanya hingga 1.
Desimal : 1 sapi
Biner : 1 sapi
Low Bit
High Bit
Nibble
Byte
Word
Double Word
Desimal : 3 bola
Biner : 11 bola
:
:
:
:
:
:
5. Jenis Bilangan
Seluruh program yang berjalan
berja
pada komputer kita merupakan manipulasi
manipu
dari
milyaran, bahkan triliyunan
iliyunan bilangan biner. Tentu ini tidak mudah
ah untuk menulis angka
dalam bentuk bilangan
gan biner.
bine Mengingat efisiensi waktu, maka Assembler
Assemb
memberikan kemudahan
ahan kepada
ke
kita dalam menulis bilangan. Dalam assembly, kita
diperbolehkan menuliskan
uliskan bilangan
b
dalam 4 format. Antara lain :
A. Biner
Untuk menulis suatu
uatu bila
bilangan bit kita hanya diperbolehkan mengetik
mengeti angka 0 dan
1. Selanjutnya, dibagian
ibagian belakang bilangan kita harus menyisipkan
isipkan huruf b
Contoh :
00000001b, 10000000b,
00000b, 1011000010010000b
B. Desimal
6. Bilangan bertanda
Bilangan 1 byte dapat membuat kombinasi hingga 256 ( 0 255).Kombinasi tersebut
seluruhnya merupakan bilangan positif. Oleh karena itu, Prosesor Intel menggunakan
sebuah cara untuk mengetahui suatu bilangan Positif (Tak Bertanda/Unsigned) atau
Negatif (Bertanda/Signed). Yaitu dengan membagi kombinasi bilangan tersebut
menjadi 2 bagian. 128 kombinasi pertama (0 127) bernilai positif dan 128 kombinasi
berikutnya (128 255) dianggap negatif. Begitu juga dengan bilangan word, double
word dan bilangan lain, setengah dari kombinasi dipakai untuk mewakili angka positif,
dan sisa setengahnya dipakai untuk mewakili angka negatif.
0
1
2
.
.
.
125
126
127
0
1
2
125
126
127
128
129
130
.
.
.
253
254
255
-128
-127
-126
-3
-2
-1
Ketika kita menulis bilangan negatif dalam kode, saat proses kompilasi bilangan
tersebut pasti akan diubah menjadi bilangan biasa seperti diatas.
7. Disk
Banyak orang yang menyebut media penyimpanan ini dengan sebutan memori. Ya, itu
memang tidak salah. Perbedaan antara memori dan disk terletak pada
kemampuannya. Memori hanya dapat menampung data sementara. sedangkan disk
dapat menampung data secara permanen.
7.1. Jenis Pengalamatan Disk
Komputer mengakses disk dengan 2 cara, yaitu :
CHS Addressing (Cyllinder-Head-Sector)
Disk pada umumnya terdapat 2 Head, yang mana salah satu head berada
di bagian bawah disk dan yang satunya lagi ada di bagian atas. Disk juga
mempunyai sector atau disebut juga track. Setiap track terdapat sector.
Sector inilah yang dipakai untuk menyimpan data. Setiap sector pada
media floppydisk dan harddisk biasanya dapat menampung 512 bytes,
sedangkan pada CD dapat menampung 2048 bytes untuk setiap sector.
Logical Sector AddressingLogical Sector Addressing merupakan cara
pengalamatan disk yang dapat diimplementasikan lebih mudah. Cara ini
dilakukan dengan memberikan nomor pada semua sector dalam disk.
Walaupun cara aksesnya berbeda, namun spada akhirnya ketika dipakai,
system akan menerjemahkan alamat logical tersebut menjadi alamat CHS.
7.2. Mengubah Alamat Logical menjadi CHS
Pengalamatan logical sangat praktis, karena kita hanya memerlukan sebuah
alamat untuk mengakses suatu lokasi pada disk. Untuk mencari alamat Logical
pada disk, kita dapat menemukannya dengan rumus berikut.
Logical Sector = (Head + 1) x ((Track + 1) x SectorPerTrack) +
Sector (SectorPerTrack + 1)
Track
8. Memori
Memori merupakan nama untuk perangkat keras yang dipakai oleh sebuah Prosesor
sebagai media penyimpanan data sementara. Semua program yang dijalankan oleh
Prosesor disimpan disini. Data yang disimpan pada memori ini bersifat sementara,
karena memori hanya dapat menyimpan data jika dialiri arus listrik. Jika suatu saat
komputer dimatikan, maka ketika komputer tersebut dinyalakan lagi, data sudah tidak
bisa kita temukan lagi. Saat kita mencoba menjalankan program, sebenarnya kita telah
menyuruh system operasi untuk menyalin file program dari harddisk menuju RAM.
setelah itu, system system akan menyuruh Prosesor untuk menjalankan kode dari
program tersebut. Jadi, program yang kita jalankan sebenarnya merupakan kumpulan
dari ribuan instruksi yang dapat dimengerti dan dijalankan oleh Prosesor.
8.1. Jenis Pengalamatan Memori
Memori merupakan bagian yang sangat luas dan kompleks. Diperlukan suatu
teknik agar akses read/write di memori dapat dilakukan semudah mungkin,
namun tetap aman. Untuk itu, Intel menyediakan kita 2 cara untuk mengakses
memori, yaitu :
a. Relatif (Segment : Offset)
Disebut juga Real Mode Addressing merupakan teknik pengalamatan yang
masih dipakai oleh program-program 16-bit. Cara ini dilakukan dengan
membagi ruangan di dalam memori menjadi beberapa bagian yang disebut
Segment. Lalu setiap segment terdapat offset yang dapat kita pakai untuk
menyimpan data. Kemampuan akses memori maksimal hanya 1 MB saja. Jika
kita mempunyai memori diatas 1 MB, maka bagian memori diatas 1 MB
tersebut, terbuang percuma karena tidak akan pernah bisa diakses dengan
teknik pengalamatan ini.
Teknik pengalamatan memori dengan segment : offset bersifat relatif.
Maksud dari kata relatif disini adalah alamat dari memori sebenarnya bisa
diakses dengan beragam alamat Segment:Offset. Hal ini dikarenakan
terjadinya tumpang-tindih/overlapping.
Jumlah segment maksimal yang dapat diakses dengan pengalamatan ini
adalah segment 65536 segment (0 hingga segment 65535) dan setiap
segment terdapat 65536 offset(1 offset = 1 byte).
Ups, tapi jangan salah! bukan berarti dengan adanya 65535 segment dan
65535 offset, kita dapat mengakses hingga 65536 x 65536 byte memory! Ingat
tentang overlapping!
Jadi, jika dihitung secara keseluruhan ternyata Pengalamatan model ini
hanya mampu menjangkau memori hingga 1114095 Bytes (1 MB).
Keterangan :
Garis biru Horisontal
Angka berwarna merah
= Segment
= Offset
Berdasarkan
an gambar
gamb diatas, kita misalkan akan mengakses
akses Segment 1 : Offset
0, maka kita
ta akan menemukan posisi 32 . Lalu berikutnya coba gunakan
Segment 0 : Offset 16, apa yang terjadi ?
Ya, kedua alamat tersebut
t
sama-sama menuju posisi 16 !
Contoh lain,
in, kita aakan mencoba mengakses Segment 0 : Offse
Offset 48, dengan
begitu kita menuju posisi Byte 48. Sekarang coba lihat Segment
Segmen 1 : Offset 32
dan Segment
ent 2 : O
Offset 16. Keduanya menuju posisi 48.
Inilah yang
g dimaks
dimaksud dengan overlapping.
Dengan terjadinya
rjadinya overlapping, kita dapat mengakses data
ta di memori
dengan alamat
amat yang
yan berbeda-beda.
b. Absolut (Physical
Physical A
Address)
Ukuran program
ogram komputer
k
masa sekarang umumnya relatif besar,
be
sangat
berbeda dengan
engan program
p
komputer di sekitar abad ke-19. Selain
Sela karena
harga memori
ori yang
yan semakin terjangkau, hal ini juga dipengaru
ipengaruhi oleh
perkembangan
ngan teknologi
tek
Prosesor Intel. Munculnya Prosesor 32-bit, diiringi
oleh modell pengalamatan
penga
baru, yaitu model pengalamatan
atan Absolut.
Pengalamatan
atan ini sangat jauh berbeda dengan sistem pengalamatan
pengala
9. Register
Register merupakan komponen terpenting dalam Prosesor. Dalam sebuah Prosesor
register dipakai sebagai tempat menyimpan data sementara untuk berbagai
keperluan, sehingga banyak orang yang mengatakan bahwa register merupakan kaki
tangan dari sebuah Prosesor. Register dapat diakses dengan kecepatan sangat tinggi
melebihi kecepatan akses memori, sehingga sebagian besar performa komputer juga
ditentukan oleh kecepatan akses register. Dalam Prosesor 80386 terdapat beberapa
jenis register antara lain :
A. Segment Register
Segment register merupakan Register yang berisi nilai menunjukkan lokasi segment
yang akan diakses untuk keperluan tertentu. Seluruh register ini berukuran 16-bit.
Ingat, program 32-bit, kita tidak boleh mengubah nilai segment register. pada
program 32-bit, segment register dipakai untuk menentukan konfigurasi untuk
mengakses memori. Nilai yang ada pada segment register telah diatur oleh sistem
operasi. Jika kita mencoba mengaksesnya, terkadang program akan mengalami
crash. Segment Register ada 6 antara lain :
1) CS (Code Segment)
2)
3)
4)
5)
ditambah 1, yang
g artinya
arti
instruksi selanjutnya terdapat pada
ada bagian
bag memori
berikutnya. Secara
ecara sederhana,
se
register IP digunakan khusus
sus untuk
untu menunjukkan
Lokasi Offset dari instruksi program yang sedang dieksekusi.
usi. Register
Reg
ini
berpasangan dengan CS (CS:IP)
2) Base Pointer (BP, EBP, RBP)
Digunakan untuk
ntuk menunjuk
me
dan mengakses suatu bagian data dalam
da
memori.
Berpasangan dengan SS (SS:BP)
3) Stack Pointerr (SP, ESP, RSP)
Digunakan untuk
ntuk menunjukkan
me
lokasi menyimpan stack di memori.
memo
Index Register :
1) Source Index (SI, ESI,
ESI RSI)
Berpasangan dengan DS (DS:SI)
2) Destination Index
ndex (DI
(DI, EDI, RDI)
Berpasangan dengan ES (ES:DI)
Kedua Register
er ini bisa
bis digunakan seperti BP. Biasanya juga
ga digun
digunakan dalam
instruksi perbandiang
andiangan dalam string.
Namaa register
registe yang berawalan E (seperti EDI, ESI)
I) adalah register 32bit, sedangka
edangkan register yang berawalan R (sepertii RBP) adalah
a
register
64-bit, sementara
ntara register
reg
yang memiliki nama 2 huruf dan
an tanpa awalan
merupakan Register
egister 16-bit.
1
Anggota dari register
gister diatas memiliki struktur seperti gambar
bar di bawah
b
ini.
Gambar di atas
as menunjukkan
menu
pada kita bahwa register sejenis(Se
jenis(Seperti DI, EDI
dan RDI), sebenarnya
enarnya letaknya tidak terpisah, melainkan saling berhubungan.
b
Efek dari penempata
empatan register ini dapat dilihat ketika kitaa mengubah
mengu
salah satu
register. Maka,
a, nilai dari
d register lain akan terpengaruh. Misal
isal :
Kita misalkan semua
mua bit
bi register dalam keadaan kosong :
RDI : 0000 0000 000
00 0000 0000 0000 0000 0000 0000 0000 0000 000
00 0000 0000 0000
0000
EDI : 0000 0000 000
00 0000 0000 0000 0000 0000
DI
: 0000 0000 00
000 0000
Karena susunan register saling berhubungan, sekarang coba tebak apa yan
yang terjadi bila DI
kita ubah menjadi 11
111 1111 1111 1111 :
RDI : 0000 0000 000
00 0000 0000 0000 0000 0000 0000 0000 0000 000
00 1111 1111 1111
1111
Ya, benar nilai dari EDI dan RDI ikut berubah !. Hal ini juga berlaku pada pengubahan nilai
EDI dan RDI dan register sejenis lainnya.
C. General Purpose Register (Terdapat versi 8-bit, 16-bit, 32-bit dan 64-bit)
General Purpose Register juga memiliki struktur yang penempatannya juga saling
berhubungan. Perbedaannya, terletak pada register 16-bit yang masih dapat
dipecah lagi menjadi 2 register.
Misal :
Kita misalkan semua bit register dalam keadaan kosong.
RAX : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
EAX : 0000 0000 0000 0000 0000 0000 0000 0000
AX : 0000 0000 0000 0000
AH : 0000 0000
.
AL : 0000 0000
Coba lihat jika, kita merubah salah satu nilai bit dari register. Ubah AL menjadi 1111 1111
RAX : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111
EAX : 0000 0000 0000 0000 0000 0000 1111 1111
AX : 0000 1111 1111
AH : 0000 0000
.
AL : 1111 1111
3) Count (CL,CH,CX,ECX,RCX)
Digunakan dalam operasi LOOP
4) Data (DL,DH,DX,EDX,RDX)
Digunakan untuk menampung hasil sisa pembagian, dan pengaksesan port.
Note : Karakter E (Exx) menandakan bahwa register tersebut berukuran 32-bit,
contohnya EAX, EBX, EIP. Sedangkan karakter R (Rxx) menandakan register
tersebut berukuran 64-bit, contohnya RAX, RBP, RCX.
D. Flags Register
Kelompok register ini dipakai untuk menentukan keadaan dalam computer. Semua
register dalam kelompok ini berukuran 1-bit untuk menandakan kondisi Ya atau
Tidak
1) CF (Carry Flag)
Flag ini bernilai 1 jika terjadi overflow saat mengoperasikan bilangan tak
bertanda. Misalnya jika kita menambah suatu register 8-bit yang berisi 255,
dengan 1. Jika terjadi Overflow, maka nilai register tadi akan menjadi 0.
2) ZF (Zero Flag)
Bernilai 1 jika kita melakukan operasi atau instruksi yang menghasilkan 0
3) SF (Sign Flag)
Bernilai 1 jika hasil operasi bernilai Negatif, dan bernilai 0 jika hasil operasi
bernilai Positif
4) OF (Overflow Flag)
Sama seperti CF (carry Flag), tetapi OF digunakan ketika melakukan operasi
dengan nilai bertanda(Positif/Negatif)
5) PF (Parity Flag)
Flag ini bernilai 1 jika hasil operasi merupakan bilanga genap. Begitupun
sebaliknya.
6) AF (Auxiliary Flag)
Bernilai 1 jika terjadi Overflow setelah melakukan operasi bilangan 4-bit
7) IF (Interrupt Flag)
Flag akan bernilai 1 jika Interrupt berfungsi, dan 0 jika Interrupt tidak berfungsi
8) DF (Directional Flag)
Register ini digunakan saat operasi perbandingan string. Bernilai 0 jika
membandingkan kearah depan, dan bernilai 0 jika membandingkan ke arah
belakang.
Dalam Prosesor Intel versi 80286 dan 80386 keatas, terdapat register tambahan.
Antara lain:
1) PE (Protection Enable)
2)
3)
4)
5)
6)
7)
Bernilai 1 jika system berada pada Protected mode, dan bernilai 0 jika berada
dalam Real mode
MP(Monitor CoProsesor)
Untuk menangani terjadinya instruksi WAIT
EM (Emulate CoProsesor)
Untuk mengemulasikan CoProsesor
TS (Task Switched)
Digunakan dalam Multitasking
ET (Extension Type)
Flag untuk menentukan jenis Prosesor
RF(Resume Flag)
Terdapat pada Prosesor 80386 keatas
VF (Virtual 8086 mode Flag)
Jika bernilai 1, program 16-bit akan dapat dijalankan pada system 32-bit
E. Special Register
Special Register adalah register yang dipakai untuk keperluan tertentu saja,
biasanya dipakai untuk menyimpan konfigurasi processor. Anda sangat tidak
dianjurkan untuk mengakses register ini melalui program anda.
1) Control Register
2) Debug Register
3) Test Register
BAB II
Dasar - Dasar Assembly
Assembly
bly
2) WinASM
Sebenarnya,
ya, WinASM
WinA
adalah IDE yang dibuat khusus untuk MASM.
M
Namun,
tidak ada salahnya jika anda ingin memakainya sebagai
ai IDE Flat
Fl Assembler.
3) Notepad++
Lupakan dan buang
buan jauh Notepad. Sekarang saatnya beralih menggunakan
m
Notepad++.
+. Notepad++
Notep
merupakan sebuah text editorr yang memiliki
m
banyak
tambahan fitur, salah
sa satunya adalah syntax highlighting.
ing. Sela
Selain dipakai
untuk menulis
ulis kode
kod dengan syntax assembly, dengan Notepad++
Notep
kita juga
dapat menulis
ulis kode
kod dengan syntax bahasa lain. Tampilannya
ilannya Notepad++
N
mudah disesuaika
esuaikan, ringan dan juga stabil. Selain itu, Notepad++
Notepad juga
dikembangkan
gkan secara
sec
cross-platform, kita bisa menjalankanny
lankannya di Windows
dan Sistem berbasis
berbas Linux. Saya sangat merekomendasikan
asikan untuk
un
memakai
Notepad++.
2) Cara Manual
Pertama kita
ita harus
haru membuka Comand Prompt
Ketikkan [LokasiC
LokasiCompilerFASM.exe] [sourcecode] [output]
utput]
misal : C:\Program
Programs\Flat Assembler\FASM.EXE C:\test.asm
est.asm C:\test.exe
Cara ini kurang
rang efektif,
efe
untuk itu kita coba menyalin compiler
mpiler FASM.EXE
menuju Windows
indows directory,
d
C:\WINDOWS\FASM.EXE. Deng
engan demikian
kita hanya perlu m
mengetikkan :
FASM.EXE
E [sourc
[sourcecode] [output]
2.
Memahami Penulisan
an Instruksi
Instru pada Flat Assembler
Dalam penulisan kode,
de, banyak
bany hal yang harus kita mengerti sebelum
elum melangkah
m
lebih
jauh. Sebagian perintah
ntah dapat
dap kita tulis biasa, namun ada juga beberapa
eberapa perintah yang
perlu diperhatikan struktur
truktur penulisannya.
p
A. Operand
Operand merupakan
akan pilihan
pili
atau opsi untuk menentukan fungsi
ngsi yang
yan spesifik dari
sebuah instruksi.i. Sebagian
Sebagi besar instruksi membutuhkan operand,
erand, dan
d sisanya
sama sekali tidakk membutuhkan
memb
operand. Operand dapat berupa
erupa register,
re
data
(Memori), konstanta
anta atau
ata sebuah nilai (Immediate). Penulisan
an operand
ope
juga harus
diperhatikan, beberapa
berapa operand tidak memperbolehkan kode
de tertentu.
terten Selain itu,
banyak juga instruksi yang tidak dapat menggunakan data(Memori) pada kedua
operand yang diminta.
B. Case Sensitive
Flat Assembler bersifat Case Sensitive pada segala kode yang bukan tergolong
instruksi dan direktif, artinya penulisan huruf kecil dan kapital dianggap berbeda.
Misal pada kata Aku dan aKu.
C. Penulisan String dan Angka
Kode yang dimaksudkan sebagai huruf atau kalimat tidak dapat ditulis langsung.
Penulisan kalimat harus diapit tanda petik. Misal, ??? atau ???. Hal ini
ditijukan untuk membedakan instruksi, angka dan string. Penulisan yang tidak
sesuai aturan dapat menimbulkan error saat proses kompilasi. Begitu juga dengan
penulisan angka. Ingat, penulisan angka selain desimal harus ditandai dengan
karakter tipe bilangan pada bagian belakang bilangan, seperti yang dijelaskan pada
bab 2.
3.
Pemahaman Dasar
Contoh:
Data1 DB ?
Data DB 20
Ukuran
1 Byte
2 Byte
4 Byte
6 Byte
8 Byte
10 Byte
Karakter DB a
Panjang DW 0
Note:
Nilai data ? , sama dengan 0
Data yang merupakan karakter harus diberi tanda kutip ( )
Nilai data tidak boleh melampaui yang diperbolehkan
B. Membuat Array pada Variable
Array merupakan sekumpulan variable atau data yang mempresentasikan
daftar yang memiliki type data yang sama.
Syntax :
NamaData TypeData JumlahData DUP (NilaiData)
Contoh:
DataArray
DW
DUP (100)
Contoh :
Data1 EQU 0
Data EQU 20h
Karakter EQU A
Note :
Konstanta tidak dapat dibentuk Array
3.2. Label
Label adalah suatu nama yang digunakan untuk menandakan lokasi tertentu
dalam program. Nama label tidak akan dimasukkan dalam program, label hanya
membantu seorang programmer dalam menentukan lokasi dalam program
tanpa harus melakukan perhitungan. Label ada 2 jenis
1) Label biasa
label biasa digunakan untuk menandai segala sudut program. Nama masingmasing label tidak boleh sama.
Label:
2) Label tak bernama(Anonymous label)
Fitur unik yang dimiliki FASM adalah anonymous label. Label ini dapat
menandai suatu sudut program dengan nama yang keseluruhannya sama.
label ini diakses dengan aturan berikut:
@f , menunjuk anonymous label bagian bawah terdekat
@b dan @r, menuju anonymous label bagian atas terdekat
@@:
3.3. Komentar
Terkadang, ada beberapa kode yang perlu digaris bawahi atau penting untuk
diingat. Seperti halnya bahasa pemrograman lain, assembly juga memberikan
kita fitur komentar. Untuk memberikan komentar, kita hanya perlu memberikan
symbol ; di belakang kalimat komentar.
Syntax :
;Komentar
Contoh :
;Ini contoh baris komentar
MOV BL,A
;Copy nilai dari BL ke AL
MOV AL,BL
MOV AH,0Eh
;Cetak!
INT 10h
;Tunggu
MOV AH,0
INT 16h
RET
Operand 2
Register
Memori
Register
Immediate
Immediate
Register
Segment Register
Memori
Segment Register
Contoh :
MOV BX,25
MOV CX,BX
MOV AL,200
;Hasil -> BX:CX : 25, AL : 200
2) MOVZX
Kita telah mengetahui bahwa data yang disalin dengan instruksi MOV
harus berukuran sama dengan Operand tujuannya. Jika ukuran Operand
Tujuan lebih besar, kita dapat memakai instruksi ini sebagai alternatif.
Dalam hal ini, Operand1 sebagai Tujuan (Lebih besar) dan Operand2
sebagai Sumber (Lebih kecil).
Syntax :
MOVZX Operand1,Operand2
Contoh :
MOVZX EAX,BX
MOVZX EBX,CL
MOVZX AX,DL
3) XCHG (Exchange)
Instruksi ini dipakai untuk menukar data antar kedua operand.
Syntax :
XCHG Operand1,Operand2
Contoh :
MOV AL,100
MOV AH,200
XCHG AL,AH
;Hasil -> AL : 200, AH : 100
Operand 2
Register
Memori
Register
Immediate
Immediate
1) ADD (Add)
Menambahkan nilai Operand1 (Tujuan) dengan Operand2 (Sumber).
Hasilnya akan disimpan di Operand1.
Syntax :
ADD Operand1,Operand2
Contoh :
ADD AX,BX
ADD EAX,EBX
ADD AH, 10
3) CMP (Compare)
Membandingkan nilai antara kedua operand. Hasil dari perbandingan
nantinya akan merubah nilai dari flag register berdasarkan nilai yang
dibandingkan.
Syntax :
CMP Operand1,Operand2
Contoh :
SUB AX ,
SUB AL ,
BX
200
Bit 1
0
Bit 2
0
Hasil
0
1
0
1
0
1
1
1
1
1
Syntax :
OR Operand1,Operand2
Contoh :
MOV AL,10110001b
OR AL,11111111b
;Hasil -> AL : 11111111b
5) SUB (Substract)
Mengurangi nilai Operand1 (Tujuan) dengan Operand2 (Sumber).
Hasilnya akan disimpan di Operand1.
Syntax :
SUB Operand1,Operand2
Contoh :
SUB AX ,
SUB AL ,
BX
200
6) TEST
Instruksi ini dipakai untuk mengetahui apakah nilai bit bernilai 1 pada
Operand2 sama dengan bit yang berada pada Operand1. Berikutnya, jika
sama, Zero Flag(ZF) akan bernilai 0 begitu juga sebaliknya. Operasi ini
sama sekali tidak mengubah nilai dari kedua operand.
Syntax :
INC Operand1,Operand2
Contoh :
MOV AL,10001001b
TEST AL,1000000b
;Hasil -> ZF : 0
TEST AL,10001001b
;Hasil -> ZF : 0
TEST AL,10000001b
;Hasil -> ZF : 0
TEST AL,01000000b
;Hasil -> ZF : 1
TEST AL,10100001b
;Hasil -> ZF : 1
Contoh :
MOV AL,10000001b
MOV AH,11110000b
XOR AL,AH
;Hasil -> AL : 01110001b
Grup 2
Operand yang diperbolehkan untuk instruksi grup 2 :
Operand yang diperbolehkan
Register
Memori
MUL Operand
aturan :
Jika Operand Byte, AX = AL x Operand
Jika Operand Word, (DX AX) = AX x Operand
Jika Operand DoubleWord, (EDX EAX) = EAX x Operand
Contoh :
MOV
MOV
;AX
MUL
AL,2
BL,4
= AL x Operand (BL)
BL
Kode 2 :
MOV AL,-1
Sekarang, coba lihat kedua kode diatas. Pada kode 1, kita memindahkan
angka 255 kedalam reigster AL dan pada kode 2, kita memindahkan -1
kedalam AL.Karena -1 merupakan bilangan bertanda, maka compiler
secara otomatis akan mengubah -1 menjadi angka 255 saat proses
kompilasi. Kesimpulannya, kedua kode tersebut memiliki tujuan yang
sama, yaitu memindahkan angka 255 ke dalam register AL (Ingat,
komputer tidak mengerti negatif & positif).
Syntax :
IMUL Operand
Contoh :
hasil sama :
MOV AL,253
MOV BL,2
;AX = AL x Operand (BL)
IMUL BL
;Hasil -> AX = -6 (250)
Pada instruksi diatas, kita akan mendapatkan hasil -6 atau 250. Jika kita
hanya memakai instruksi MUL, maka hasil dari perkalian tersebut 253 x 2
= 506. Kesimulannya, instruksi ini akan menganggap bilangan yang
dihitung merupakan bilangan yang dapat memiliki tanda negatif.
3) DIV (Unsigned Division)
Untuk melakukan operasi pembagian bilangan tak bertanda.
Syntax :
DIV Operand
aturan :
Jika Operand Byte, AL = AX / Operand, Sisa disimpan pada AH
Jika Operand Word, AX = (DX AX) / Operand, Sisa disimpan pada DX
Jika Operand DoubleWord, EAX = (EDX EAX) / Operand, Sisa disimpan
pada EDX
Contoh :
MOV
MOV
;AL
DIV
AX,8
BL,2
= AX / Operand (BL)
BL
MOV BL,2
;AL = AX / Operand (BL)
DIV BL
Grup 3
Operand yang diperbolehkan :
Operand yang diperbolehkan
Register
Memori
2) NEG (Negate)
Untuk Mengubah nilai operand menjadi nilai negatif (bertanda) atau
sebaliknya (Lihat bab 1 tentang bilangan bertanda).
Syntax :
NEG Operand
Contoh :
MOV BL,1
NEG BL
;Hasil -> BL : -1 (255)
NEG BL
;Hasil -> BL : 1
MOV AL,254
;-2 = 254
NEG AL
;Hasil -> AL : 2
NEG AL
;Hasil -> AL : -2 (254)
Bit Hasil
1
0
Syntax :
NOT Operand
Contoh :
MOV BL,10000001b
NOT BL
;Hasil -> BL : 01111110b
2) LOOP (Loop)
Mengulang instruksi. Proses looping ini akan terus dilakukan hingga CX =
0.
Contohny
ontohnya adalah keyboard. Ketika salah satu
u tombo
tombol pada
keyboard
eyboard ditekan, maka Prosesor akan mengalami
alami interupsi.
in
Ini
ditujukan
itujukan agar system operasi bisa mengetahuii tombo
tombol apa yang baru
saja
aja ditek
ditekan.
Software
oftware Interrupt, yaitu interupsi yang dihasilkan
kan oleh
ole software.
Tujuan
ujuan di
dibuatnya software interrupt berbeda dengan hardware
interrupt.
terrupt. Software interrupt dibuat khusus untuk
ntuk melayani
me
program.
rogram. Contoh software interrupt :
DOS Interrupt
Interrupt ini ada pada system operasi turunan DOS
(termasuk Windows). Untuk meminta Interupsi
Interup ini kita dapat
menggunakan instruksi INT dengan nomor
omor interupsi
int
33 (21h).
BIOS Interrupt
Interupsi ini secara default selalu ada pada komputer.
kom
Interupsi ini bernomor 16 (10h). Pada interups
interupsi ini kita dapat
memakai beberapa layanan untuk Input
ut dan Output.
Ou
Interrupt
pt biasanya
biasa
dapat melakukan banyak layanan/fungs
an/fungsi, untuk
memilih
ih layanan
layana mana yang ingin digunakan, biasanya
anya sua
suatu interupsi
menggunakan
unakan salah satu register untuk menentukan
an nomor
nomo layanannya.
Contohnya
hnya DOS dan BIOS interrupt, kedua interupsi
si tersebut
terseb
menggunakan
unakan register AH untuk menentukan layanan
nan yang
yan ingin
diminta.
Contoh pemak
pemakaian :
INT 10h Service 14 (0Eh)
AH = 14 untuk mencetak karakter.
AL = Kar
rakter yang ingin dicetak.
ORG
MOV
MOV
INT
mov
int
RET
100h
h
AH,1
14
AL,
A
10h
ah,0
0
16h
Stack
Kata Stack memiliki arti Tumpukan. Dalam assembly stack diartikan sebagai
bagian di dalam memori yang disediakan untuk menaruh data sementara. Lokasi stack
dapat ketahui dengan melihat nilai SP (Stack Pointer) dan SS (Stack Segment).
Misal nilai Stack Pointer awalnya adalah 9, maka setelah dilakukan instruksi
diatas memori akan berisi data sebagai berikut.
Memori
Alamat 0 1 2 3 4 5 6 7 8 9 10
Isi
0 0 65000
100000
100
0
4.2. Instruksi POP
Kebalikan instruksi PUSH adalah instruksi POP. Instruksi ini digunakan untuk
mengambil data dari lokasi stack.
POP Operand
Contoh setelah nilai dari hasil instruksi PUSH diatas diambil dengan instruksi
POP :
POP AX
;sekarang AX berisi 65000
POP EBX
;sekarang EBX berisi 100000
;nilai 100 masih tetap utuh dalam memori
Alamat 0
Isi
0
1
0
2
0
3
0
Memori
4 5 6
0 0 0
7
0
9
100
10
0
Note :
Operand yang diperbolehkan pada instruksi PUSH dan POP
Kedua instruksi ini tidak dapat dipakai untuk bilangan dibawah 16 bit !
Operand yang diperbolehkan :
Operand
Register (Diatas 8-bit)
Memori (Diatas 8-bit)
Segment Register
Immediate
5. Jump
Dalam bagian ini akan dibahas penggunaan instruksi jumping. Instruksi jumping
digunakan untuk melompat menuju label atau lokasi tertentu di memori.
A. Unconditional Jump
Untuk melompat tanpa memerhatikan nilai dari flag register.
Syntax :
JMP Label
Contoh :
ORG 100h
MOV AL,100
JMP LabelX
Data db a
LabelX :
RET
B. Conditional Jump
Pada kelas X SMA kita sudah sering menyelesaikan operasi Logika. Inilah
manfaatnya mengapa kita mempelajari bab Logika. Tidak seperti instruksi
JMP, conditional jump merupakan lompatan yang dilakukan berdasarkan
nilai bit pada flag register. Biasanya instruksi-instruksi conditional jump
dipakai setelah instruksi matematika dan logika seperti CMP, TEST, AND dan
OR.
Jxx Label
Instruksi Conditional jump tidak hanya terdiri atas sebuah instruksi saja, akan
tetapi terdiri dari instruksi instruksi berikut. Setiap instruksi digunakan dalam
keadaan yang berbeda-beda.
Untuk memudahkan memahami conditional jump, instruksi-instruksi
tersebut dikelompokkan sebagai berikut:
1) Instruksi berdasarkan sebuah nilai flag
Instruksi
Kegunaan
Kondisi Flag
JZ(Jump if Zero)
Lompat jika
ZF = 1
sama(kosong)
JE(Jump if Equal)
CF = 1
JC (Jump if Carry)
Lompat jika terjadi
overflow bilangan tak
bertanda
JB(Jump if Below)
Lompat jika lebih kecil
JNAE(Jump if Not Above Lompat jika tidak lebih
or Equal)
besar atau sama
JS(Jump if Sign)
Lompat jika bertanda
SF = 1
JO
Lompat jika terjadi
OF = 1
overflow bilangan
bertanda
JP(Jump if Parity)
Lompat jika genap
PF = 1
JPE(Jump if Parity or
Lompat jika genap atau
Equal)
sama dengan
JNZ(Jump if Not Zero)
Lompat jika tidak sama
ZF = 0
JNE(Jump if Not Equal)
JNC(Jump if Not Carry)
Lompat jika tidak terjadi
CF = 0
overflow bilangan tak
bertanda
JNB(Jump if Not Below)
Lompat jika tidak lebih
kecil
JAE(Jump if Above or
Lompat jika lebih besar
Equal)
atau sama dengan
JNS(Jump if Not Signed)
Lompat jika tidak
SF = 0
bertanda
JNO(Jump if Not
Lompat jika tidak terjadi
OF = 0
Overflow)
overflow
JPO(Jump if Parity or
Lompat jika terjadi
PF = 0
Overflow)
overflow bilangan
bertanda atau genap
JNP(Jump if Not Parity)
Lompat jika ganjil
Kegunaan
Lompat jika sama(kosong)
Kondisi Flag
ZF = 1
ZF = 0
ZF = 0
dan
SF = OF
SF OF
SF = OF
ZF = 1
Kondisi Flag
ZF = 1
ZF = 0
CF = 0
dan
ZF = 0
CF = 1
CF = 0
JNB(Jump if Not
Lompat jika tidak lebih
Below)
kecil
JNC(Jump if Not Carry) Lompat jika tidak
terjadi overflow
bilangan tak bertanda
JBE(Jump if Below or
Lompat jika lebih kecil
Equal)
atau sama dengan
JNA(Jump if Not
Lompat jika tidak lebih
Above)
besar
CF = 1
atau
ZF = 1
JMP SELESAI
YA_LEBIHBESAR :
;Aksi 1
SELESAI :
MOV [Data1],1
RET
Contoh lain :
;Jika AX = BX > tunggu keyboard di tekan, lalu keluar
;Jika AX x BX > langsung keluar
ORG 100h
MOV AX, 100
MOV BX, 100
CMP AX,BX
JE SAMA
TIDAK :
RET
SAMA :
MOV AH,0
INT 16H
RET
6.
Looping
Untuk mengulang blok instruksi kita dapat menggunakan instruksi looping. Instruksi
Looping ada 2 jenis:
A. Unconditional Loop
Melakukan perulangan hingga nilai register CX = 0
LOOP Label
Contoh :
MOV ECX,10
Ulang :
ADD EAX, 5
SUB EAX, 1
LOOP Ulang
RET
Kita tidak perlu menggunakan instruksi SUB CX,1 atau DEC CX; karena setiap
instruksi diulang nilai CX akan berkurang dengan sendirinya.
B. Conditional Loop
Melakukan perulangan hingga Flag register bernilai sesuai keinginan.
Instruksi
Kegunaan
LOOPE
Melakukan perulangan
hingga ZF = 1
(bilangan bertanda)
Melakukan perulangan
hingga ZF = 1
(bilangan tak bertanda)
Melakukan perulangan
hingga ZF = 0
(bilangan bertanda)
Melakukan perulangan
hingga ZF = 0
(bilangan tak bertanda)
LOOPZ
LOOPNE
LOOPNZ
7. Addressing
Addressing atau pengalamatan merupakan cara yang digunakan Prosesor untuk
melakukan perpindahan dari dari memori menuju register atau dari register menuju
memori. Macam-macam Addressing :
1) Immediate Addressing
Immediate addressing merupakan pemindahan data secara langsung menuju
Register.
Syntax :
MOV Register,Nilai
Contoh :
MOV
MOV
MOV
MOV
AL,255
DH,255
AX,65535
ECX,2000
2) Register Addressing
Register addressing merupakan penyalinan data antar register.
Syntax :
MOV RegisterTujuan,RegisterSumber
Contoh :
MOV
MOV
MOV
MOV
MOV
MOV
MOV
AL,DL
DH,DL
AL,CH
AX,CX
DX,AX
ECX,EAX
EBX,ECX
3) Direct Addressing
Direct addressing merupakan teknik penyalinan data dari Variabel menuju
memori atau sebaliknya.
Syntax :
MOV Register,Data
Contoh :
JMP MULAI
DataKu DB 10
MULAI:
MOV AL,DataKu
MOV BH,DataKu
[BX + Displacement]
Contoh :
ORG 100h
JMP MULAI
DataKu DB a, b, c, d, e
MULAI:
;instruksi ini akan mengambil alamat offset PERTAMA
;dari DataKu ( a )
LEA BX,[DataKu]
;salin data yang berada pada offset yang ditunjuk
;BX + Displacement : 2, maka BX berisi alamat offset yang
;menunjuk ( c ) >> Salin ke AL
MOV AL,[BX + 2]
;untuk membuktikannya, coba kita cetak AL
MOV AH,0Eh
INT 10H
;tunggu keyboard press
MOV AH,0
INT 16H
RET
Contoh :
ORG 100h
JMP MULAI
DataKu DB a, b, c, d, e
MULAI:
;instruksi ini akan mengambil alamat offset PERTAMA
;dari DataKu ( a )
MOV SI,[DataKu]
;salin data yang berada pada offset yang ditunjuk
;SI + Displacement : 3, maka SI berisi alamat offset yang
;menunjuk ( d ) >> Salin ke AL
mov AL,[SI + 3]
;untuk membuktikannya, coba kita cetak AL
MOV AH,0eh
INT 10h
;tunggu keyboard press
MOV AH,0
INT 16h
RET
8.1. ASCII
Kita sudah mengetahui bahwa komputer hanya mengenal angka 0 dan 1 yang
sering disebut dengan binary digit atau bit. Kombinasi dari bit tersebut dapat
mewakili angka tertentu. Tapi bagaimana dengan huruf dan simbol? Bagaimana
di layar monitor kita bisa tercetak huruf dan simbol, sementara komputer hanya
mengetahui angka?
American Standart Code for Information Interchange atau disingkat ASCII
merupakan suatu standar internasional untuk menunjukkan kode dari huruf dan
simbol. Misalnya kita menggunakan angka 97 untuk menampilkan huruf a.
Jumlah keseluruhan kode ASCII ada 255. Kode bernomor 0 127 dipakai untuk
memanipulasi teks, dan sisanya dipakai untuk memanipulasi grafik.
Berikut daftar kode ASCII yang digunakan untuk memanipulasi teks :
Kar
Hex
Dec
Keterangan
Kar
Hex
Dec
Keterangan
NUL
0000
Null (!)
005C
92
Backslash
SOH
0001
005D
93
STX
0002
005E
94
Tanda pangkat
ETX
0003
005F
95
EOT
0004
0060
96
ENQ
0005
Enquiry (!)
0061
97
ACK
0006
Acknowledge (!)
0062
98
BELL
0007
Bell (!)
0063
99
BS
0008
Backspace
0064
100
HT
0009
Horizontal tabulation
0065
101
LF
000A
10
0066
102
VT
000B
11
Tabulasi vertikal
0067
103
FF
000C
12
0068
104
CR
000D
13
0069
105
SO
000E
14
006A
106
SI
000F
15
Shift in (!)
006B
107
DLE
0010
16
006C
108
DC1
0011
17
006D
109
DC2
0012
18
006E
110
DC3
0013
19
006F
111
DC4
0014
20
0070
112
NAK
0015
21
0071
113
SYN
0016
22
0072
114
ETB
0017
23
0073
115
CAN
0018
24
Cancel (!)
0074
116
EM
0019
25
0075
117
SUB
001A
26
Substitute (!)
0076
118
ESC
001B
27
Escape (!)
0077
119
FS
001C
28
File separator
0078
120
GS
001D
29
Group separator
0079
121
RS
001E
30
Record separator
007A
122
US
001F
31
Unit separator
007B
123
SP
0020
32
Spasi
007C
124
0021
33
007D
125
"
0022
34
007E
126
Karakter gelombang
(tilde)
0023
35
DEL
007F
127
Delete
0024
36
0080
128
Dicadangkan
0025
37
Tanda persen
0081
129
Dicadangkan
&
0026
38
0082
130
Dicadangkan
0027
39
Karakter Apostrof
0083
131
Dicadangkan
0028
40
IND
0084
132
Index
0029
41
NEL
0085
133
Next line
002A
42
SSA
0086
134
002B
43
ESA
0087
135
002C
44
Karakter koma
0088
136
002D
45
0089
137
002E
46
Tanda titik
008A
138
002F
47
PLD
008B
139
0030
48
Angka nol
PLU
008C
140
Partial line up
0031
49
Angka satu
008D
141
0032
50
Angka dua
SS2
008E
142
0033
51
Angka tiga
SS3
008F
143
0034
52
Angka empat
DCS
0090
144
0035
53
Angka lima
PU1
0091
145
0036
54
Angka enam
PU2
0092
146
0037
55
Angka tujuh
STS
0093
147
0038
56
Angka delapan
CCH
0094
148
Cancel character
0039
57
Angka sembilan
MW
0095
149
Message waiting
003A
58
0096
150
003B
59
0097
151
<
003C
60
0098
152
Start of string
003D
61
0099
153
Dicadangkan
>
003E
62
009A
154
Single character
introducer
003F
63
Tanda tanya
CSI
009B
155
Control sequence
introducer
0040
64
A keong (@)
ST
009C
156
String terminator
0041
65
OSC
009D
157
Operating system
command
0042
66
PM
009E
158
Privacy message
0043
67
APC
009F
158
0044
68
00A0
160
0045
69
00A1
161
0046
70
00A2
162
0047
71
00A3
163
Tanda Poundsterling
0048
72
00A4
164
0049
73
00A5
165
Tanda Yen
004A
74
00A6
166
broken bar
004B
72
00A7
167
Section sign
004C
76
00A8
168
Diaeresis
004D
77
00A9
169
004E
78
00AA
170
004F
79
00AB
171
0050
80
00AC
172
Not sign
0051
81
00AD
173
0052
82
00AE
174
0053
83
00AF
175
Macron
0054
84
00B0
176
Tanda derajat
0055
85
00B1
177
0056
86
kodok
178
0057
87
00B3
179
0058
88
00B4
180
Acute accent
0059
89
00B5
181
Micro sign
005A
90
00B6
182
Pilcrow sign
005B
91
00B7
183
Middle dot
Diatas adalah spesifikasi dari penggunaan instruksi berdasarkan data yang akan
diproses. Sedangkan instruksi sebenarnya adalah sebagai berikut :
Note : x adalah tipe data yang akan diproses.
1) Instruksi LODSx (Load String)
Pada bab sebelumnya kita masih menggunakan instruksi MOV untuk
memindahkan karakter yang ingin dicetak menuju register AL, belum lagi
kita harus men-increment register yang digunakan sebagai pointer. Untuk
itu, kita dapat menggunakan instruksi LODS sebagai penggantinya, karena
instruksi ini jauh lebih praktis dan tidak membutuhkan banyak cycle. Instruksi
LODS dipakai untuk menyalin data yang di tunjuk oleh register SI menuju ke
Accumulator Register. Setelah itu, secara nilai dari register SI akan ditambah.
LODSx
ORG 256
;Simpan alamat DATAKU di SI
MOV SI,DATAKU
LODSB
;Hasil -> AL : Data yang ditunjuk oleh SI
;Cetak
MOV AH,0Eh
INT 10H
;Keluar
MOV AH,0
INT 16h
RET
DATAKU DB 'A'
DATA2 DW ?
MOV AX,1200
MOV DI,DATA1
STOSW
;Hasil -> DATA1 : AX : 1200
RET
DATA1 DW ?
9. Membuat Prosedur
Prosedur merupakan kumpulan instruksi yang dapat dipanggil oleh program. Kita
dianjurkan membuat sebuah prosedur apabila ada sekumpulan instruksi yang akan
sering kita pakai ketika program berjalan. Untuk membuat sebuah prosedur, kita harus
menentukan nama prosedur yang akan kita buat. Lalu, di baris berikutnya adalah
instruksi-instruksi yang dilakukan ketika prosedur dipanggil dan di baris terakhir, kita
HARUS menyertakan instruksi RET untuk menandakan berakhirnya prosedur.
NamaProsedur :
instruksi1
instruksi2
instruksi3
. . .
RET
adalah mengembalikan nilai EIP dari stack. Jika kita tidak menuliskan instruksi RET
program kita PASTI terjadi kesalahan.
ORG 100H
CALL CETAKA
MOV AH,0
INT 16H
;RET yang ini berfungsi untuk mengembalikan ke system,
;Jika terjadi, maka otomatis program akan berhenti.
RET
CETAKA :
MOV AH,0EH
MOV AL, A
RET
BAB III
Memperd
Memperdalam
Syntax FASM
Wohoo!!!
Apakah
ah and
anda sudah siap?
Buku ini akan
ak membawa anda ke dalam dunia
Assembly...
bly...
Bersiaplah
aplah !
Buku ini disusun
dis
secara sistmatis dan terstruktur.
Agar anda d
dapat menguasai Assembly dengan
cepat.. Bacala
Bacalah dengan beurutan dan jangan pernah
lewatkan
kan ra
rahasia menarik Assembly.
Contoh :
;Struktur data untuk MURID SMA
struc MURIDSMA kelas,gugus,absen
{
.kelas DB kelas
.gugus DB gugus
.absen DB absen
}
;Program COM
ORG 100h
;Ivan adalah Murid SMA kelas 1 gugus 1 absen 21
Ivan MURIDSMA 1,1,21
;Mega adalah Murid SMA kelas 1 gugus 3 absen 30
Mega MURIDSMA 1,3,30
;Pindah ke kelas 1 gugus 3 absen 21
IvanPindahKelas :
MOV [Ivan.kelas],1
MOV [Ivan.gugus],3
MOV [Ivan.absen],21
RET
3. Control Directives
Control directives merupakan direktif yang ditulis mengatur proses compile.
3.1. Numerical Constant
Numerical constant tidak beda jauh dengan konstanta. Bedanya, Numerical
constant ini tidak hanya digunakan dalam instruksi saja, konstanta ini juga dipakai
untuk pengolahan direktif. Nilai ini dapat diubah nilainya melalui proses direktif
lain.
Nama = Nilai
Contoh :
kons = 1
if Kons = 1
mov eax,Kons
else
mov eax,0
end if
1
2
3
4
5
bilangan = bilangan + 1
end repeat
4. Preprocessor Directive
Direktif ini dipakai untuk keperluan yang perlu dilakukan compiler sebelum proses
compile.
4.1. include
Program Assembly memerlukan kode yang cukup banyak, sehingga kita sering
lupa beberapa fungsional kode. Untuk mengatasi hal ini, kita perlu memisahmisahkan kode menjadi beberapa bagian sesuai dengan fungsinya. Untuk
menghubungkan semua file tersebut kita harus menggunakan direktif include pada
bagian kode utama.
include namafile1
include namafile2
4.2. fix
Lebih cepat dan mudah adalah kelebihan dari FASM. Hal ini dapat kita buktikan
dengan memakai direktif fix. Direktif ini dapat membantu kita menyingkat sintax
yang panjang atau mengubah syntax tersebut sesuai keinginan kita.
Nama fix Instruksi
Contoh:
incl fix include
tambah fix add
incl win32.ax.inc
;sama seperti include win32.ax.inc
tambah ax,bx
;sama seperti add ax,bx
5. Formatter Directive
Direktif ini dipakai untuk menentukan format yang dihasilkan dari proses compile
5.1. use16, use32 dan use64
Prosesor 32-bit memiliki tambahan instruksi serta penambahan dan pembaharuan
opcode. Jika kita mencoba menjalankan program dengan tipe yang salah atau tidak
didukung oleh sistem, maka akan terjadi error. Secara otomatis, jika kita
menuliskan direktif, jenis kode yang dihasilkan telah ditentukan oleh compiler,
namun jika kita menginginkan, direktif ini dapat ditulis untuk menentukan jenis
kode hasil keluaran compiler sesuai keinginan kita.
5.2. format
File EXE dan DLL merupakan file yang terbentuk dari struktur PE(Portable
Executable) yang sangat kompleks. Setiap byte nya menyimpan informasi agar
program dapat berjalan tanpa kesalahan Program. Program ini juga memerlukan
beberapa ruang untuk dikosongkan(aligned), untuk melakukan hal ini diperlukan
pemahaman yang lebih mendalam. Oleh karena itu, FASM menyediakan direktif ini
dipakai untuk menentukan jenis program keluaran dari hasil compile, sehingga kita
dapat membuat program lebih mudah dan cepat tanpa harus mendalami struktur
program tersebut. Direktif ini harus berada di bagian teratas.
format Tipe
tipe yang tersedia:
MZ : Membuat program EXE 16-bit
PE : Membuat program EXE 32-bit
ELF : Membuat program untuk Linux
BINARY : Membuat program real binary file.
BAB V
Membua Program 16 -bit
Membuat
Banyak
ak sek
sekali konsep konsep yang harus kita
mengerti
erti dan
da hafalkan dalam assembly.
Menghafal
hafal ssecara buka bukaan (langsung)
bukanlah
nlah hal
ha menyenangkan, oleh karena itu
disinii disedi
disediakan contoh program untuk latihan
dan praktek
raktek agar anda dapat menguasai assembly
tanpa terlalu banyak menghafal.
Contoh :
ORG
MOV
MOV
INT
100h
AH, 0Eh
AL, A
10h
Contoh :
ORG
MOV
MOV
INT
100h
AH, 6
DL, D
21h
Contoh :
ORG 100h
JMP MULAI
Kalimat DB Mencetak Kalimat dengan DOS Interrupt !$
MULAI :
MOV AH, 9
LEA DX,[Kalimat]
INT 21h
;Tunggu user menekan tombol di keyboard
MOV AH, 0
INT 16h
;jika sudah, keluar
RET
Note : Kalimat yang akan dicetak HARUS selalu berakhiran simbol dollar ( $ )
B. Cetak hingga CX = 0
Teknik ini juga dipakai pada Linux. CX merupakan jumlah karakter pada kalimat
yang akan dicetak.
ORG 100h
JMP MULAI
Kalimat DB ABCDEFGHIJ
MULAI :
;Load alamat dari Kalimat ke register SI
MOV SI,Kalimat
;CX = Jumlah karakter pada Kalimat
MOV CX,10
PRINT :
MOV AL,[SI]
MOV AH,0Eh
INT 10h
;SI = SI + 1
INC SI
;LOOP Hingga CX = 0
LOOP PRINT
;Tunggu user menekan tombol di keyboard
MOV AH, 0
INT 16h
;jika sudah, keluar
RET
Langkah kedua, kita harus mengubah masing-masing angka tadi kedalam kode
ASCII. untuk melakukan hal ini, kita hanya perlu menambah angka yang akan
diubah dengan 48.
4
3
2
1
4 + 48 = 52
3 + 48 = 51
2 + 48 = 50
1 + 48 = 49
MOV BX,2
MOV CX,0
BAGI:
;kosongkan sisa pembagian
MOV DX,0
;AX = AX / BX | Sisa : DX
DIV BX
;Simpan sisa ke stack
PUSH DX
;Jumlah karakter += 1
INC CX
;Jika sisa = 0, mulai cetak angka
CMP AX,0
JE PRINT
JMP BAGI
PRINT:
;Kembalikan sisa tadi satu per satu, hingga CX = 0
POP AX
;ubah ke ASCII
ADD AL,48
;Cetak !
MOV AH,0EH
INT 10H
LOOP PRINT
MOV AH,0
INT 16H
RET
Byte 2
Digunakan sistem untuk menyimpan
berapa jumlah karakter yang telah
masuh dalam buffer.
Byte 3 - ???
Dipakai untuk Buffer
entry SegKode:0
stack 1000
;;;;;;;;;;;;;;;;;;;;;;
segment SegData
;;
kal1 db 'Hai ?',0
;;
;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;
segment SegKode
;;
mov si,kal1
;;
mov ax,SegData
;;
mov ds,ax
;;
mov es,ax
;;
;;
;;
.print:
lodsb
;;
cmp al,0
;;
je .ok
;;
mov ah,0eh
;;
int 10h
;;
jmp .print
;;
.ok:
;;
mov ah,0eh
;;
int 10h
;;
mov ah,0
;;
int 16h
;;
;;;;;;;;;;;;;;;;;;;;;;
Pada SegKode, kita mencoba mengubah DS dan ES menjadi suatu nilai yang disimpan
SegData. Ini bertujuan agar kita dapat mengakses data program yang direlokasi oleh
sistem menuju suatu segment yang belum kita ketahui.
O iya, kode di atas masih memakai 1 segment untuk menyimpan kode dari program.
Jika program yang berukuran lebih besar, coba lihat dan pahami contoh berikut :
format MZ
stack 1024
entry SegKode1:0
;/// Data Program ///
segment SegData
Pesan1 db "Pesan dari Segment 1 ! ",13,10,0
Pesan2 db "Pesan dari Segment 2 ! ",13,10,0
;/// Kode 1 ///
segment SegKode1
mov ax,SegData
push ax
push ax
pop ds
pop es
mov si,Pesan1
call print1
jmp SegKode2:0
print1:
lodsb
cmp al,0
je .selesai
mov ah,0eh
int 10h
jmp print1
.selesai:
ret
;/// Kode 2 ///
segment SegKode2
mov ax,SegData
push ax
push ax
pop ds
pop es
mov si,Pesan2
call print2
mov ah,0
int 16h
;ret
print2:
lodsb
cmp al,0
je .selesai
mov ah,0eh
int 10h
jmp print2
.selesai:
ret
BAB VI
Membua Program 32 -bit
Membuat
Banyak
ak sek
sekali konsep konsep yang harus kita
mengerti
erti dan
da hafalkan dalam assembly.
Menghafal
hafal ssecara buka bukaan (langsung)
bukanlah
nlah hal
ha menyenangkan, oleh karena itu
disinii disedi
disediakan contoh program untuk latihan
dan praktek
raktek agar anda dapat menguasai assembly
tanpa terlalu banyak menghafal.
diturunkan dari format MS-COFF. Optional Header merupakan bagian tidak wajib bagi
program MS-COFF, karena PE diturunkan dari MS-COFF, sehingga nama struktur ini
masih tetap, walaupun sebenarnya struktur ini wajib ada pada PE.
Section Table : Merupakan sekumpulan data yang menyimpan informasi tentang
semua section yang ada dalam file, seperti nama, ukuran, alamat dan atribut.
Section : Pada program MZ kita sering menggunakan direktif segment
nama_segment. Penggunaan section kurang lebih sama seperti penggunaan segment
pada program MZ. Perbedaannya, disini kita menggunakan model pengalamatan 32-bit
dan tidak lagi memakai segment:offset. Section merupakan bagian yang menyimpan
semua kode dan data yang dipakai program, termasuk resource dan import table.
Secara umum, sebuah program terdapat section berikut:
Code : Section ini dipakai khusus untuk menyimpan kode program.
Data : Section ini dipakai untuk menyimpan data program
Import : Section ini dipakai untuk menyimpan nama-nama API yang akan
digunakan program.
Export : Section ini dipakai untuk menyimpan nama-nama API yang dapat
dipakai untuk program lain. Biasanya section jenis ini hanya dipakai oleh
program DLL, namun dengan bahasa assembly, kita dapat menyimpan API pada
program EXE.
ENTRY LokasiKode
C. macro
Dengan menyertakan macro, kita hanya perlu menentukan section section
dan konten yang ada pada program, jika tidak menyertakannya, kita harus
menuliskan berbaris-baris kode untuk menentukan stub dan header program.
Selain itu, dengan menyertakan macro, kita dapat memanggil API dengan
mudah, yaitu dengan instruksi makro INVOKE. Macro juga menyediakan
struktur data dan nilai konstanta yang sering dipakai dalam pemrograman.
Untuk informasi lebih lanjut, nanti anda akan menemukan bagian berikutnya
D. section
Direktif section dipakai untuk membuat section baru dengan attribute dan
konten yang spesifik.
Syntax:
SECTION NamaSection Tipe Atribut
Note :
NamaSection maksimal berukuran 8 karakter.
Tipe yang diperbolehkan:
code
data
import
export
resource
fixups
Attribut yang diperbolehkan:
executable
readable
writable
E. library & import
PE memiliki kelebihan yang tidak ditemukan pada MZ, yaitu kemampuan
memanggil API, semua API yang digunakan program dapat ditentukan dengan
direktif ini. Direktif library dipakai untuk menyertakan nama DLL pada import
table, sedangkan import dipakai untuk menyertakan nama API yang akan
dipakai
Syntax:
LIBRARY NamaLibrary,NAMADLL.DLL
Note:
NamaLibrary adalah nama library panggilan sesuai keinginan kita,
sedangkan NAMADLL.DLL adalah nama file DLL yang aslinya.
IMPORT NamaLibrary, NamaApiA,NamaApiA
atau
IMPORT NamaLibrary,\
NamaApiA, NamaApiX,\
NamaApiB, NamaApiY,\
NamaApiC, NamaApiZ
Note:
NamaLibrary adalah NamaLibrary yang telah kita deskripsikan dengan
direktif LIBRARY (Bukan nama DLL asli).
NamaApiA, NamaApiB dan NamaApiC adalah nama API panggilan
sesuai keinginan kita, sedangkan NamaApiX, NamaApiY dan NamaApiZ
adalah nama API asli.
Call ExitProcess(0)
jika ditulis dalam assembly:
assemb
Push 0
Call [ExitProcess]
[ExitProcess] merupak
erupakan variable yang menyimpan alamatt API yang
yan telah di load
Windows Loader.
der. Variabel
Vari
ini berada pada import table. Pada FASM,
FAS variable ini
dapat dibuat dengan instruksi macro IMPORT.
PORT.
Bagaimana fungsi
si API yang
ya mengembalikan(return) sebuah nilai?
Sebuah API akan
n mengembalikan
menge
nilai hasil menuju register EAX
GetWindow(hWnd
d As Long,
Lo
uCmd as Long) As Long
;push command
Push 2
;push hwnd
Push 65000
Call [GetWindow]
Mov [hasil],eax
parameter yang
ng dimasukkan
dima
stack secara manual harus terbalik,
erbalik, tidak seperti
menggunak
nggunakan invoke atau Call pada bahasa tingkat
gkat tinggi.
ting
4. Memulai membuat Program
4.1. Membuat Program
am Konsol
Kons
Hingga saat ini sistem
istem op
operasi modern masih belum sepenuhya
hya meninggalkan
men
aplikasi konsol, hal ini ka
karena aplikasi konsol lebih sederhanaa dan leb
lebih cepat
dibuat. Pada PE,, program konsol memiliki struktur yang sama.
a. yang
membedakannyaa adalah pembukaan jendela konsol secara otomati
otomatis. Program GUI
juga masih dapatt membuka
memb
jendela konsol, yaitu dengan memangg
emanggil fungsi
AllocConsole dari
ri KERN
KERNEL32.DLL.
A. Mencetak Kalimat.
Mencetak merupakan hal paling dasar dalam program konsol, karena secara
umum informasi yang ditampilkan pada program konsol adalah teks.
Untuk mencetak, kita tidak perlu lagi merancang sebuah algoritma ataupun
rumus, karena Windows telah menyediakan fungsi API untuk melakukan hal ini.
Fungsi tersebut adalah WriteConsoleA dari KERNEL32.DLL.
WriteConsole (hConsoleOutput, lpBuffer, nNumberOfCharsToWrite,
lpNumberOfCharsWritten, reserved)
hConsoleOutput : Handle dari Console Screen Output Buffer. Nilai ini bisa dicari
dengan GetStdHandle(nStdHandle), dengan nStdHandle =
STD_OUTPUT_HANDLE.
lpBuffer : Pointer atau lokasi teks yang akan dicetak.
nNumberOfCharsToWrite : Jumlah karakter pada lpBuffer yang akan dicetak.
nNumberOfCharsWritten : Pointer lokasi variable untuk menampung jumlah
teks yang telah berhasil dicetak. parameter ini boleh NULL(0)
Reserved : Harus NULL(0)
Jika berhasil, fungsi ini akan mengembalikan 0.
;program Konsol
format PE CONSOLE
entry utama
include 'win32ax.inc'
section 'kode' code readable executable
utama:
;ingat hasil disimpan di EAX
invoke GetStdHandle,STD_OUTPUT_HANDLE
invoke WriteConsole,EAX,kalimat,5,0,0
jmp $
section 'data' data readable writable
kalimat db 'Halo!',0
section 'api' import readable writable
library kernel,'KERNEL32.DLL'
import kernel,\
GetStdHandle,'GetStdHandle',\
WriteConsole,'WriteConsoleA'
A. Membaca Input
Selain mencetak, fungsi yang sering dipakai program konsol adalah membaca
input. Untuk melakukannya, kita menggunakan API bernama ReadConsole dari
KERNEL32.DLL.
ReadConsole(hConsoleInput, lpBuffer, nNumberOfCharsToRead,
lpNumberOfCharsRead, reserved)
hConsoleInput : Handle dari Console Screen Output Buffer. Nilai ini bisa dicari
dengan GetStdHandle(nStdHandle), dengan nStdHandle =
STD_INPUT_HANDLE.
lpBuffer : Pointer atau lokasi teks untuk menyimpan teks yang dibaca.
nNumberOfCharsToRead : Jumlah karakter yang ingin dibaca.
nNumberOfCharsRead : Pointer lokasi variable untuk menampung jumlah
karakter yang telah berhasil dibaca. parameter ini tidak boleh kosong.
Reserved : Harus NULL(0)
Jika berhasil, fungsi ini akan mengembalikan 0.
;program Konsol
format PE CONSOLE
entry utama
include 'win32ax.inc'
section 'kode' code readable executable
utama:
;ingat hasil disimpan di EAX
invoke GetStdHandle,STD_INPUT_HANDLE
invoke ReadConsole,EAX,buffer,10,sudahdibaca,0
;jika sudah, cetak !
invoke GetStdHandle,STD_OUTPUT_HANDLE
invoke WriteConsole,EAX,buffer,10,0,0
jmp $
section 'data' data readable writable
buffer db 11 dup(0)
sudahdibaca dd ?
section 'api' import readable writable
library kernel,'KERNEL32.DLL'
import kernel,\
GetStdHandle,'GetStdHandle',\
ReadConsole,'ReadConsoleA',\
WriteConsole,'WriteConsoleA'
http://www.facebook.com/groups/programmer.OS.Indonesia
Daftar Pustaka
Intel 80386 Programmer's Reference Manual 1986
Emu8086 Documentation
http://id.wikipedia.org
http://www.flatassembler.net
http://www.facebook.com/groups/programmer.OS.Indonesia
http://www.inf.upol.cz/~literakl