Anda di halaman 1dari 86

TEST VERSION !!!

Assemblious
Oleh : Muhammad Irvan Hermawan
Hak Cipta 2012 pada Penulis

Hak Cipta dilindungi undang-undang.


Dilarang memperbanyak atau memindahkan sebagian atau seluruh isi buku ini dalam
bentuk apapun, baik secara elektronis maupun mekanis, termasuk memfotocopy,
merekam atau dengan system penyimpanan lainnya, tanpa izin tetulis dari 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.

Blitar, November 2012


Penulis,

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.

2. Alasan Menggunakan Assembly


Di era digital, banyak bermunculan bahasa pemrograman yang memiliki syntax lebih
mudah dipahami dan menawarkan banyak tambahan fitur, seperti Pemrograman
Object dan Debugger. Namun mengapa memilih Assembly?
Inilah alasan yang paling tepat untuk menggambarkan kelebihan-kelebihan dari
bahasa Assembly :
Program yang dihasilkan Assembly berukuran kecil. Hampir 99.9 % program yang
saya hasilkan berukuran 50% lebih kecil daripada program yang dihasilkan pada
bahasa tingkat tinggi (dengan fungsionalitas sama).
Berjalan lebih cepat. Kebanyakan program yang dihasilkan bahasa pemrograman
tingkat tinggi melakukan instruksi yang sebenarnya tidak perlu di pakai.
Portabel. Jika kita mau, program anda dapat berjalan tanpa bantuan pustaka
ataupun program eksternal.
Penggunaan intruksi Prosesor tidak terbatas. Pada assembly, kita bisa
menggunakan instruksi istimewa seperti CLI, LGDT, RDTSC dan CPUID.

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.

Coba perhatikan baik-baik operasi penjumlahan bersusun diatas. Kita mencoba


menghitung angka desimal 8 + 1 memiliki hasil 9, berikutnya 9 kita jumlahkan lagi
dengan 1 dan hasilnya adalah 10. Coba lebih berfokus pada operasi 9 + 1. Mengapa
operasi tersebut menghasilkan 1 dan 0?
Hal ini karena bilangan maksimal pada bilangan desimal adalah 9, sehingga kita harus
mengembalikan angka tersebut menjadi angka yang terendah, yaitu 0. Ketika angka
kembali menjadi angka terendah, kita harus menambahkan angka sisi kirinya dengan
1.
Sekarang, kita coba beralih pada penjumlahan angka biner. Pada dasarnya
penjumlahan bilangan biner sama saja seperti penjumlahan pada bilangan desimal.
Yang harus kita perhatikan adalah angka terendah dan angka maksimalnya. Angka
terendah bilangan biner adalah 0 dan angka tertingginya dalah 1, Sehingga pada
operasi diatas penjumlahan 1 dengan 1 harus menghasilkan 10, karena angka tersebut
telah mencapai maksimum.

Inti dari penjelasan diatas adalah


ad
untuk menunjukkan pada kita bahwa penulisan
p
bilangan biner dan desimal
esimal berbeda namun memiliki nilai yang sama. M
Misal :

Desimal : 1 sapi
Biner : 1 sapi

Low Bit
High Bit
Nibble
Byte
Word
Double Word

Desimal : 3 bola
Biner : 11 bola

:
:
:
:
:
:

Nilai Bit yang berada di bagian paling kanan


Nilai Bit yang berada di bagian paling kiri
4 Bit
8 Bit
2 Byte / 16
1 Bit
2 Word / 4 Byte / 32 Bit

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

Bilangan desimal merupakan bilangan yang sudah sering kita pergunakan.


Bilangan ini terdiri dari 10 digit, mulai dari 0 hingga 9. Dalam assembly kita tidak
perlu menyisipkan huruf seperti pada peraturan penulisan pada bilangan lain.
C. Heksadesimal
Heksadesimal disebut juga bilangan berbasis 16, karena bilangan ini terdiri dari 16
digit, antara lain :
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E dan F
Karena terkadang terlihat sama dengan bilangan desimal, maka untuk menuliskan
bilangan heksadesimal kita harus mengikuti aturan.
Kita harus menambahkan huruf h dibagian belakang bilangan. Atau, dengan
menambahkan 0x dibagian depan sebelum penulisan bilangan.
Jika kita menulis dengan aturan penambahan h, menemukan digit bilangan
pertama lebih besar dari 9 (A, B, C, D, E, F), maka kita wajib menambahkan digit 0
dibagian depan bilangan. Selain kedua aturan diatas ada 1 aturan lagi, yaitu dengan
menambahkan symbol dollar $ pada bagian awal bilangan. Contoh :
9Fh, 19h, 0B8h, 0FBh, 0xBF, $156, $BA, $1BE dan 0x01
D. Oktal
Berbeda lagi dengan desimal dan heksadesimal. Bilangan oktal hanya mengenal 8
angka, antara lain :
0, 1, 2, 3, 4, 5, 6 dan 7
Aturan penulisan bilangan oktal adalah dengan penambahan huruf o di bagian
belakang bilangan untuk menandakan ini adalah bilangan oktal bukan desimal.
Contoh :
10o, 1945o dan 400o

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)

Namun, teknik pengalamatan dengan CHS merupakan satu-satunya cara yang


digunakan untuk mengakses data pada disk, sehingga kita perlu mengubah
alamat logical menuju alamat CHS terlebih dahulu.
Sector = (Logical Sector MOD Sector Per Track) + 1
Head
= Logical Sector \ Sector Per Track) MOD Jumlah Head

Track

Logical Sector \ (Sector Per Track x Jumlah Head)

Note : MOD adalah sisa dari operasi pembagian.

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

Segment : Offset. Dengan pengalamatan absolut, kita dapat mengakses


memori hingga maksimal 231 byte ( 4 GiB) tanpa terjadi overlapping.
Pengalamatan absolut merupakan model pengalamatan baru. Dilengkapi
fitur proteksi, sehingga komputer dapat berjalan stabil dan aman.
8.2. Mengkonversi alamat Relatif menjadi alamat Absolut
Saat kita mencoba membuat program 32-bit, terkadang kita perlu mengakses
bagian memori dibawah 1 MB. Jika kita mencoba mencari kode sumber dari
internet, terkadang masih menggunakan pengalamatan Segment:Offset,
sementara untuk membuat program 32-bit, kita hanya boleh menggunakan
alamat Absolut. Untuk mengatasi hal ini, kita hanya perlu menggunakan sebuah
formula untuk mongkonversi alamat tersebut menjadi alamat absolut.
Alamat Absolut = (Segment x 16) + Offset
Misalnya, kita akan menghitung alamat Absolut dari 0001h : 0045h. Maka,
langkah pencariannya adalah sebagai berikut :
Absolut
= Absolut = (Segment x 16) + Offset
= (0001h x 10h) + 0045h
= 00010h + 0045h
= 00055h
Berdasarkan rumus diatas, kita telah menemukan alamat absolut dari alamat
0001h : 0045h, yaitu 55h.

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)

Pada program 16-bit, register ini menunjukkan segment lokasi kodeprogram


atau instruksi yang akan dieksekusi oleh Prosesor. Sedangkan pada program 32bit, register ini dipakai untuk menentukan tipe dari instruksi di memori yang
akan diakses. apakah milik user atau milik sistem, read/write atau read only,
instruksi 16-bit atau instruksi 32-bit. Jika nilai register salah, program akan
mengalami error.
DS (Data Segment)
Pada program 16-bit, Data Segment dipakai untuk menunjukkan lokasi segment
yang terdapat data untuk program, seperti variable dan beberapa konfigurasi
tertentu. Pada program 32-bit register ini dipakai untuk menentukan konfigurasi
untuk mengakses data pada memori.
ES (Extra Segment)
Banyak yang mengatakan extra segment hanya digunakan untuk keperluan lain,
namun sebenarnya register ini mempunyai fungsi yang sama dengan DS.
FS dan GS (80386+)
Terkadang dipakai untuk menunjukkan lokasi data juga, namun jarang sekali
dipakai.
SS (Stack Segment)
Pada program 16-bit, Segment Register digunakan untuk menunjukkan lokasi
segment yang disediakan khusus untuk menaruh Stack(akan di bahas lebih
lanjut pada bab berikutnya). Pada program 32-bit, register ini dipakai untuk
menentukan konfigurasi untuk mengakses stack.

B. Pointer & Index Register (16-bit, 32-bit dan 64-bit)


Register dalam kelompok ini digunakan untuk menentukan suatu lokasi di memori
yang nantinya akan diproses untuk keperluan yang berhubungan erat dengan
pengaksesan memori. Pada program 16-bit register ini menyimpan offset
sedangkan pada program 32-bit, register ini selalu menyimpan alamat absolut.
Masing-masing register ini berpasangan dengan salah satu segment register. Apa
yang dimaksud berpasangan?
Di atas dijelaskan bahwa pada program 16-bit, register dipakai untuk menyimpan
offset. Sistem pengalamatan relatif tentu tidak akan lepas dari segment. Oleh
karena itu, setiap register dalam kelompok ini berpasangan dengan salah satu
segment register, yang mana register pasangannya tersebut dipakai untuk
menentukan lokasi segment. Sedangkan program 32-bit, juga tidak jauh beda.
Register ini juga berpasangan dengan Segment Register untuk menentukan
konfigurasi untuk mengakses alamat absolut di memori.
Pointer Register :
1) Instruction Pointer (IP, EIP, RIP)
Seluruh instruksi yang dieksekusi oleh Prosesor semuanya berada di memori.
Ketika sebuah instruksi telah dijalankan oleh Prosesor nilai register EIP

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

EDI : 0000 0000 0000 0000 1111 1111 1111 1111


DI
: 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

Ubah AH menjadi 1111 1111


RAX : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 0000 0000
EAX : 0000 0000 0000 0000 1111 1111 0000 0000
AX : 1111 1111 0000 0000
AH : 1111 1111
.
AL : 0000 0000

Ubah AX menjadi 1111 1111 1111 1111


RAX : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111
EAX : 0000 0000 0000 0000 1111 1111 1111 1111
AX : 1111 1111 1111 1111
AH : 1111 1111
.
AL : 1111 1111

Ubah RAX menjadi bit 1 semua


RAX : 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
EAX : 1111 1111 1111 1111 1111 1111 1111 1111
AX : 1111 1111 1111 1111
AH : 1111 1111
.
AL : 1111 1111

Berikut ini merupakan jenis-jenis General Purpose Register :


1) Accumulator (AL,AH,AX,EAX,RAX)
Biasanya digunakan dalam operasi perkalian dan pembagian
2) Base (BL,BH,BX,EBX,RBX)
Biasanya digunakan untuk pengalamatan

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

Dasar Dasar Assembly


1. Memulai Pemrograman Assembly
1.1. Memilih Compiler
Compiler adalah sebuah program bertugas menerjemahkan kode yang kita tulis
menjadi bahasa mesin, sehingga kode tersebut dapat dimengerti oleh Prosesor.
Khusus untuk buku ini, kita memakai Flat Assembler sebagai compiler. Selain
karena syntaxnya lebih mudah dan sederhana. Flat Assembler juga memiliki
banyak kelebihan, antara lain :
Mendukung instruksi FPU, SSE, MMX, 3DNow! dan AVX.
Memiliki fasilitas macro.
Mendukung banyak format executable, services, driver dan library.
Cross platform, dapat dijalankan pada DOS, Windows, Unix dan Linux.
Gratis & Open source.
Pada Windows, kita dapat menggunakan IDE bawaan dari FASM.
1.2. Memilih IDE
Lingkungan pengembangan dengan assembly saya rasa perlu untuk
diperhatikan. Lingkungan desktop yang nyaman dapat membuat kita terus
bersemangat mengembangkan program. Integrated Development Environment
adalah merupakan program komputer yang mempunyai beberapa fasilitas yang
diperlukan oleh programmer dalam pembangunan perangkat lunak. Tujuan
pemakaian IDE adalah untuk mempermudah programmer dalam membangun
perangkat lunak. Sebenarnya, untuk menulis source assembly kita tidak
membutuhkan IDE, yang kita hanya perlukan hanyalah sebuah text editor dan
compiler. Namun, hal ini kurang menarik karena text editor biasa umumnya tidak
memiliki fitur syntax highlighter, sehingga belajar assembly semakin terasa sulit.
Untuk itu kita perlu mempertimbangkan untuk memilih salah satu IDE untuk
sebelum kita melangkah lebih jauh menuju pemrograman Assembly.
1) FASM IDE
FASM IDE ini merupakan program bawaan Flat Assembler (FASMW.EXE).
Tampilannya sederhana dan mudah disesuaikan. Program ini dilengkapi
dengan debug board, sehingga jika terjadi kesalahan saat kompilasi, kita
akan segera mengetahui dimana letak kesalahan pada kode.

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

1.3. Cara mengkompilasi


mpilasi source
s
dengan Flat Assembler.
Untuk mengkompilas
ompilasi source kita dapat menggunakan 2 cara.
1) Cara Cepat
Cara ini adalah
alah cara
car yang sangat praktis dan mudah, yaitu
aitu dengan
den
mengkompilasi
pilasi melalui
m
FASM IDE. dengan cara ini, kitaa dapat dengan cepat
mengubah kode jika
ji suatu saat terjadi error pada syntax.
ax. LangkahLang
langkahnyaa adalah sebagai berikut :
Buka kode yang ingin
in kita compile melalui menu File Open,
Open atau dengan
menekan Ctrl + O
Berikutnya buka menu
m
Run Compile atau dengan menekan
meneka Ctrl + F9.

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

3.1. Tipe Data


Seperti pada bahasa pemrograman tingkat tinggi lain. Bahasa Assembly juga
dapat menampung data. Setiap jenis tipe data dapat menampung ukuran yang
berbeda-beda. Kita dapat menggunakannya sesuai kebutuhan.
A. Variabel
Variabel merupakan jenis data yang dapat diubah sesuai kebutuhan sewaktuwaktu.
Syntax :
NamaData TipeData NilaiData
Tipe Data :
Tipe Data
DB (Define Byte)
DW (Define Word)
DD (Define Double Word)
DF (Define Far Word)
DQ (Define Quad Word)
DT (Define Ten Bytes)

Contoh:
Data1 DB ?
Data DB 20

Ukuran
1 Byte
2 Byte
4 Byte
6 Byte
8 Byte
10 Byte

Nilai yang diperbolehkan


0 - 255
0 - 65535
0 - 4294967295
0 - 281474976710655
?
?

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 diatas akan membuat variable berukuran word (2 byte) sebanyak


100.
C. Konstanta
Konstanta merupakan kebalikan dari variable. Jika variable bisa diubah
dengan bebas, maka disini konstanta bersifat tetap dan tidak dapat kita ubah
nilainya.
Syntax :
NamaKonstanta EQU NilaiKonstanta

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

3.4. Instruksi Dasar


A. Instruksi Penyalinan dan Manipulasi Data
Komputer mempunyai dua lokasi yang ditujukan untuk menyimpan data
dalam bentuk bit, yaitu Register dan Memori. Pada lokasi ini, kita dapat
memanipulasi data untuk kebutuhan komputer. Bahkan saat komputer
berjalan, sebagian besar instruksi yang dijalankan adalah instruksi untuk

menyalin dan memanipulasi data antar register dan memori. Dengan


demikian, kita diwajibkan untuk memahami instruksi ini.
1) MOV (Move Data)
Instruksi ini berfungsi untuk menyalin data dari lokasi Operand2 menuju
ke Operand1. Nilai Operand1 berubah menjadi nilai Operand2, sementara
nilai Operand2 tetap.
Syntax :
MOV Operand1,Operand2
Note :
Ukuran Operand1 dan Operand2 harus sama.
Hal yang dilarang pada instruksi MOV
Menyalin data antar operand yang berbeda nilai.
Menyalin data antar segment register.
Menyalin data antar operand variable (memori).
Jika Operand merupakan variable (memori), maka operand tersebut
harus diapit tanda kurung siku [ ]
misal :
MOV AX,[Var1]

Operand yang diperbolehkan untuk instruksi MOV :


Operand 1
Register
Register
Memori
Register
Memori
Segment Register
Register
Segment Register
Memori

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

B. Operasi Matematika dan Logika


Bukan hanya memanipulasi data, komputer juga dapat melakukan operasi
matematika dan logika. Instruksi ini dibagi menjadi 3 grup, antara lain :
Grup 1
Operand yang diperbolehkan untuk Grup 1 :
Operand 1
Register
Register
Memori
Register
Memori

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

2) AND (Logical AND)


Untuk melakukan operasi logika Dan antara Operand1 dengan
Operand2. Hasil operasi akan disimpan pada Operand1.
Nilai 1
Nilai 2
Hasil
0
0
0
1
0
0
0
1
0
1
1
1
Syntax :
AND Operand1,Operand2
Contoh :
MOV AH,10110001b
AND AH,11111111b
;Hasil -> AH : 10110001b

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

4) OR (Inclusive Logical OR)


Untuk melakukan operasi logika Atau antara Operand1 dengan
Operand2. Hasil operasi akan disimpan pada Operand1.

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

7) XOR (Logical XOR)


Untuk melakukan operasi logika XOR antara Operand1 dengan
Operand2. Operasi ini membuat nilai bit yang sama menjadi 0. Hasil
operasi akan disimpan pada Operand1.
Bit 1
Bit 2
Hasil
0
0
0
1
0
1
0
1
1
1
1
0
Syntax :
XOR Operand1,Operand2

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

1) MUL (Unsigned Multiplication)


Instruksi ini dipakai untuk melakukan operasi perkalian register
Accumulator dengan suatu bilangan tak bertanda.
Syntax :

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

2) IMUL (Signed Multiplication)


Untuk melakukan operasi perkalian bilangan bertanda.
Untuk menggunakan instruksi ini kita harus memahami konsep bilangan
bertanda pada bab 1. Kita telah mengetahui bahwa setengah kombinasi
dipakai untuk mewakili bilangan positif dan sisanya untuk bilangan
negatif. Jika kita menulis sebuah bilangan bertanda negatif, seperti -1 dan
-2, maka compiler secara otomatis akan mengubah bilangan tersebut
menjadi bilangan biasa yang mewakili angka tersebut(Lihat pada bab
Kode 1 :
MOV AL,255

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 :

Kita ingin mengalikan -3 (253) dengan 2.


-3 x 2 = -6
MOV AL,-3
MOV BL,2
;AX = AL x Operand (BL)
IMUL BL
;Hasil -> AX = -6 (250)

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

4) IDIV (Signed Division)


Untuk melakukan operasi pembagian bilangan bertanda.
Syntax :
IDIV Operand
Contoh :
MOV AX,8

MOV BL,2
;AL = AX / Operand (BL)
DIV BL

Grup 3
Operand yang diperbolehkan :
Operand yang diperbolehkan
Register
Memori

1) INC (Increment) dan DEC (Decrement)


Instruksi INC dipakai untuk menambahkan nilai Operand dengan 1.
Sedangkan instruksi DEC dipakai untuk mengurangi nilai Operand
dengan 1. Kedua instruksi ini lebih cepat daripada harus memakai
instruksi ADD Tujuan,1 dan SUB Tujuan,1.
Syntax :
INC Operand
DEC Operand
Contoh :
MOV CL,100
INC CL
;Hasil -> CL : 101
DEC CL
;Hasil -> CL : 100

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)

3) NOT (Logical NOT)Untuk melakukan operasi logika Bukanpada


Operand. Setelah terjadi instruksi ini, nilai bit pada Operand tersebut
akan berubah.
Bit Awal
0
1

Bit Hasil
1
0

Syntax :
NOT Operand
Contoh :
MOV BL,10000001b
NOT BL
;Hasil -> BL : 01111110b

C. Memori dan Akses


1) LEA (Load Effective Address)
Berfungsi untuk mengambil alamat dari Operand2 (variable atau data
yang terletak pada memori) dan menyimpannya pada
Operand1(register).
Syntax :
LEA Operand1,[Operand2]
Contoh :
LEA BX,[Data]
Data DW 12345

2) LOOP (Loop)
Mengulang instruksi. Proses looping ini akan terus dilakukan hingga CX =
0.

Instruksi ini akan dibahas lebih lanjut pada bab selanjutnya.


Syntax :
LOOP Label
Contoh :
MOV ECX,10
Ulang :
ADD EAX, 5
SUB EAX, 1
LOOP Ulang
RET

3) INT (Request Interrupt)


Interrupt memiliki arti Gangguan. Ketika komputer mengalami
interupsi, Prosesor akan menghentikan pekerjaan yang sedang
dilakukannya lalu pergi menangani Interupsi. Jadi, sederhananya jika
program kita memakai instruksi INT, program kita nantinya akan
mengganggu Prosesor.
Syntax :
INT NomorInterrupt
Contoh :
INT 21h
INT 10h
INT 45

Pada memori komputer, terdapat suatu daerah untuk menyimpan IVT


(Interrupt Vector Table). IVT inilah yang menyimpan alamat dari
kode/program di memori yang digunakan untuk menangani interupsi.
Kode ini disebutjuga Interrupt Handler. Misalkan, ada interrupt
bernomor 45 diakses oleh program dengan instruksi INT. Maka Prosesor
lalu akan melakukan hal berikut :
Menghentikan pekerjaannya.
Mendapatkan alamat dari Interrupt Handler untuk menangani interrupt
45 pada IVT.
Melompat menuju lokasi Interrupt Handler.
Jika sudah, kembali ke pekerjaannya.
Interrupt ada 2 macam yaitu :
Hardware Interrupt, yaitu interrupt yang dihasilkan oleh hardware.
Penggunaan interupsi ini dimaksudkan untuk mengetahui sesuatu
yang harus ditangani pada hardware yang meminta interupsi.

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

Tambahkan kode ORG 100h pada bagian paling


Tamba
aling awal
aw agar hasil
output merupakan program COM(Command),
nd), jika tidak compiler
akan menghas
enghasilkan program BIN(Binary) yang tidakk dapat dijalankan
secara langsung
langsun oleh sistem.
Terkadang,
ang, program
pro
yang kita hasilkan muncul error,
or, atau hanya muncul

beberapa detik lalu menghilang begitu saja. Solusinya, anda bisa


menggunakan Interupsi 16h dengan layanan AH = 0 serta instruksi RET
dibagian kode terakhir agar kita bisa melihat hasil dari program yang
telah kita buat.
ORG 100h
;Tunggu user menekan tombol di
;keyboard
MOV AH, 0
INT 16h
;jika sudah, keluar
RET
Pada Windows, kita juga bisa memakai Interupsi 21h dan Layanan AH = 7
ORG 100h
;Tunggu user menekan tombol di
;keyboard
MOV AH, 7
INT 21h
;jika sudah, keluar
RET
_

3.5. Penggunaan Tanda Kurung Siku


Dalam pemrograman Assembly, anda akan sering menemukan penggunaan
tanda kurung siku pada kode program. Penggunaan tanda kurung memiliki
tujuan yang berbeda-beda, jadi kita harus mengetahui kapan harus
menggunakannya.
A. Operasi variable/memori
MOV AH, [Var1]
MOV [Var2], DX
INC [Var1]
NEG [Var1]
LEA BX,[Array1]
Var1 DB 20
Var2 DW 60000

Jika berhubungan Index Register dengan instruksi MOV. jangan gunakan


kurung ketika ingin memasukkan alamat variable ke Index register.
;mendapatkan alamat Var1
MOV SI,Var1
;memindahkan konten Var1 ke SI
MOV SI,[Var1]
Var1 DB 20
Var2 DW 60000

B. Mengambil data dari register sebagai pointer


dengan menggunakan tanda kurung, yang kita salin bukan isi/nilai dari
register. Akan tetapi, nilai dari register tersebut berperan untuk menunjukkan
alamat ke suatu lokasi dimemori yang akan kita salin.
;mendapatkan alamat Var1
MOV SI,Var1
;menyalin data dari alamat yg ditunjuk SI
MOV AL,[SI]
INC AL
;menyalin data menuju alamat yg ditunjuk SI
MOV [SI],AL
Var1 DB 20

Kesimpulannya, kita harus menggunakan tanda kurung untuk mengakses data


dan kita harus menghilangkan tanda kurung jika ingin mendapatkan alamat di
memori(Kecuali pada instruksi LEA).
4.

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

4.1. Instruksi PUSH


Instruksi PUSH adalah instruksi yang digunakan untuk menaruh data ke dalam
memori stack. Setelah melakukan instruksi, maka nilai Stack Pointer akan
berkurang sesuai dengan ukuran data yang ditaruh.
PUSH Operand
Contoh:
PUSH [Data1]
PUSH [Data2]
MOV AX,65000
PUSH AX
Data1 DW 100
Data2 DD 100000

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

4.3. Penggunaan Instruksi PUSHA dan POPA


PUSHA dipakai untuk menyimpan semua General Purpose Register, Index
Register dan Pointer Register kedalam stack. Sedangkan POPA dipakai untuk

mengembalikannya kedalam register. Kedua instruksi ini dipakai untuk program


16-bit, sedangkan untuk melakukan hal ini dalam program 32-bit kita
menggunakan instruksi PUSHAD dan POPAD. Perbedaan dari instruksi tersebut
terletak pada hasil peekerjaanya. Pada instruksi PUSHA, register yang
dimasukkan ke dalam stack secara berurutan adalah AX, CX, DX, BX, SP, BP, SI,
DI. Sedangkan pada Instruksi PUSHAD, register yang disimpan adalah semua
register berukuran 32-bit, antara lain EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI.
4.4. PUSHF dan POPF
PUSHF dipakai untuk menyimpan Flag Register berjumlah 16 bit pertama,
sedangkan PUSHFD dipakai untuk menyimpan seluruh 32 bit Flag register
berukuran. Untuk mengembalikannya, kita harus menggunakan instruksi POPF.

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

2) Lompatan bilangan bertanda


Instruksi
JZ (Jump if Zero)
JE(Jump if Equal)
JNZ(Jump if Not Zero)
JNE(Jump if Not Equal)
JG (Jump if Greater)
JNLE(Jump if Not
Lower or Equal)
JL (Jump if Lower)
JNGE(Jump if Not
Greater or Equal)
JGE (Jump if Greater
or Equal)
JNL(Jump if Not
Lower)
JLE (Jump if Lower or
Equal)
JNG(Jump if Not
Greater)

Kegunaan
Lompat jika sama(kosong)

Kondisi Flag
ZF = 1

Lompat jika tidak sama

ZF = 0

Lompat jika lebih besar


Lompat jika tidak lebih
kecil atau sama dengan
Lompat jika lebih kecil
Lompat jika tidak lebih
besar atau sama dengan
Lompat jika lebih besar
atau sama dengan
Lompat jika tidak lebih
kecil
Lompat jika lebih kecil
atau sama dengan
Lompat jika tidak lebih
besar

3) Lompatan bilangan tak bertanda


Instruksi
Kegunaan
JZ (Jump if Zero)
Lompat jika
sama(kosong)
JE(Jump if Equal)
JNZ(Jump if Not Zero) Lompat jika tidak sama
JNE(Jump if Not Equal)
JA(Jump if Above)
Lompat jika lebih besar
JNBE(Jump if Not
Lompat jika tidak lebih
Below or Equal)
kecil
JB(Jump if Below)
Lompat jika lebih kecil
JNAE(Jump if Not
Lompat jika tidak lebih
Above or Equal)
besar atau sama dengan
JC(Jump if Carry)
Lompat jika terjadi
overflow bilangan tak
bertanda
JAE(Jump if Above or
Lompat jika lebih besar
Equal)
atau sama dengan

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

Overflow merupakan suatu kejadian dimana operasi bilangan bertanda


menghasilkan nilai diluar jangkauan, sama halnya dengan Carry, namun
carry merupakan sebutan overflow pada operasi bilangan tak bertanda.
Contoh overflow: Penjumlahan bilangan 1 byte bertanda(-128...127) :
126 + 2 = 128(diluar jangkauan)
Contoh carry: Penjumlahan bilangan 1 byte tak bertanda(0...255) :
200 + 60 = 260(diluar jangkauan)
Pada pemrograman bahasa tingkat tinggi, penggunaan conditional action
berhubungan erat dengan conditional jump pada assembly. Atau bisa juga
dibilang sama saja hasilnya setelah terjadi kompilasi.
Syntax dalam VB6 :
Dim Data1 as Byte
Sub Main()
Data1 = 100
If Data1 > 1 Then
'Aksi 1
Else
'Aksi 2
End If
Data1 = 1
End Sub

Syntax setelah diubah ke dalam syntax Assembly :


Data1 db 0
Main :
MOV [Data1],100
CMP [Data1],1
JB YA_LEBIHBESAR
TDK_LEBIHBESAR :
;Aksi 2

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

4) Register Indirect Addressing


Addressing ini dilakukan dengan mengambil alamat offset dari suatu alamat
di memori menuju register atau sebaliknya. Alamat yang ingin diakses
disimpan pada register BX, BP, SI atau DI
Syntax :
MOV RegisterTujuan,[Register]
Contoh :
JMP MULAI
DataKu DB 10
MULAI:
;instruksi ini akan mengambil alamat offset dari DataKu
LEA BX,[DataKu]
;salin data yang berada pada offset yang ditunjuk BX
MOV AL,[BX]

5) Base Relatif Addressing


Dengan addressing ini kita bisa menyalin data antara register dan lokasi
dimemori dengan bantuan Base Register (BP atau BX). Ketika terjadi
addressing ini, Prosesor akan mengambil lokasi offset dari register BP atau
BX lalu menambahkannya dengan nilai Displacement. Agar lebih mudah, kita
analogikan bahwa BX menunjukkan Nomor urut antrian BBM. Jika BX
menunjukkan 12 dan kita ingin mendahulukan nomor 17, maka Displacement
harus menunjukkan angka 5. (12 + 5 = 17)
Syntax :
[BP + Displacement]
atau

[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

6) Direct Indexed Addressing


Addressing ini hampir sama dengan Base relatif Addressing. Perbedaannya
terletak pada penggunaan registernya. Pada addressing ini, kita tidak
menggunakan BX ataupun BP, namun kita akan menggunakan Index register
(SI atau DI).
Syntax :
[SI + Displacement]
atau
[DI + Displacement]

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

7) Base Indexed Addressing


Addressing ini adalah jenis addressing yang cukup rumit, oleh karena itu kita
jarang menemui addressing model ini. Pada dasarnya Base Indexed
Addressing merupakan gabungan antara Base Relatif Addressing dengan
Direct Indexed Addressing, untuk mengetahui lebih jelasnya silahkan amati
Format berikut ini :
Syntax :
[Base Register + IndexRegister + Displacement]
atau
[Base Register + IndexRegister]
Contoh :
JMP MULAI
DataKu DB 'A','B','C','D','E','F','G','H','I','J'
MULAI:
;instruksi ini akan mengambil alamat offset PERTAMA
;dari DataKu ( A )
LEA BX,[DATAKU]
;si = 4
MOV SI,4
;salin data yang berada pada offset yang ditunjuk
;BX (alamat A+SI(4) + Displacement(2) = menunjuk
alamatG
;>>Salin ke AL
MOV AL,[BX + SI + 2]
;untuk membuktikannya, coba kita cetak AL
MOV AH,0EH
INT 10H
;tunggu keyboard press
MOV AH,0
INT 16H
RET

8. Manipulasi Karakter dan String

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

Start of heading (!)

005D

93

Kurung sikur kanan

STX

0002

Start of text (!)

005E

94

Tanda pangkat

ETX

0003

End of text (!)

005F

95

Garis bawah (underscore)

EOT

0004

End of transmission (!)

0060

96

Tanda petik satu

ENQ

0005

Enquiry (!)

0061

97

Huruf latin a kecil

ACK

0006

Acknowledge (!)

0062

98

Huruf latin b kecil

BELL

0007

Bell (!)

0063

99

Huruf latin c kecil

BS

0008

Backspace

0064

100

Huruf latin d kecil

HT

0009

Horizontal tabulation

0065

101

Huruf latin e kecil

LF

000A

10

Pergantian baris (Line feed)

0066

102

Huruf latin f kecil

VT

000B

11

Tabulasi vertikal

0067

103

Huruf latin g kecil

FF

000C

12

Ganti baris (Form feed)

0068

104

Huruf latin h kecil

CR

000D

13

Ganti baris (Carriage return)

0069

105

Huruf latin i kecil

SO

000E

14

Shift out (!)

006A

106

Huruf latin j kecil

SI

000F

15

Shift in (!)

006B

107

Huruf latin k kecil

DLE

0010

16

Data link escape (!)

006C

108

Huruf latin l kecil

DC1

0011

17

Device control 1 (!)

006D

109

Huruf latin m kecil

DC2

0012

18

Device control 2 (!)

006E

110

Huruf latin n kecil

DC3

0013

19

Device control 3 (!)

006F

111

Huruf latin o kecil

DC4

0014

20

Device control 4 (!)

0070

112

Huruf latin p kecil

NAK

0015

21

Negativ acknowledge (!)

0071

113

Huruf latin q kecil

SYN

0016

22

Synchronous idle (!)

0072

114

Huruf latin r kecil

ETB

0017

23

End of transmission block (!)

0073

115

Huruf latin s kecil

CAN

0018

24

Cancel (!)

0074

116

Huruf latin t kecil

EM

0019

25

End of medium (!)

0075

117

Huruf latin u kecil

SUB

001A

26

Substitute (!)

0076

118

Huruf latin v kecil

ESC

001B

27

Escape (!)

0077

119

Huruf latin w kecil

FS

001C

28

File separator

0078

120

Huruf latin x kecil

GS

001D

29

Group separator

0079

121

Huruf latin y kecil

RS

001E

30

Record separator

007A

122

Huruf latin z kecil

US

001F

31

Unit separator

007B

123

Kurung kurawal buka

SP

0020

32

Spasi

007C

124

Garis vertikal (pipa)

0021

33

Tanda seru (exclamation)

007D

125

Kurung kurawal tutup

"

0022

34

Tanda kutip dua

007E

126

Karakter gelombang
(tilde)

0023

35

Tanda pagar (kres)

DEL

007F

127

Delete

0024

36

Tanda mata uang dolar

0080

128

Dicadangkan

0025

37

Tanda persen

0081

129

Dicadangkan

&

0026

38

Karakter ampersand (&)

0082

130

Dicadangkan

0027

39

Karakter Apostrof

0083

131

Dicadangkan

0028

40

Tanda kurung buka

IND

0084

132

Index

0029

41

Tanda kurung tutup

NEL

0085

133

Next line

002A

42

Karakter asterisk (bintang)

SSA

0086

134

Start of selected area

002B

43

Tanda tambah (plus)

ESA

0087

135

End of selected area

002C

44

Karakter koma

0088

136

Character tabulation set

002D

45

Karakter hyphen (strip)

0089

137

Character tab. with


justification

002E

46

Tanda titik

008A

138

Line tabulation set

002F

47

Garis miring (slash)

PLD

008B

139

Partial line down

0030

48

Angka nol

PLU

008C

140

Partial line up

0031

49

Angka satu

008D

141

Reverse line feed

0032

50

Angka dua

SS2

008E

142

Single shift two

0033

51

Angka tiga

SS3

008F

143

Single shift three

0034

52

Angka empat

DCS

0090

144

Device control string

0035

53

Angka lima

PU1

0091

145

Private use one

0036

54

Angka enam

PU2

0092

146

Private use two

0037

55

Angka tujuh

STS

0093

147

Set transmit state

0038

56

Angka delapan

CCH

0094

148

Cancel character

0039

57

Angka sembilan

MW

0095

149

Message waiting

003A

58

Tanda titik dua

0096

150

Start of guarded area

003B

59

Tanda titik koma

0097

151

End of guarded area

<

003C

60

Tanda lebih kecil

0098

152

Start of string

003D

61

Tanda sama dengan

0099

153

Dicadangkan

>

003E

62

Tanda lebih besar

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

Huruf latin A kapital

OSC

009D

157

Operating system
command

0042

66

Huruf latin B kapital

PM

009E

158

Privacy message

0043

67

Huruf latin C kapital

APC

009F

158

App program command

0044

68

Huruf latin D kapital

00A0

160

Spasi yang bukan pemisah


kata

0045

69

Huruf latin E kapital

00A1

161

Tanda seru terbalik

0046

70

Huruf latin F kapital

00A2

162

Tanda sen (Cent)

0047

71

Huruf latin G kapital

00A3

163

Tanda Poundsterling

0048

72

Huruf latin H kapital

00A4

164

Tanda mata uang


(Currency)

0049

73

Huruf latin I kapital

00A5

165

Tanda Yen

004A

74

Huruf latin J kapital

00A6

166

broken bar

004B

72

Huruf latin K kapital

00A7

167

Section sign

004C

76

Huruf latin L kapital

00A8

168

Diaeresis

004D

77

Huruf latin M kapital

00A9

169

Tanda hak cipta


(Copyright)

004E

78

Huruf latin N kapital

00AA

170

Feminine ordinal indicator

004F

79

Huruf latin O kapital

00AB

171

Left-pointing double angle


quotation mark

0050

80

Huruf latin P kapital

00AC

172

Not sign

0051

81

Huruf latin Q kapital

00AD

173

Tanda strip (hyphen)

0052

82

Huruf latin R kapital

00AE

174

Tanda merk terdaftar

0053

83

Huruf latin S kapital

00AF

175

Macron

0054

84

Huruf latin T kapital

00B0

176

Tanda derajat

0055

85

Huruf latin U kapital

00B1

177

Tanda kurang lebih

0056

86

Huruf latin V kapital

kodok

178

Tanda kuadrat (pangkat


dua)

0057

87

Huruf latin W kapital

00B3

179

Tanda kubik (pangkat


tiga)

0058

88

Huruf latin X kapital

00B4

180

Acute accent

0059

89

Huruf latin Y kapital

00B5

181

Micro sign

005A

90

Huruf latin Z kapital

00B6

182

Pilcrow sign

005B

91

Kurung siku kiri

00B7

183

Middle dot

8.2. Instruksi Manipulasi String


Walaupun digolongkan instruksi string, namun pada prakteknya instruksiinstruksi dalam kelompok ini tidak selalu dipakai untuk mengolah string, bahkan
sangat jarang sekali program yang menggunakan instruksi ini untuk
memanipulasi string. Umumnya, instruksi ini justru dipakai untuk manipulasi
data dalam memori. Hampir semua kelompok instruksi ini memakai register
SI(Source index) dan beberapa instruksi lainnya menggunakan DI(Destination
Index). Penggunaan register tersebut dimaksudkan untuk menyimpan alamat
(pointer) data pada memori yang akan kita proses. Setelah melakukan instruksi
ini, nilai register pointer tersebut akan bertambah berdasarkan penggunaannya,
ini dimaksudkan untuk menunjukkan lokasi data atau string yang akan diproses
berikutnya.
Byte (B)
Instruksi manipulasi untuk mengolah data berukuran byte selalu
menggunakan B pada instruksinya, misalkan STOSB dan MOVSB. Setelah
mengunakan instruksi ini, nilai register yang dipakai pointer ditambah 1.
Word (W)
Instruksi word dipakai untuk mengolah data berukuran 1 word atau setara
dengan 2 byte. Karena 1 word setara dengan 2 byte, maka setelah terjadi
instruksi nilai register pointer ditambah 2. Instruksi ini menggunakan W
untuk menunjukkan bahwa yang akan diproses adalah data berukuran
word.
Double Word (D)
Yang ketiga adalah instruksi Double word, tentunya instruksi jenis ini
dipakai untuk data berukuran 4 byte. Sehingga register pointer ditambah
4 setelah melakukan instruksi. Instruksi ini menggunakan Q untuk
menunjukkan bahwa yang akan diproses adalah data berukuran 4 byte
atau 1 double word.
Quad Word (Q)
Yang terakhir adalah instruksi untuk pengolahan data quad word.
Instruksi ini khusus dan hanya ada pada Processor 64 bit. Setelah
mengunakan instruksi ini, nilai register yang dipakai sebagai pointer
ditambah 8, karena 1 qword setara dengan 8 byte.

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'

2) Instruksi MOVSx (Move String)


Instruksi ini dipakai untuk menyalin data dari lokasi yang ditunjuk SI menuju
lokasi yang ditunjuk DI. Instruksi ini juga dibagi menjadi 3 macam :
MOVSx
ORG 256
MOV SI,DATA1
MOV DI,DATA2
MOVSW
;Hasil -> Data2 : Data 1
DATA1 DW 'ABCD'

DATA2 DW ?

3) Instruksi SCASx (Compare String with Accumulator Register)


Dipakai untuk membandigkan nilai register Accumulator dengan data yang
ditunjuk oleh register SI. Hasil dari instruksi ini akan merubah nilai flag
register berdasarkan nilai yang dibandingkan. Yang terakhir, nilai dari register
SI akan di update berdasarkan jenis instruksi.
SCASx
ORG 256
MOV AL,1234
MOV SI,DATA2
SCASB
;Hasil -> ZF : 0 (Sama)
RET
DATA1 DW 1234

4) Instruksi CMPSx (Compare String)


Diantara semua instruksi, inilah instruksi yang sering sekal dipakai untuk
membandingkan string. Instruksi ini dapat membandingkan nilai dari string 1
dengan string 2. Untuk melakukan hal ini, kita harus mmberikan nilai pointer
string 1 pada register DI dan pointer string 2 pada register SI.
CMPSx
ORG 256
MOV DI,DATA1
MOV SI,DATA2
CMPSB
;Hasil -> ZF : 0 (Sama)
RET
DATA1 DW 1234
DATA2 DW 1234

5) Instruksi STOSx (Store String)


STOS dipakai untuk menyalin data dari register Accumulator menuju lokasi
memori tertentu yang ditunjuk oleh register DI. Instruksi ini sering sekali
dipakai untuk mengosongkan suatu lokasi di memori.
STOSx
ORG 256

MOV AX,1200
MOV DI,DATA1
STOSW
;Hasil -> DATA1 : AX : 1200
RET
DATA1 DW ?

8.3. Mengulang Instruksi LODSx, MOVSx, SCASx,CMPSx dan STOSx


REP (Repeat)
Instruksi ini dipakai untuk mengulangi instruksi hingga CX = 0.
REPZ (Repeat While Zero)
Dipakai untuk terus mengulangi instruksi jika ZF masih bernilai 1.
REPNZ (Repeat While Not Zero)
Dipakai untuk terus mengulangi instruksi jika ZF bernilai 0
REPE (Repeat While Equal)
Sama dengan REPZ, namun instruksi ini dipakai untuk bilangan bertanda.
REPNE (Repeat While Not Equal)
Sama dengan REPNZ, namun dipakai untuk bilangan bertanda.

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

Untuk memanggil sebuah Prosedur kita harus menggunakan instruksi CALL


CALL Nama/Lokasi Prosedur
Ketika Prosesor menerima instruksi CALL, Prosesor akan menyimpan register EIP ke
dalam stack, lalu melompat ke lokasi NamaProsedur. Fungsi dari instruksi 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.

Memperdalam Syntax FASM

1. Membuat Instruksi Makro


Instruksi Makro(Macro Instruction) merupakan fitur assembly yang mempermudahkan
kita untuk mengetik kode yang dipakai secara berulang. Untuk menggunakan makro,
kita cukup mengetikkan nama makro yang kita gunakan layaknya menggunakan
sebuah instruksi.
MACRO NamaMacro Operand1,Operand2, ...
{
Instruksi1
Instruksi2
...
}
Pada syntax diatas terdapat tanda kurung yang mengapit instruksi1 dan instruksi2.
Instruksi inilah yang nantinya akan dipasang ke program pada saat proses kompilasi.
Sedangkan Operand1 dan Operand2 nanti akan kita pakai untuk menyimpan sebuah
nilai yang dapat kita gunakan untuk keperluan instruksi dalam macro tersebut. Jika
tidak diperlukan, kita diperbolehkan menggunakan Macro tanpa operand.
Contoh 1 (Makro tanpa operand)
MACRO AXminBX
{
SUB AX,BX
}
ORG 100h
;Gunakan macro
AXminBX

Contoh 2 (Makro dengan operand)


MACRO CetakHuruf Huruf,Jumlah
{
MOV CX,Jumlah
Cetak :
MOV AL,Huruf
MOV AH,0Eh
LOOP Cetak
}
ORG 100h
;Gunakan macro
CetakHuruf "A",10

2. Membuat Struktur Data


Seperti halnya C++, Flat Assembler juga mempunyai syntax untuk membuat struktur
data. Dengan kemampuan ini, kita dapat membuat dan mengolah array dari data
dengan lebih cepat dan mudah.
STRUC NamaStruc Operand1,Operand2,...
{
.Data1 type Operand1
.Data2 type Operand2
....
}

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

3.2. Conditional Assembly


Dengan fitur ini, kita dapat mengatur proses compile berdasarkan keadaan
tertentu.
if Kondisi
Aksi
else
AksiLain
end if

Contoh :
kons = 1
if Kons = 1
mov eax,Kons
else
mov eax,0
end if

3.3. Repeat (Mengulang Instruksi)


Terkadang kita perlu menulis berbaris-baris kode yang serupa dalam satu kode.
Dengan fitur ini, kita tidak perlu lagi mengetik semua kode tersebut.
repeat x
Aksi
end repeat
Contoh 1:
kita ingin menulis kode :
mov ax,1
mov ax,1
mov ax,1
mov ax,1
mov ax,1
mov ax,1
mov ax,1
Dengan fitur repeat, kita hanya perlu mengetik seperti ini :
repeat 7
mov ax,1
end repeat
Contoh 2:
mov ax,
mov ax,
mov ax,
mov ax,
mov ax,

1
2
3
4
5

Dengan fitur repeat, kita hanya perlu mengetik seperti ini :


bilangan = 1
repeat 5
mov ax, bilangan

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.

Membuat Program 16-bit


1. Pengenalan
Program 16-bit dapat dijalankan pada sistem operasi DOS dan Windows versi 32-bit.
Program ini masih menggunakan model pengalamatan segment:offset dan hanya
mendukung text mode saja. Walupun begitu, program ini tergolong cukup mudah
untuk dibuat bagi pemula.
2. Membuat Program COM
Jenis program pertama adalah program COM. COM merupakan kependekan dari
COMmmand, jadi sudah jelas program ini hanya mendukung text mode saja.
Untuk membuat sebuah program COM, kita hanya perlu menambahkan kode berikut
pada bagian paling awal:
ORG 100h
;atau ORG 256
2.1. Mencetak Huruf Dalam Program COM
Mencetak huruf dapat kita lakukan dengan 2 cara. Pertama, mencetak dengan
memasukkan karakter ASCII dan attributnya ke memori. Ini cukup sulit dilakukan
bagi pemula, karena kita harus mengetahui cara kerja VGA Controller. Alternatif
kedua, kita cukup melakukannya menggunakan interrupt. Ada beberapa interrupt
yang menyediakan layanan untuk mencetak huruf, antara lain :
A. BIOS Interrupt (INT 10h) Service 0Eh
Dengan menggunakan interrupt ini, kita bisa mencetak karakter ASCII pada
banyak video mode.
AH = Nomor Service (0Eh untuk mencetak karakter ASCII)
AL = karakter ASCII yang ingin dicetak

Contoh :
ORG
MOV
MOV
INT

100h
AH, 0Eh
AL, A
10h

;Tunggu user menekan tombol di keyboard


MOV AH, 0
INT 16h
;jika sudah, keluar
RET

Pada kode diatas kita melihat kode MOV AL, A.

Bagaimana bisa Register ini dapat menyimpan karakter A, sementara


Register tersebut hanya mengerti angka dalam bentuk bilangan bit saja?
Untuk menjelaskannya coba ganti kode diatas menjadi MOV AL, 65 atau
MOV AL, 41h ! Apa yang terjadi?
Ya, program yang dihasilkan juga mencetak A seperti yang dilakukan oleh
program sebelumnya. Mengapa demikian?
Karena A Kapital memiliki kode ASCII : 65. Saat terjadi kompilasi, compiler
juga mengubah huruf menjadi kode ASCII, sehingga kita bisa juga memakai
kode MOV AL, A, karena pada akhirnya compiler pasti akan mengubah
huruf A tersebut menjadi kode ASCII.
B. Menggunakan DOS Interrupt Service 6h
AH = Nomor Service DOS untuk mencetak karakter (Selalu 6)
DL = Karakter ASCII yang akan dicetak

Contoh :
ORG
MOV
MOV
INT

100h
AH, 6
DL, D
21h

;Tunggu user menekan tombol di keyboard


MOV AH, 0
INT 16h
;jika sudah, keluar
RET

2.2. Mencetak Kalimat


Mencetak huruf/karakter di assembly itu mudah, begitupun dengan mencetak
kalimat. Untuk mencetak kalimat kita dapat menggunakan beberapa teknik :
A. Cetak dengan DOS Interrupt
Bisa dibilang cara ini adalah cara yang paling mudah. untuk melakukannya kita
hanya menggunakan interrupt, tanpa rumus tambahan.
AH = Nomor Service DOS untuk mencetak Kalimat (Selalu 9)
DX = Lokasi Kalimat yang ingin dicetak

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

C. Cetak Hingga Menemukan 0


Cara ini hampir sama dengan cara mencetak kalimat dengan DOS interrupt,
namun kita memakai 0 untuk menandakan akhir kalimat (bukan $ )
ORG 100h
JMP MULAI
Kalimat DB ABCDEFGHIJ, 0
MULAI :
;Load alamat dari Kalimat ke register SI
MOV SI,Kalimat
PRINT :
MOV AL,[SI]
;Bandingkan AL dengan 0
CMP AL,0
;Jika Sama, jangan mencetak
JE SELESAI
MOV AH,0Eh
INT 10h
;SI = SI + 1
INC SI

;Lompat ke label PRINT


JMP PRINT
SELESAI :
;Tunggu user menekan tombol di keyboard
MOV AH, 0
INT 16h
;jika sudah, keluar
RET

2.3. Mencetak Angka Desimal


Pada sub bab yang lalu kita telah membahas tentang ASCII. Kta telah mengetahui
bahwa setiap huruf dan symbol yang akan kita cetak harus kita sesuaikan dengan
kode ASCII. Dalam mencetak angka, kendala yang kita alami adalah bilangan yang
akan kita cetak belum berformat ASCII. Dengan demikian, kita perlu merancang
sebuah formula untuk memecahkan masalah ini. Langkah pertama adalah mencari
dan menentukan urutan angka. Dalam tahap ini bilangan akan dibagi dengan 10
hingga mempunyai hasil 0. Semua sisa dari proses pembagian merupakan urrutan
angka yang dimaksud.
Misal kita mencari masing-masing angka pada bilangan 1234 :
1234 : 10
Hasil : 123
Sisa : 4
123 : 10
Hasil : 12
Sisa : 3
12 : 10
Hasil : 1
Sisa : 2
1 : 10
Hasil : 0
Sisa : 1

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

Jika sudah, maka kita sekarang bisa mencetaknya.


Contoh :
AX = Bilangan yang akan dicetak
BX = Nilai pembagi = 10 untuk desimal
DX = Menyimpan sisa bagi

CX = Jumlah digit angka


ORG 100H
MULAI:
MOV AX,12345
MOV BX,10
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

2.4. Mencetak Angka Biner


Mencetak angka dalam bentuk biner sering dianggapp sulit oleh para programmer.
padahal untuk melakukan hal ini cukup mudah. Algoritmanya hampir sama dengan
algoritma untuk mencetak angka desimal. Perbedaannya terletak pada bilangan
pembaginya, untuk mencetak bilangan desimal kita memakai 10 sebagai bilangan
pembagi, sedangkan untuk mencetak bilangan biner kita menggunakan angka 2
sebagai bilangan pembagi. Awalnya mungkin kita akan bertanya-tanya mengapa
kita menggunakan 10 untuk pembagi bilangan desimal dan mengapa kita memakai
angka 2 sebagai bilangan pembagi untuk bilangan biner. Hal ini karena bilangan
desimal mengenal 10 angka (0 - 9) sedangkan biner hanya mengenal 2 angka (0 dan
1).
ORG 100H
MULAI:
MOV AX,12345

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

2.5. Mencetak Angka Heksadesimal


Heksadesimal mengenal 16 angka yaitu 0 F. Sehingga kita memakai angka 16
sebagai bilangan pembagi. Karena heksadesimal memakai huruf A F untuk
mewakili angka 10 15, maka sebelum kita mencetak angka kita harus
membandingkannya dengan 10, jika tidak lebih besar, kita harus
menambahkannya dengan 7 untuk menjadikannya huruf A F.
ORG 100H
MULAI:
MOV AX,12345
MOV BX,16
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
;Bandingkan dengan 10
CMP AL,10
JNB PROSES
LANJUT:
;ubah ke ASCII
ADD AL,48
;Cetak !
MOV AH,0EH
INT 10H
LOOP PRINT
MOV AH,0
INT 16H
RET
PROSES:
ADD AL,7
JMP LANJUT

2.6. Menerima Input dari Keyboard


Menerima input dari keyboard bukan merupakan hal yang sulit. Kecuali jika anda
berencana untuk membuat keyboard driver sendiri.
Dalam hal ini, ada 2 interupsi yang dapat kita gunakan. Masing-masing mempunyai
kelebihan dan kekurangan tersendiri.
A. DOS Interrupt(mudah, namun tidak portable)
Untuk membaca input keyboard dengan interupsi DOS, kita memerlukan
sebuah buffer. Buffer merupakan tempat di memori yang disediakan untuk
menyimpan data. Tujuan dibuatnya buffer adalah untuk menyimpan input yang
telah diketikkan. Dalam hal ini, kita perlu membuat variable 2 byte di bagian
belakang buffer, untuk menyimpan informasi.
Byte 1
Ukuran Buffer

Byte 2
Digunakan sistem untuk menyimpan
berapa jumlah karakter yang telah
masuh dalam buffer.

Byte 3 - ???
Dipakai untuk Buffer

AH = Nomor Service DOS untuk membaca input (Selalu 10)


DX = Lokasi buffer
ORG 100h
JMP MULAI
;2 byte pertama untuk info !
;Byte 1 menunjukkan ukuran buffer 10 byte
;Byte 2 dibiarkan kosong !
buffer db 10,?, 10 dup(0)
MULAI :
;Ambil alamat dari buffer
LEA DX,[buffer]
MOV AH,10
INT 21h
RET

B. BIOS Interrupt (portable namun sulit diimplementasikan)


Cara ini dikatakan portable karena kode yang dihasilkan bisa dipakai di OS lain,
bukan hanya Windows/DOS. Namun, untuk mengimplementasikannya
dibutuhkan sedikit algoritma lagi.
Untuk mendapatkan input kita bisa memakai Interrupt 16h/AH = 0
AH = Nomor Service bios untuk membaca input (Selalu 0)
Output :
AL = Karakter output yang telah diketik disimpan di sini
ORG 100h
BACAKEY:
MOV AH,0
INT 16H
CMP AL,13
JE .ENTER
MOV AH,0EH
INT 10H
JMP BACAKEY
.ENTER :
RET

3. Membuat Program EXE


Selain program COM, ada juga program dengan ekstensi EXE. EXE merupakan
kepanjangan dari EXEcutable yang artinya dapat dijalankan. Program COM sangat
terbatas, karena program hanya diperbolehkan mengakses sebuah segment saja,
sehingga kode program dan data program berada pada segment yang sama. Dengan

hal ini, tak jarang pula


la program
progra mengalami error karena kode program
ogram ikut
ik tereksekusi.
Program EXE 16-bit berawal dari seorang programmer Microsoftt DOS, Mark
M
Zbikowski.
Mark menemukan sebuah
buah ide
id untuk membuat sebuah program yang dapat
dap mengakses
banyak segment. Untuk
tuk menghargai
men
idenya, setiap program executable
cutable pada DOS dan
Windows selalu berawalan
walan huruf
h
MZ.

Untuk membuat program


gram EXE
EX berbasis MZ dengan FASM, kita harus
arus menambahkan
me
beberapa direktif pada
da kode
kod kita.
format MZ
Pertama adalah direktif
ktif format
form MZ. Maksud direktif ini adalah untuk
memberitahukan compiler
mpiler bahwa
b
kita ingin membuat sebuah program
rogram MZ.
M
segment NamaSegmen
nt
Setiap kode dan dataa dalam program dapat diletakkan pada segment
ment yang
ya berbeda
beda. Jika sebuah segment
gment belum
b
cukup untuk menampung program,
gram, kita
ki bisa juga
mengalokasikan segment
ment lain
lai untuk program kita. Direktif ini fungsinya
ngsinya hampir sama
dengan label. Direktif
if Segment
Segm
digunakan untuk menamakan suatu lokasi
lo
di
segment, sehingga mudah
dah diakses.
d
Dengan kata lain, direktif ini akan membuat
me
NamaSegment menyimpa
nyimpan alamat segment pada memori.
stack Ukuran
Jika stack dialokasikan
an pada segment yang dipakai kode tentu program
rogram akan
a
mengalami kerusakan
n pada saat
s
berjalan, begitu pula dengan data.
ta. Oleh karena itu, kita
memerlukan segment
nt lain untuk
un
menaruh stack. Pada FASM, direktif
rektif stack
st
dipakai
untuk menentukan seberapa
eberapa besar memori yang disediakan untuk
uk stack yang dipakai
program.
entry LokasiKode
Yang terakhir adalah direktif entry. Fungsinya adalah untuk menentuk
enentukan lokasi
segment dan offset kode program.
pro
Contoh :
format MZ

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.

Membuat Program 32-bit


1. Pengenalan
Hampir semua sistem dan program komputer saat ini telah meninggalkan 16-bit.
Program 32-bit memiliki kemampuan yang lebih tinggi dan mendukung lebih banyak
fitur. Disini, kita akan mencoba membahas tentang program 32-bit. PE adalah format
file yang sering digunakan Windows saat ini. EXE dan DLL adalah beberapa contoh
objek yang menggunakan format PE. Selain di Windows, spesifikasi PE ternyata juga
dipakai pada sistem operasi lain, seperti OS/2 dan ReactOS. Dalam PE terdapat banyak
sekali konfigurasi yang sangat kompleks, sehingga program berformat PE umumnya
berukuran lebih besar dibandingkan program executable berjenis lain. File berukuran
besar bukanlah sebuah masalah, karena fitur yang dimilikinya jauh lebih lengkap.
Pertama, program berbasis PE mampu mendukung GUI dan dapat menangani memori
hingga 2 GB. Kedua, PE mendukung relokasi. Ketiga adalah hal keamanan yang lebih
terjamin. Dalam file PE terdapat bagian yang dinamakan section, setiap section dibuat
untuk tujuan yang spesifik, ada yang dipakai untuk menaruh kode, menaruh data dan
untuk menaruh informasi import table(digunakan untuk memanggil API). Setiap section
tidak dapat diakses sembarangan, karena section memiliki attribut yang menentukan
akses apa saja yang diperbolehkan, sehingga executable PE bisa kita bilang lebih aman.
Prosesor Intel masa kini mendukung fitur Paging, dengan fitur ini sistem dapat
membuat atau mengubah suatu alamat di memori menjadi alamat versinya sendiri.
Biasanya, bagian memori 0 2 GB dipakai untuk sistem dan bagian diatasnya dipakai
khusus untuk program, hal ini tentu dapat meningkatkan keamanan sistem operasi.
DOS MZ
header
DOS stub

Struktur Portable Executable

DOS MZ Header : Pada bagian ini terdapat signature dan


konfigurasi file MZ untuk DOS stub. Hal ini dimaksudkan agar file
dinggap valid ketika dijalankan pada DOS.
DOS Stub : Executable PE tidak dapat berjalan pada DOS, itulah
PE header
sebabnya mengapa terdapat DOS MZ Header dan DOS Stub.
Optional
DOS Stub merupakan kode yang berguna untuk memberikan
Header
informasi ke layar konsol DOS. Biasanya program akan
Section
menunjukkan pesan This program cannot be run in DOS Mode
table
ketika berjalan pada DOS.
Section 1
PE Header : Bagian sebelumnya bukanlah struktur yang tidak
Section 2
terlalu penting, bagian yang penting dan wajib kita ketahui
Section ...
adalah struktur-struktur berikutnya. Pertama, PE Header. Ini
dipakai untuk menyimpan informasi tentang spesifikasi yang diperlukan program dan
ukuran Optional Header.
Optional Header : Walaupun namanya Optional, bukan berarti bagian ini tidak wajib
desertakan. Justru bagian inilah yang menyimpan informasi file lebih detail. Lalu
kenapa dinamakan optional?. Hal ini karena PE merupakan format executable yang

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.

2. Membuat Executable PE dengan FASM


Berstruktur kompleks bukan berarti membutuhkan kode yang sangat panjang, karena
FASM telah memberikan direktif dan banyak header untuk membuat file PE.
2.1. Direktif yang digunakan untuk membuat PE
Bagian kode terpenting untuk membuat PE dengan mudah adalah kode direktif.
A. format
Direktif ini ditulis untuk menentukan tipe dari program yang akan kita buat.
Beberapa contoh format untuk PE antara lain :
PE GUI : Executable PE dengan subsystem GUI
PE CONSOLE : Executable PE dengan subsystem Console
PE DLL : Dynamic Link Library
Syntax :
FORMAT TipeProgram
B. entry
Fungsi direktif ini sama seperti fungsi direktif entry pada MZ, yaitu untuk
menentukan bagian kode yang pertama kali dieksekusi.
Syntax:

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.

2.2. Penggunaan Makro


FASM telah menyediakan beberapa instruksi makro untuk mengembangkan PE.
Semuanya itu telah di pack kedalam beberapa header dalam directory INCLUDE,
antara lain :
win32a.inc (Win32 programming headers (ASCII))
win32ax.inc (Extended Win32 programming headers (ASCII))
win32w.inc (Win32 programming headers (WideChar))
win32wx.inc (Extended Win32 programming headers (WideChar))
dll.
Contoh :
format PE GUI
entry utama
section .kode code readable executable
utama:
invoke MessageBox, 0, pesan, judul, MB_YESNO
;tunda 5000 ms / 5 detik
invoke Sleep, 5000
invoke ExitProcess,0
section .data data readable writable
pesan db tes pesan,0
judul db judul,0

section .idata import readable


library user,USER32.DLL,\
kernel,KERNEL32.DLL
import user,\
MessageBox, MessageBoxA
Import kernel,\
ExitProcess, ExitProcess,\
Sleep,Sleep
3. API
3.1. Pengertian
Application Programming Interface(API) merupakan suatu fungsi yang terdapat
dalam suatu pustaka atau file Dynamic Library(DLL). API dibuat untuk
memudahkan dan menyembunyikan kerumitan program.
Sebagian API memiliki parameter, parameter merupakan suatu variable yang
menentukan mekanisme kerja API ketika dipanggil
Contoh:
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long)
Pada contoh diatas, IsWindowVisible adalah nama API, user32(USER32.DLL)
adalah nama sebuah pustaka yang menyimpan API tersebut dan hwnd adalah
parameter.
Saat suatu fungsi API dipanggil sebenarnya, program hanya memasukkan
parameter ke dalam stack, lalu memanggil API yang berada pada dalam memori.
namun sebelum semua hal terjadi, tepatnya ketika kita mulai menjalankan sebuah
program, suatu bagian sistem yang bernama Windows Loader akan membaca
konfigurasi di PE header apakah cocok dengan processor yang kita pakai.
berikutnya, ia juga akan membaca optional header lalu meletakkan dan mengatur
semua section pada memori berdasarkan konfigurasi dari optional header.
Berikutnya, jika Windows Loader menemukan konfigurasi(pada optional header)
tentang adanya API, maka Windows loader akan menuju Import Table sesuai
dengan konfigurasi yang baru saja ia baca. Dalam import table terdapat nama API
dan Pustaka yang dibutuhkan oleh program, dengan membaca import table,
Windows loader dapat menentukan pustaka apa yang harus di load dan fungsi apa
yang akan dipakai. Jika pustaka telah di load, Windows loader akan memasukkan
alamat dari fungsi API dalam memori menuju suatu bagian import table yang
dipakai untuk menyimpan alamat dari API yang dipakai program. Alamat inilah
yang kemudian dipanggil program ketika memanggil API.
Contoh:

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.

Program 32-bit tidak boleh menggunakan interupsi


terupsi

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'

Terima kasih telah membaca Assemblious


Dont Forget to Visit :

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

Anda mungkin juga menyukai