Assemblious Libre Ok

86

Click here to load reader

description

bahasa mesin

Transcript of Assemblious Libre Ok

Page 1: Assemblious Libre Ok

TEST VERSION !!!

Page 2: Assemblious Libre Ok

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.

Page 3: Assemblious Libre Ok

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,

Page 4: Assemblious Libre Ok

Daftar Isi

Page 5: Assemblious Libre Ok

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

Page 6: Assemblious Libre Ok

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

Page 7: Assemblious Libre Ok

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

Page 8: Assemblious Libre Ok

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.

Page 9: Assemblious Libre Ok

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’

Page 10: Assemblious Libre Ok

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

Page 11: Assemblious Libre Ok

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

Page 12: Assemblious Libre Ok

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

Page 13: Assemblious Libre Ok

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

Page 14: Assemblious Libre Ok

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)

Page 15: Assemblious Libre Ok

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

Page 16: Assemblious Libre Ok

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

Page 17: Assemblious Libre Ok

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

Page 18: Assemblious Libre Ok

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)

Page 19: Assemblious Libre Ok

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

Page 20: Assemblious Libre Ok

Assembly

Dasar -

BAB II

bly

- Dasar Assembly

Page 21: Assemblious Libre Ok

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

Page 22: Assemblious Libre Ok

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

Page 23: Assemblious Libre Ok

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

Page 24: Assemblious Libre Ok

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,

Page 25: Assemblious Libre Ok

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

Page 26: Assemblious Libre Ok

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

Page 27: Assemblious Libre Ok

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

Page 28: Assemblious Libre Ok

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

Page 29: Assemblious Libre Ok

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

Page 30: Assemblious Libre Ok

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.

Page 31: Assemblious Libre Ok

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

Page 32: Assemblious Libre Ok

;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

Page 33: Assemblious Libre Ok

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 :

Page 34: Assemblious Libre Ok

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

Page 35: Assemblious Libre Ok

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

Page 36: Assemblious Libre Ok

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.

Page 37: Assemblious Libre Ok

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.

Page 38: Assemblious Libre Ok

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

Page 39: Assemblious Libre Ok

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

Page 40: Assemblious Libre Ok

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

Page 41: Assemblious Libre Ok

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

Page 42: Assemblious Libre Ok

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

Page 43: Assemblious Libre Ok

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

Page 44: Assemblious Libre Ok

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

Page 45: Assemblious Libre Ok

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

Page 46: Assemblious Libre Ok

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

Page 47: Assemblious Libre Ok

(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

Page 48: Assemblious Libre Ok

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

Page 49: Assemblious Libre Ok

[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

Page 50: Assemblious Libre Ok

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

Page 51: Assemblious Libre Ok

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

Page 52: Assemblious Libre Ok

$ 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

Page 53: Assemblious Libre Ok

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.

Page 54: Assemblious Libre Ok

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'

Page 55: Assemblious Libre Ok

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

Page 56: Assemblious Libre Ok

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

Page 57: Assemblious Libre Ok

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

Page 58: Assemblious Libre Ok

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

Page 59: Assemblious Libre Ok

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

Page 60: Assemblious Libre Ok

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

Page 61: Assemblious Libre Ok

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

Page 62: Assemblious Libre Ok

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.

Page 63: Assemblious Libre Ok

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.

Page 64: Assemblious Libre Ok

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

Page 65: Assemblious Libre Ok

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

Page 66: Assemblious Libre Ok

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

Page 67: Assemblious Libre Ok

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

Page 68: Assemblious Libre Ok

;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

Page 69: Assemblious Libre Ok

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

Page 70: Assemblious Libre Ok

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

Page 71: Assemblious Libre Ok

;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

Page 72: Assemblious Libre Ok

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

Page 73: Assemblious Libre Ok

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

Page 74: Assemblious Libre Ok

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

Page 75: Assemblious Libre Ok

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

Page 76: Assemblious Libre Ok

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

Page 77: Assemblious Libre Ok

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

Page 78: Assemblious Libre Ok

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:

Page 79: Assemblious Libre Ok

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’

Page 80: Assemblious Libre Ok

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

Page 81: Assemblious Libre Ok

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:

Page 82: Assemblious Libre Ok

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

Page 83: Assemblious Libre Ok

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,\

Page 84: Assemblious Libre Ok

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'

Page 85: Assemblious Libre Ok

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

Page 86: Assemblious Libre Ok

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