assemblious libre ok
DESCRIPTION
bahasa mesinTRANSCRIPT
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
Alhamdulillahirabbil’aalamin, 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
Wohoo!!! Apakah and
Buku ini akAssembly...
Bersiaplah !Buku ini dis
Agar anda dcepat. Bacala
lewatkan ra
Memulai
BAB I
ah anda sudah siap?
ini akan membawa anda ke dalam dunia bly...
aplah ! ini disusun secara sistmatis dan terstruktur.
anda dapat menguasai Assembly dengan . Bacalah dengan beurutan dan jangan pernah
kan rahasia menarik Assembly.
Memulai 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
Mengenal Assembly
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
7 � 3 X ��. ���. ��� �
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.
0000 → 0
0001 → 1
0010 → 2
0011 → 3
0100 → 4
0101 → 5
0110 → 6
0111 → 7
1000 → 8
1001 → 9
1010 → 10
1011 → 11
1100 → 12
1101 → 13
1110 → 14
1111 → 15
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 ad
bilangan biner dan desimal
Desimal : 1 sapi
Biner : 1 sapi
Low Bit : Nilai Bit
High Bit : Nilai Bit
Nibble : 4 Bit
Byte : 8 Bit
Word : 2 Byte / 1
Double Word : 2 Word /
5. Jenis Bilangan
Seluruh program yang berja
milyaran, bahkan triliyunan
dalam bentuk bilangan bine
memberikan kemudahan ke
diperbolehkan menuliskan b
A. Biner Untuk menulis suatu bila
1. Selanjutnya, dibagian
Contoh :
00000001b, 10000000b,
B. Desimal
diatas adalah untuk menunjukkan pada kita bahwa p
esimal berbeda namun memiliki nilai yang sama. M
Desimal : 3 bola
Biner : 11 bola
Nilai Bit yang berada di bagian paling kanan
Nilai Bit yang berada di bagian paling kiri
2 Byte / 16 Bit
2 Word / 4 Byte / 32 Bit
berjalan pada komputer kita merupakan manipu
iliyunan bilangan biner. Tentu ini tidak mudah untuk
gan biner. Mengingat efisiensi waktu, maka Assemb
ahan kepada kita dalam menulis bilangan. Dalam
uliskan bilangan dalam 4 format. Antara lain :
uatu bilangan bit kita hanya diperbolehkan mengeti
ibagian belakang bilangan kita harus menyisipkan
00000b, 1011000010010000b
bahwa penulisan
sama. Misal :
manipulasi dari
ah untuk menulis angka
Assembler
Dalam assembly, kita
mengetik angka 0 dan
isipkan huruf ‘b’
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 → 0 1 → 1 2 → 2 . . . 125 → 125 126 → 126 127 → 127
128 → -128 129 → -127 130 → -126 . . . 253 → -3 254 → -2 255 → -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 Sector PerTrack) + 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 Jum lah Head
Track = Logical Sector \ (Sector Per Track x Juml ah 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
Berdasarkan gamb
0, maka kita akan
Segment 0 : Offset
Ya, kedua alamat t
Contoh lain, kita a
begitu kita menuju
dan Segment 2 : O
Inilah yang dimaks
Dengan terjadinya
dengan alamat yan
b. Absolut (Physical A
Ukuran program k
berbeda dengan p
harga memori yan
perkembangan tek
oleh model penga
Pengalamatan ini
= Segment
= Offset
an gambar diatas, kita misalkan akan mengakses
ta akan menemukan posisi 32 . Lalu berikutnya coba
: Offset 16, apa yang terjadi ?
alamat tersebut sama-sama menuju posisi 16 !
in, kita akan mencoba mengakses Segment 0 : Offse
menuju posisi Byte 48. Sekarang coba lihat Segmen
ent 2 : Offset 16. Keduanya menuju posisi 48.
g dimaksud dengan overlapping.
rjadinya overlapping, kita dapat mengakses data di
amat yang berbeda-beda.
Physical Address)
ogram komputer masa sekarang umumnya relatif be
engan program komputer di sekitar abad ke-19. Sela
ori yang semakin terjangkau, hal ini juga dipengaru
ngan teknologi Prosesor Intel. Munculnya Prosesor
l pengalamatan baru, yaitu model pengalamatan
atan ini sangat jauh berbeda dengan sistem pengala
akses Segment 1 : Offset
coba gunakan
0 : Offset 48, dengan
Segment 1 : Offset 32
ta di memori
relatif besar, sangat
Selain karena
ipengaruhi oleh
Prosesor 32-bit, diiringi
atan Absolut.
pengalamatan
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)
Pada program 16-bit, register ini menunjukkan segment lokasi kodeprogram
atau instruksi yang akan dieksekusi oleh Prosesor. Sedangkan pada program 32-
bit, 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.
2) 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.
3) ES (Extra Segment)
Banyak yang mengatakan extra segment hanya digunakan untuk keperluan lain,
namun sebenarnya register ini mempunyai fungsi yang sama dengan DS.
4) FS dan GS (80386+)
Terkadang dipakai untuk menunjukkan lokasi data juga, namun jarang sekali
dipakai.
5) 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 arti
berikutnya. Secara se
Lokasi Offset dari
berpasangan dengan
2) Base Pointer (BP,
Digunakan untuk me
Berpasangan dengan
3) Stack Pointer (SP,
Digunakan untuk me
Index Register :
1) Source Index (SI, ESI
Berpasangan dengan
2) Destination Index (DI
Berpasangan dengan
Kedua Register ini bis
instruksi perbandiang
Nama registe
bit, sedangka
64-bit, sementara reg
merupakan Register 1
Anggota dari register
Gambar di atas menu
dan RDI), sebenarnya
Efek dari penempata
register. Maka, nilai d
Kita misalkan semua biRDI : 0000 0000 0000000 EDI : 0000 0000 000DI : 0000 0000 00
Karena susunan register
kita ubah menjadi 11RDI : 0000 0000 0001111
g artinya instruksi selanjutnya terdapat pada bag
ecara sederhana, register IP digunakan khusus untu
dari instruksi program yang sedang dieksekusi. Reg
dengan CS (CS:IP)
(BP, EBP, RBP)
ntuk menunjuk dan mengakses suatu bagian data da
dengan SS (SS:BP)
r (SP, ESP, RSP)
ntuk menunjukkan lokasi menyimpan stack di memo
ESI, RSI)
dengan DS (DS:SI)
ndex (DI, EDI, RDI)
dengan ES (ES:DI)
er ini bisa digunakan seperti BP. Biasanya juga digun
andiangan dalam string.
a register yang berawalan E (seperti EDI, ESI) adalah
edangkan register yang berawalan R (seperti RBP) a
ntara register yang memiliki nama 2 huruf dan tanpa
egister 16-bit.
gister diatas memiliki struktur seperti gambar di b
as menunjukkan pada kita bahwa register sejenis(Se
enarnya letaknya tidak terpisah, melainkan saling b
empatan register ini dapat dilihat ketika kita mengu
a, nilai dari register lain akan terpengaruh. Misal :
mua bit register dalam keadaan kosong : 00 0000 0000 0000 0000 0000 0000 0000 0000 000
00 0000 0000 0000 0000 0000 000 0000
register saling berhubungan, sekarang coba tebak apa yan
111 1111 1111 1111 : 00 0000 0000 0000 0000 0000 0000 0000 000 0 000
ada bagian memori
sus untuk menunjukkan
usi. Register ini
data dalam memori.
di memori.
ga digunakan dalam
I) adalah register 32-
i RBP) adalah register
an tanpa awalan
bar di bawah ini.
jenis(Seperti DI, EDI
saling berhubungan.
a mengubah salah satu
isal :
00 0000 0000 0000
apa yang terjadi bila DI
00 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)
Bernilai 1 jika system berada pada Protected mode, dan bernilai 0 jika berada
dalam Real mode
2) MP(Monitor CoProsesor)
Untuk menangani terjadinya instruksi WAIT
3) EM (Emulate CoProsesor)
Untuk mengemulasikan CoProsesor
4) TS (Task Switched)
Digunakan dalam Multitasking
5) ET (Extension Type)
Flag untuk menentukan jenis Prosesor
6) RF(Resume Flag)
Terdapat pada Prosesor 80386 keatas
7) 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
Assembly
Dasar -
BAB II
bly
- 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.
Dasar – Dasar Assembly
2) WinASM
Sebenarnya, WinA
tidak ada salahnya
3) Notepad++
Lupakan dan buan
Notepad++. Notep
tambahan fitur, sa
untuk menulis kod
dapat menulis kod
mudah disesuaika
dikembangkan sec
dan Sistem berbas
Notepad++.
ya, WinASM adalah IDE yang dibuat khusus untuk M
salahnya jika anda ingin memakainya sebagai IDE Fl
buang jauh Notepad. Sekarang saatnya beralih m
+. Notepad++ merupakan sebuah text editor yang m
fitur, salah satunya adalah syntax highlighting. Sela
ulis kode dengan syntax assembly, dengan Notep
ulis kode dengan syntax bahasa lain. Tampilannya N
esuaikan, ringan dan juga stabil. Selain itu, Notepad
gkan secara cross-platform, kita bisa menjalankanny
berbasis Linux. Saya sangat merekomendasikan un
untuk MASM. Namun,
ai IDE Flat Assembler.
beralih menggunakan
r yang memiliki banyak
ing. Selain dipakai
Notepad++ kita juga
ilannya Notepad++
Notepad++ juga
lankannya di Windows
asikan untuk memakai
1.3. Cara mengkompilasi s
Untuk mengkompilas
1) Cara Cepat
Cara ini adalah car
mengkompilasi m
mengubah kode ji
langkahnya adalah
Buka kode yang in
menekan Ctrl + O
Berikutnya buka m
mpilasi source dengan Flat Assembler.
ompilasi source kita dapat menggunakan 2 cara.
alah cara yang sangat praktis dan mudah, yaitu den
pilasi melalui FASM IDE. dengan cara ini, kita dapat
kode jika suatu saat terjadi error pada syntax. Lang
a adalah sebagai berikut :
yang ingin kita compile melalui menu “File � Open
Ctrl + O
buka menu “Run � Compile” atau dengan meneka
aitu dengan
a dapat dengan cepat
ax. Langkah-
Open”, atau dengan
menekan “Ctrl + F9”.
2) Cara Manual
Pertama kita haru
Ketikkan [LokasiC
misal : “C:\Program
Cara ini kurang efe
menuju Windows d
kita hanya perlu m
“FASM.EXE [sourc
2. Memahami Penulisan Instru
Dalam penulisan kode, bany
jauh. Sebagian perintah dap
perlu diperhatikan struktur p
A. Operand
Operand merupakan pili
sebuah instruksi. Sebagi
sama sekali tidak memb
(Memori), konstanta ata
diperhatikan, beberapa
ita harus membuka Comand Prompt
LokasiCompilerFASM.exe] [sourcecode] [output]
Programs\Flat Assembler\FASM.EXE” “C:\test.asm
rang efektif, untuk itu kita coba menyalin compiler “
indows directory, “C:\WINDOWS\FASM.EXE”. Deng
perlu mengetikkan :
E [sourcecode] [output]”
an Instruksi pada Flat Assembler
de, banyak hal yang harus kita mengerti sebelum m
ntah dapat kita tulis biasa, namun ada juga beberapa
truktur penulisannya.
akan pilihan atau opsi untuk menentukan fungsi yan
i. Sebagian besar instruksi membutuhkan operand, d
k membutuhkan operand. Operand dapat berupa re
anta atau sebuah nilai (Immediate). Penulisan ope
berapa operand tidak memperbolehkan kode terten
utput]
est.asm” “C:\test.exe”
mpiler “FASM.EXE”
engan demikian
elum melangkah lebih
eberapa perintah yang
ngsi yang spesifik dari
erand, dan sisanya
erupa register, data
an operand juga harus
de tertentu. 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 sewaktu-
waktu.
Syntax :
NamaData Ti peData NilaiData
Tipe Data :
Tipe Data Ukuran Nilai yang diperbolehkan
DB (Define Byte) 1 Byte 0 - 255
DW (Define Word) 2 Byte 0 - 65535
DD (Define Double Word) 4 Byte 0 - 4294967295
DF (Define Far Word) 6 Byte 0 - 281474976710655
DQ (Define Quad Word) 8 Byte ?
DT (Define Ten Bytes) 10 Byte ?
Contoh: Data1 DB ? Data DB 20
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 3 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 masing-
masing 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 :
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
Operand 1 Operand 2
Register Register
Register Memori
Memori Register
Register Immediate
Memori Immediate
Segment Register Register
Register Segment Register
Segment Register Memori
Memori Segment Register
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 :
1) ADD (Add)
Menambahkan nilai Operand1 (Tujuan) dengan Operand2 (Sumber).
Hasilnya akan disimpan di Operand1.
Syntax :
ADD Operand1,Operand2
Operand 1 Operand 2
Register Register
Register Memori
Memori Register
Register Immediate
Memori Immediate
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 , BX SUB AL , 200
4) OR (Inclusive Logical OR)
Untuk melakukan operasi logika “Atau” antara Operand1 dengan
Operand2. Hasil operasi akan disimpan pada Operand1.
Bit 1 Bit 2 Hasil
0 0
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 , BX SUB AL , 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 :
1) MUL (Unsigned Multiplication)
Instruksi ini dipakai untuk melakukan operasi perkalian register
Accumulator dengan suatu bilangan tak bertanda.
Syntax :
Operand yang diperbolehkan
Register
Memori
MUL Operand
aturan :
Jika Operand Byte, AX = AL x Operand
Jika Operand Word, (DX AX) = AX x Operand
Jika Operand DoubleWord, (EDX EAX) = EAX x Operand
Contoh :
MOV AL, 2 MOV BL, 4 ;AX = AL x Operand (BL) MUL 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 AX, 8 MOV BL, 2 ;AL = AX / Operand (BL) DIV 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 :
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
Operand yang diperbolehkan
Register
Memori
MOV AL, 254 ;-2 = 254 NEG AL ;Hasil -> AL : 2 NEG AL ;Hasil -> AL : -2 (254)
3) NOT (Logical NOT)Untuk melakukan operasi logika “Bukan”pada
Operand. Setelah terjadi instruksi ini, nilai bit pada Operand tersebut
akan berubah.
Bit Awal Bit Hasil
0 1
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
keyboard
ditujukan
saja ditek
• Software
Tujuan di
interrupt.
program.
�
�
Interrupt biasa
memilih layana
menggunakan
Contohnya DOS
menggunakan
diminta.
Contoh pemak
INT 10h AH = 14 AL = Kar
ORG 100hMOV AH, 1MOV AL,”INT 10h mov ah, 0int 16h RET
Tamba
output
akan menghas
secara langsun
Terkadang, pro
ontohnya adalah keyboard. Ketika salah satu tombo
eyboard ditekan, maka Prosesor akan mengalami in
itujukan agar system operasi bisa mengetahui tombo
aja ditekan.
oftware Interrupt, yaitu interupsi yang dihasilkan ole
ujuan dibuatnya software interrupt berbeda dengan
terrupt. Software interrupt dibuat khusus untuk me
rogram. Contoh software interrupt :
DOS Interrupt
Interrupt ini ada pada system operasi turunan
(termasuk Windows). Untuk meminta Interup
menggunakan instruksi INT dengan nomor int
BIOS Interrupt
Interupsi ini secara default selalu ada pada kom
Interupsi ini bernomor 16 (10h). Pada interups
memakai beberapa layanan untuk Input dan Ou
pt biasanya dapat melakukan banyak layanan/fungs
ih layanan mana yang ingin digunakan, biasanya sua
unakan salah satu register untuk menentukan nomo
hnya DOS dan BIOS interrupt, kedua interupsi terseb
unakan register AH untuk menentukan layanan yan
pemakaian :
Service 14 (0Eh) untuk mencetak karakter. rakter yang ingin dicetak.
h 14 ”A” 0
Tambahkan kode ORG 100h pada bagian paling aw
output merupakan program COM(Command), jika
enghasilkan program BIN(Binary) yang tidak dapat
langsung oleh sistem.
ang, program yang kita hasilkan muncul error, atau
u tombol pada
alami interupsi. Ini
i tombol apa yang baru
kan oleh software.
dengan hardware
ntuk melayani
turunan DOS
Interupsi ini kita dapat
omor interupsi 33 (21h).
pada komputer.
interupsi ini kita dapat
ut dan Output.
an/fungsi, untuk
anya suatu interupsi
an nomor layanannya.
si tersebut
nan yang ingin
aling awal agar hasil
nd), jika tidak compiler
k dapat dijalankan
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
Memori
Alamat 0 1 2 3 4 5 6 7 8 9 10
Isi 0 0 0 0 0 0 0 0 100 0
Note :
Operand yang diperbolehkan pada instruksi PUSH dan POP
Kedua instruksi ini tidak dapat dipakai untuk bilangan dibawah 16 bit !
Operand yang diperbolehkan :
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
Operand
Register (Diatas 8-bit)
Memori (Diatas 8-bit)
Segment Register
Immediate
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
sama(kosong)
ZF = 1
JE(Jump if Equal)
JC (Jump if Carry) Lompat jika terjadi
overflow bilangan tak
bertanda
CF = 1
JB(Jump if Below) Lompat jika lebih kecil
JNAE(Jump if Not Above
or Equal)
Lompat jika tidak lebih
besar atau sama
JS(Jump if Sign) Lompat jika bertanda SF = 1
JO Lompat jika terjadi
overflow bilangan
bertanda
OF = 1
JP(Jump if Parity) Lompat jika genap PF = 1
JPE(Jump if Parity or
Equal)
Lompat jika genap atau
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
overflow bilangan tak
bertanda
CF = 0
JNB(Jump if Not Below) Lompat jika tidak lebih
kecil
JAE(Jump if Above or
Equal)
Lompat jika lebih besar
atau sama dengan
JNS(Jump if Not Signed) Lompat jika tidak
bertanda
SF = 0
JNO(Jump if Not
Overflow)
Lompat jika tidak terjadi
overflow
OF = 0
JPO(Jump if Parity or
Overflow)
Lompat jika terjadi
overflow bilangan
bertanda atau genap
PF = 0
JNP(Jump if Not Parity) Lompat jika ganjil
2) Lompatan bilangan bertanda
Instruksi Kegunaan Kondisi Flag
JZ (Jump if Zero) Lompat jika sama(kosong) ZF = 1
JE(Jump if Equal)
JNZ(Jump if Not Zero) Lompat jika tidak sama ZF = 0
JNE(Jump if Not Equal)
JG (Jump if Greater) Lompat jika lebih besar ZF = 0
dan
SF = OF
JNLE(Jump if Not
Lower or Equal)
Lompat jika tidak lebih
kecil atau sama dengan
JL (Jump if Lower) Lompat jika lebih kecil SF ≠ OF
JNGE(Jump if Not
Greater or Equal)
Lompat jika tidak lebih
besar atau sama dengan
JGE (Jump if Greater
or Equal)
Lompat jika lebih besar
atau sama dengan
SF = OF
JNL(Jump if Not
Lower)
Lompat jika tidak lebih
kecil
JLE (Jump if Lower or
Equal)
Lompat jika lebih kecil
atau sama dengan
ZF = 1
JNG(Jump if Not
Greater)
Lompat jika tidak lebih
besar
3) Lompatan bilangan tak bertanda
Instruksi Kegunaan Kondisi Flag
JZ (Jump if Zero) Lompat jika
sama(kosong)
ZF = 1
JE(Jump if Equal)
JNZ(Jump if Not Zero) Lompat jika tidak sama ZF = 0
JNE(Jump if Not Equal)
JA(Jump if Above) Lompat jika lebih besar CF = 0
dan
ZF = 0
JNBE(Jump if Not
Below or Equal)
Lompat jika tidak lebih
kecil
JB(Jump if Below) Lompat jika lebih kecil CF = 1
JNAE(Jump if Not
Above or Equal)
Lompat jika tidak lebih
besar atau sama dengan
JC(Jump if Carry) Lompat jika terjadi
overflow bilangan tak
bertanda
JAE(Jump if Above or
Equal)
Lompat jika lebih besar
atau sama dengan
CF = 0
JNB(Jump if Not
Below)
Lompat jika tidak lebih
kecil
JNC(Jump if Not Carry) Lompat jika tidak
terjadi overflow
bilangan tak bertanda
JBE(Jump if Below or
Equal)
Lompat jika lebih kecil
atau sama dengan
CF = 1
atau
ZF = 1 JNA(Jump if Not
Above)
Lompat jika tidak lebih
besar
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 kelu ar ;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)
LOOPZ Melakukan perulangan
hingga ZF = 1
(bilangan tak bertanda)
LOOPNE Melakukan perulangan
hingga ZF = 0
(bilangan bertanda)
LOOPNZ Melakukan perulangan
hingga ZF = 0
(bilangan tak bertanda)
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 AL, 255 MOV DH, 255 MOV AX, 65535 MOV ECX, 2000
2) Register Addressing
Register addressing merupakan penyalinan data antar register.
Syntax :
MOV RegisterTujuan,RegisterSumber
Contoh :
MOV AL, DL MOV DH, DL MOV AL, CH MOV AX, CX MOV DX, AX MOV ECX, EAX MOV 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 ‘D ataKu’ LEA BX,[DataKu] ;salin data yang berada pada offset yang ditunjuk B X 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 offse t 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 offse t 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 alamat‘G’ ;>>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 0 Null (!) \ 005C 92 Backslash
SOH 0001 1 Start of heading (!) ] 005D 93 Kurung sikur kanan
STX 0002 2 Start of text (!) ^ 005E 94 Tanda pangkat
ETX 0003 3 End of text (!) _ 005F 95 Garis bawah (underscore)
EOT 0004 4 End of transmission (!) ` 0060 96 Tanda petik satu
ENQ 0005 5 Enquiry (!) a 0061 97 Huruf latin a kecil
ACK 0006 6 Acknowledge (!) b 0062 98 Huruf latin b kecil
BELL 0007 7 Bell (!) c 0063 99 Huruf latin c kecil
BS 0008 8 Backspace d 0064 100 Huruf latin d kecil
HT 0009 9 Horizontal tabulation e 0065 101 Huruf latin e kecil
LF 000A 10 Pergantian baris (Line feed) f 0066 102 Huruf latin f kecil
VT 000B 11 Tabulasi vertikal g 0067 103 Huruf latin g kecil
FF 000C 12 Ganti baris (Form feed) h 0068 104 Huruf latin h kecil
CR 000D 13 Ganti baris (Carriage return) i 0069 105 Huruf latin i kecil
SO 000E 14 Shift out (!) j 006A 106 Huruf latin j kecil
SI 000F 15 Shift in (!) k 006B 107 Huruf latin k kecil
DLE 0010 16 Data link escape (!) l 006C 108 Huruf latin l kecil
DC1 0011 17 Device control 1 (!) m 006D 109 Huruf latin m kecil
DC2 0012 18 Device control 2 (!) n 006E 110 Huruf latin n kecil
DC3 0013 19 Device control 3 (!) o 006F 111 Huruf latin o kecil
DC4 0014 20 Device control 4 (!) p 0070 112 Huruf latin p kecil
NAK 0015 21 Negativ acknowledge (!) q 0071 113 Huruf latin q kecil
SYN 0016 22 Synchronous idle (!) r 0072 114 Huruf latin r kecil
ETB 0017 23 End of transmission block (!) s 0073 115 Huruf latin s kecil
CAN 0018 24 Cancel (!) t 0074 116 Huruf latin t kecil
EM 0019 25 End of medium (!) u 0075 117 Huruf latin u kecil
SUB 001A 26 Substitute (!) v 0076 118 Huruf latin v kecil
ESC 001B 27 Escape (!) w 0077 119 Huruf latin w kecil
FS 001C 28 File separator x 0078 120 Huruf latin x kecil
GS 001D 29 Group separator y 0079 121 Huruf latin y kecil
RS 001E 30 Record separator z 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
0 0030 48 Angka nol PLU 008C 140 Partial line up
1 0031 49 Angka satu 008D 141 Reverse line feed
2 0032 50 Angka dua SS2 008E 142 Single shift two
3 0033 51 Angka tiga SS3 008F 143 Single shift three
4 0034 52 Angka empat DCS 0090 144 Device control string
5 0035 53 Angka lima PU1 0091 145 Private use one
6 0036 54 Angka enam PU2 0092 146 Private use two
7 0037 55 Angka tujuh STS 0093 147 Set transmit state
8 0038 56 Angka delapan CCH 0094 148 Cancel character
9 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
A 0041 65 Huruf latin A kapital OSC 009D 157 Operating system
command
B 0042 66 Huruf latin B kapital PM 009E 158 Privacy message
C 0043 67 Huruf latin C kapital APC 009F 158 App program command
D 0044 68 Huruf latin D kapital 00A0 160 Spasi yang bukan pemisah
kata
E 0045 69 Huruf latin E kapital ¡ 00A1 161 Tanda seru terbalik
F 0046 70 Huruf latin F kapital ¢ 00A2 162 Tanda sen (Cent)
G 0047 71 Huruf latin G kapital £ 00A3 163 Tanda Poundsterling
H 0048 72 Huruf latin H kapital ¤ 00A4 164 Tanda mata uang
(Currency)
I 0049 73 Huruf latin I kapital ¥ 00A5 165 Tanda Yen
J 004A 74 Huruf latin J kapital ¦ 00A6 166 broken bar
K 004B 72 Huruf latin K kapital § 00A7 167 Section sign
L 004C 76 Huruf latin L kapital ¨ 00A8 168 Diaeresis
M 004D 77 Huruf latin M kapital © 00A9 169 Tanda hak cipta
(Copyright)
N 004E 78 Huruf latin N kapital ª 00AA 170 Feminine ordinal indicator
O 004F 79 Huruf latin O kapital « 00AB 171 Left-pointing double angle
quotation mark
P 0050 80 Huruf latin P kapital ¬ 00AC 172 Not sign
Q 0051 81 Huruf latin Q kapital 00AD 173 Tanda strip (hyphen)
R 0052 82 Huruf latin R kapital ® 00AE 174 Tanda merk terdaftar
S 0053 83 Huruf latin S kapital ¯ 00AF 175 Macron
T 0054 84 Huruf latin T kapital ° 00B0 176 Tanda derajat
U 0055 85 Huruf latin U kapital ± 00B1 177 Tanda kurang lebih
V 0056 86 Huruf latin V kapital ² kodok 178 Tanda kuadrat (pangkat
dua)
W 0057 87 Huruf latin W kapital ³ 00B3 179 Tanda kubik (pangkat
tiga)
X 0058 88 Huruf latin X kapital ´ 00B4 180 Acute accent
Y 0059 89 Huruf latin Y kapital µ 00B5 181 Micro sign
Z 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 instruksi-
instruksi 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 syst em, ;Jika terjadi, maka otomatis program akan berhenti. RET CETAKA : MOV AH, 0EH MOV AL, ”A” RET
Wohoo!!!
Apakah andBuku ini ak
Assembly... Bersiaplah !
Buku ini disAgar anda d
cepat. Bacalalewatkan ra
Memperd
BAB III
ah anda sudah siap? ini akan membawa anda ke dalam dunia
bly...
aplah !
ini disusun secara sistmatis dan terstruktur. anda dapat menguasai Assembly dengan
. Bacalah dengan beurutan dan jangan pernah kan 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
Memperdalam Syntax FASM
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, 1 mov ax, 2 mov ax, 3 mov ax, 4 mov ax, 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 memisah-
misahkan 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.
Banyak sekmengerti da
Menghafal sbukanlah ha
disini disedidan praktektanpa terlalu
Membua
BAB V
ak sekali konsep – konsep yang harus kita erti dan hafalkan dalam assembly.
hafal secara buka – bukaan (langsung) nlah hal menyenangkan, oleh karena itu
i disediakan contoh program untuk latihan raktek agar anda dapat menguasai assembly 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 ASC II) AL = karakter ASCII yang ingin dicetak
Contoh :
ORG 100h MOV AH, 0Eh MOV AL, ‘A’ INT 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’.
Membuat Program 16-bit
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 (Sel alu 6) DL = Karakter ASCII yang akan dicetak
Contoh :
ORG 100h MOV AH, 6 MOV DL, ‘D’ INT 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 (Sela lu 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 → 4 + 48 = 52
3 → 3 + 48 = 51
2 → 2 + 48 = 50
1 → 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 progra
Program EXE 16-bit berawal
Mark menemukan sebuah id
banyak segment. Untuk men
Windows selalu berawalan h
Untuk membuat program EX
beberapa direktif pada kod
format MZ
Pertama adalah direktif “form
memberitahukan compiler b
segment NamaSegmen
Setiap kode dan data dalam
beda. Jika sebuah segment b
mengalokasikan segment lai
dengan label. Direktif “Segm
segment, sehingga mudah d
“NamaSegment” menyimpa
stack Ukuran
Jika stack dialokasikan pada
mengalami kerusakan pada s
memerlukan segment lain un
untuk menentukan seberapa
program.
entry LokasiKode
Yang terakhir adalah direktif
segment dan offset kode pro
Contoh :
format MZ
la program mengalami error karena kode program ik
berawal dari seorang programmer Microsoft DOS, M
buah ide untuk membuat sebuah program yang dap
tuk menghargai idenya, setiap program executable
walan huruf MZ.
gram EXE berbasis MZ dengan FASM, kita harus me
da kode kita.
ktif “format MZ”. Maksud direktif ini adalah untuk
mpiler bahwa kita ingin membuat sebuah program M
nt
a dalam program dapat diletakkan pada segment ya
gment belum cukup untuk menampung program, ki
ment lain untuk program kita. Direktif ini fungsinya
if “Segment” digunakan untuk menamakan suatu lo
dah diakses. Dengan kata lain, direktif ini akan me
nyimpan alamat segment pada memori.
an pada segment yang dipakai kode tentu program a
n pada saat berjalan, begitu pula dengan data. Oleh
nt lain untuk menaruh stack. Pada FASM, direktif “st
eberapa besar memori yang disediakan untuk stack
direktif “entry”. Fungsinya adalah untuk menentuk
kode program.
ogram ikut tereksekusi.
t DOS, Mark Zbikowski.
yang dapat mengakses
cutable pada DOS dan
arus menambahkan
untuk
rogram MZ.
ment yang berbeda
gram, kita bisa juga
ngsinya hampir sama
suatu lokasi di
akan membuat
rogram akan
ta. Oleh karena itu, kita
rektif “stack” dipakai
uk stack yang dipakai
enentukan lokasi
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
Banyak sekmengerti da
Menghafal sbukanlah ha
disini disedidan praktektanpa terlalu
Membua
BAB VI
ak sekali konsep – konsep yang harus kita erti dan hafalkan dalam assembly.
hafal secara buka – bukaan (langsung) nlah hal menyenangkan, oleh karena itu
i disediakan contoh program untuk latihan raktek agar anda dapat menguasai assembly 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 : 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
sebabnya mengapa terdapat DOS MZ Header dan DOS Stub.
DOS Stub merupakan kode yang berguna untuk memberikan
informasi ke layar konsol DOS. Biasanya program akan
menunjukkan pesan “This program cannot be run in DOS Mode”
ketika berjalan pada DOS.
PE Header : Bagian sebelumnya bukanlah struktur yang tidak
terlalu penting, bagian yang penting dan wajib kita ketahui
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
Stru
ktur
Por
tabl
e E
xecu
tabl
e DOS MZ
header DOS stub
PE header
Optional
Header
Section
table
Section 1
Section 2
Section ...
Membuat Program 32-bit
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 assemb
Push 0
Call [ExitProcess]
[ExitProcess] merupak
Windows Loader. Vari
dapat
Bagaimana fungsi API ya
Sebuah API akan menge
GetWindow(hWnd As Lo
;push command
Push 2
;push hwnd
Push 65000
Call [GetWindow]
Mov [hasil],eax
parameter yang dima
menggunak
4. Memulai membuat Program
4.1. Membuat Program Kons
Hingga saat ini sistem op
aplikasi konsol, hal ini ka
dibuat. Pada PE, program
membedakannya adalah
juga masih dapat memb
AllocConsole dari KERN
Program
assembly:
erupakan variable yang menyimpan alamat API yan
der. Variabel ini berada pada import table. Pada FAS
dapat dibuat dengan instruksi macro IMPORT.
si API yang mengembalikan(return) sebuah nilai?
n mengembalikan nilai hasil menuju register EAX
d As Long, uCmd as Long) As Long
ng dimasukkan stack secara manual harus terbalik,
nggunakan invoke atau Call pada bahasa tingkat ting
Program
am Konsol
istem operasi modern masih belum sepenuhya men
hal ini karena aplikasi konsol lebih sederhana dan leb
, program konsol memiliki struktur yang sama. yang
a adalah pembukaan jendela konsol secara otomati
t membuka jendela konsol, yaitu dengan memangg
ri KERNEL32.DLL.
Program 32-bit tidak boleh menggunakan interupsi
t API yang telah di load
Pada FASM, variable ini
PORT.
nilai?
erbalik, tidak seperti
gkat tinggi.
hya meninggalkan
a dan lebih cepat
a. yang
otomatis. Program GUI
emanggil fungsi
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”
Don’t 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