Sebelum kita masuk dalam dunia Reverse Engineering, kita perlu memahami dasar assembler. Assembler sangat penting,
karena Assembler merupakan awal dan akhir dari semua bahasa pemrograman. Pada bahasa tingkat tinggi kita sangat
mudah untuk melakukan pemrograman, padahal sebenarnya adalah proses assembler yang dilakukan cukup kompleks. But
Don’t Worry, Stay Cool and Keep Funky . Kita mulai belajar dari awal.
II. Register
Register adalah tempat khusus pada komputer, dimana kita bisa melakukan penyimpanan data. Kita bisa melihat register
sebagai sebuah “kotak”, dimana di dalamnya kita bisa menyimpan sesuatu seperti : nama, nomor, kalimat. Kita bisa melihat
register sebagai tempat penyimpanan.
Saat ini, kebanyakan komputer menggunakan 9 register 32bit. Yaitu :
EAX : Extended Accumulator Register
EBX : Extended Base Register
ECX : Extended Counter Register
EDX : Extended Data Register
ESI : Extended Source Index
EDI : Extended Destination Index
EBP : Extended Base Pointer
ESP : Extended Stack Pointer
EIP : Extended Instruction Pointer
Umumnya, ukuran register adalah 32 bit (4 bytes). Bisa menampung data dari 0 – 0FFFFFFFF. Pada awal, kebanyakan
register mempunyai fungsi utama yang memiliki nama yang berarti, seperti ECX = Counter, tetapi saat ini kita bisa
menggunakan register apapun yang kita sukai sebagai counter. Fungsi EAX, EBX, ECX, EDX, ESI, dan EDI akan dijelaskan
saat saya menjelaskan fungsi tertentu yang digunakan pada register tersebut.
BAHASA RAKITAN
PENGENALAN DEBUG DALAM ASSEMBLER
Register
Untuk mempelajari bahasa assembler, anda harus menghafalkan semua register dan mengerti apa kegunaannya, karena
anda akan selalu berhubungan dengan register – register tersebut. Register adalah sebagian kecil memory komputer yang
dipakai untuk tempat penampungan data dengan ketentuan bahwa data yang terdapat dalam register dapat diproses dalam
berbagai operasi dengan melihat berapa besar kemampuan menampung register tersebut.
Secara umum register dapat dibagi dalam lima golongan yaitu :
3. Pointer Register
3.1 IP : Instruction Pointer Register
Instruction Pointer berfungsi sebagai tempat menyimpan alamat dari kode yang akan dieksekusi selanjutnya oleh
mikroprosesor. Dalam kerjanya IP bekerja dengan code segmen (CS) untuk menghasilkan alamat relative dari suatu instruksi.
3.2 SP : Stack Pointer Register
3.3 BP: Base Pointer Register
4. Index Register
4.1 SI : Source Index Register
4.2 DI : Destination Index Register
5. Flag Register
Program Debug
Untuk menjalankan utility DEBUG, anda cukup mengetik DEBUG dari prompt. Sedang bila ingin membuka sebuah file
langsung untuk dioperasikan DEBUG, anda cukup menambahkan nama file itu sebagai command tail. Contohnya :
A> DEBUG AGUS.COM
1. Perintah Debug
a. Q (Quit)
Bila anda mengetikan huruf Q dan menekan enter, maka akan segera kembali ke dos prompt.
b. H (Hexa)
Perintah Hexa adalah perintah yang melaksanakan penjumlahan dan pengurangan terhadap dua bilangan Hexa. Bentuk
umum instruksi adalah H operand1,operand2
c. R (Register)
Perintah R digunakan untuk mengetahui isi masing-masing register pada saat mengetik R dan menekan enter
d. A (Assembler)
Perintah Assembler berguna untuk tempat menulis program Assembler.
-A100
0FD8:100
e. N (Name)
Perintah ini digunakan untuk memberi nama suatu program assembler
f. RCX (Register CX)
Perintah ini digunakan untuk mengetahui dan memperbaruhi isi register CX yang merupakan tempat penampungan panjang
program yang sedan aktif
g. RIP (Register IP)
Perintah ini digunakan untuk memberitahu komputer untuk memulai memproses program dari titik tertentu.
h. W (Write)
Perintah ini digunakan untuk menulis/ menyimpan program
i. G (Go)
Perintah ini digunakan untuk menjalankan suatu program
j. T (Trace)
Perintah ini digunakan untuk memproses sebaris program saja.
k. U (Unassemble)
Perintah ini digunakan untuk melihat listing program yang sedang aktif.
MOV CX,05
:0103 MOV AH,02
MOV DL,41
INT 21
LOOP 0103
INT 20
Jika program diatas dijalankan maka akan terjadi perulangan sebanyak lima kali. Hal ini karena isi dari register CX adalah 5
dan program akan looping ke memory segment 0103 yaitu tempat yang berisikan perintah MOV AH,02
Untuk setiap kali looping komputer akan mengurangi isi register CX satu sampai dengan CX menunjukan nol dan komputer
akan melanjutkan ke baris berikutnya dibawah loop. Jika anda meletakan Loop ke tempat MOV CX,05 maka hasil running
program tidak akan berhenti.
Stack
Secara umum stack adalah tempat peletakan sementara isi register. Stack pada file.COM terdapat di akhir segment dan
ketika pertama kali dijalankan program penunjuk stack (SP) akan langsung ke byte terakhir dari segment.
Operasi Stack mempunyai dua fungsi yaitu fungsi untuk memasukan isi suatu register/variable ke dalam stack dan
mengeluarkan isi register / variable dari Stack. Adapun perintah untuk memasukan isi register pada stack adalah perintah
PUSH dengan tata penulisannya adalah :
PUSH [operand 16 bit]
Perintah lain untuk operasi stack adalah perintah yang berguna untuk mengeluarkan isi dari register/variable dari stack
digunakan perintah POP dengan tata penulisannya adalah :
POP [operand 16 bit]
Untuk lebih jelasnya bisa anda perhatika program dibawah ini :
MOV CX,009
MOV DL,31
MOV AH,02
INT 21
PUSH DX
PUSH CX
MOV CX,001A
MOV DL,61
INT 21
INC DL
LOOP 0110
MOV DL,0D
INT 21
MOV DL,0A
INT 21
POP CX
POP DX
INC DL
LOOP 0107
INT 20
Pada baris kelima dan keenam terlihat bahwa anda melakukan operasi penyimpanan register ke stack dan pada baris
keenambelas anda mengambil isi stack menggunakan perintah POP. Bila anda menggambarkan stack pada akhir segment.
Anda dapat menunjukan bahwa ketika anda melakukan push terhadap register DX yang seandainya berisikan bilanagan 0021
H maka pada stack akan terlihat :
0000
0100
Penunjuk(SP)
FFFD
FFFF
Pada saat perintah PUSH CX dengan register CX berisikan angka 0009, maka akan terlihat di Stack :
0000
0100
Penunjuk(SP) FFFB
FFFD
FFFF
Pada saat perintah POP CX, keadaan stack akan kembali lagi pada saat tampilan stack yang pertama. Dari pembayangan
diatas dapat disimpulkan bahwa pada operasi stack yang pertama masuk ke stack adalah yang terakhir keluar dari stack dan
yang terakhir masuk ke stack, maka pertama yang keluar dari stack ( LIFO).
PENGENALAN TASM DAN OPERASI ARITMATIKA
Secara umum struktur penulisan suatu segment dapat dilukiskan sebagai berikut :
[nama segment] segment
ASSUME CS:[segment] DS:[segment] SS:[segment] ES:[segment]
Org 100H
[label] :
-
Program Assemblernya
-
[nama segment] ends
End [label]
Contohnya :
.MODEL SMALL
.CODE
ORG 100H
Start : Mov CX,05
Mov DL,41H
Label1 : Mov Ah,02H
Int 21H
Inc DL
Loop label1
Int 20H
End Start
Setelah program diatas dicompile dengan menggunakan TASM dan dilinker menggunkan TLINK /T , kemudian untuk
menjalankan programnya kita tinggal mengetikan nama filenya saja. Contohnya : CETAK
Operasi Aritmatika
Dalam Assembler operasi aritmatika yang dibahas adalah operasi pertambahan , pengurangan, perkalian dan pembagian.
- Operasi Pertambahan
• Pertambahan dengan 1
Adapun perintah untuk pertambahan dengan 1 dalam assemblera adalah INC, dengan tata penulisan perintah INC adalah :
INC [Register/Variable]
Contoh programnya :
MOV CX,05
MOV DL,41
# MOV AH,02
INT 21
INC DL
LOOP #
INT 20
• Pertambahan Selain 1
Perintah yang digunakan untk pertambahan selain 1 dalam assembler yaitu ADD, dengan tata penulisan perintah ADD
adalah:
ADD [operand1],[operand2]
- Operasi Pengurangan
• Pengurangan Dengan Satu
Perintah yang digunakan untuk penguarangan satu ini adalah perintah DEC, jika kita tulis biasa sama dengan A = A – 1. Tata
penulisan dari perintah DEC adalah :
DEC [Variable/Register]
Contoh Program :
MOV CX,05
MOV DL,5A
# MOV AH,02
INT 21
DEC DL
LOOP #
INT 20
• Pengurangan Selain Satu
Bila dalam pertambahan kita gunakan ADD maka dalam pengurangan selain satu digunakan SUB dengan tata penulisannya
adalah :
SUB [operand1],[operand2]
- Perkalian
Operasi perkalian dalam assembler dapat menggunakan perintah MUL yang berarti perkalian. Adapun tata penulisannya
adalah :
MUL [Register]
Bila memerintahkan dengan perintah MUL, maka yang dilakukan komputer adalah :
• Mengambil nilai register terlampir pada perintah MUL. Contoh MUL BL, maka isi register BL yang diambil
• Kemudian komputer mengambil isi register AL dan dikalikan dengan isi register BL
• Hasilnya dapat dilihat pada register AX. Langkah diatas adalah oprasi 8 bit, sedang untuk operasi 16 bit yang dilakukan
komputer adalah :
• Mengambil nilai register terlampir yang besarnya 16 bit. Contohnya : MUL BX
• Kemudian komputer mengambil isi register AX dan dikalikan dengan isi register BX
• Hasilnya dapat dilihat pada register OX
Contoh programnya :
MOV AH,02
MOV BH,32
MOV AL,01
MUL BH
MOV DL,AL
INT 21
INY 20
- Pembagian
Seperti juga perkalian, pembagian pun membedakan cara kerja pembagian dengan 8 bit dan 16 bit. Adapun cara kerja
operasi pembagian adalah :
- Pembagian 8 Bit - Pembagian 16 Bit
Tata penulisan : Tata Penulisan:
DIV [Register 8 bit] DIV [Register 16 Bit]
Contoh : Contoh:
DIV BL DIV BX
Dibagi dengan AX Dibagi dengan
DX:AX
Hasil dilihat di AL Hasil dilihat di DX
Sisa dilihat di AH Sisa dilihat di AX
Contoh Programnya :
MOV BL,0A
MOV AX,0101
DIV BL
MOV AH,02
MOV DL,AL
INT 21
INT 20
String yang kita input tadi dengan nama variable TAMPUNG akan dimasukan kedalam register BX, kemudian BX = BX + 1.
Kemudian setelah mendapat indikator tersebut, taruh di register DL dan mengosongkan register DH (XOR DH,DH). Gunakan
tampilan dibawah ini untuk memperjelas posisi BX terhadap variable tampung.
TAMPUNG db 11,I,?,?,?,?,?,?,?,?,?,?,?
Catatan : I = Indikator
Tambahkan satu supaya menunjuk kepada awal kata yang anda masukan dengan perintah INC BX.
TAMPUNG db 11,I,?,?,?,?,?,?,?,?,?,?,?
Catatan : I = Indikator
Setelah itu tambahkan BX dengan DX supaya menunjuk kepada huruf terakhir masukan. Ganti )D H dengan ‘$’ supaya bisa
dicetak menggunakan Int 21H dengan 09 H. Kemudian string input yang kita masukan bisa dicetak.
KONDISI / LOMPAT
Lompatan Tak Bersyarat
Secara fisik anda hanya dapat melihat bahwa lompatan tak bersyarat terdiri dari satu macam, tapi bila dianalisis jumlah byte
yang dipakai untuk lompatan tak bersyarat dapat dikelompokan menjadi 2 macam yaitu :
- Lompatan Dekat (Near Jump)
- Lompatan Jauh (Far Jump)
Adapun secara fisik perintah lompat dapat ditulis sebagai berikut :
JMP [lokasi memory]
Contoh :
JMP 200
Perintah ini adalah untuk melakukan lompatan kearah lokasi memory segment:0200
Perbandingan Lompatan Bersyarat
Untuk lompatan bersyarat, terdapat beberapa jenis lompatan yang kegunaanya dapat disesuaikan dengan keperluan yang
dibutuhkan. Untuk perbandingan Operand dengan menggunakan perintah perbandingan (Compare). Adapun tata penulisan
perintah perbandingan adalah :
CMP [operand1],[operand2]
Contohnya :
CMP AX,0102
Perintah ini digunakan untuk membandingkan AX dengan 0102
Lompatan Bersyarat
- JE (Jump If Equal)
Perintah ini berlaku bila pada saat pembandingan kedua opearnd sama. Contohnya :
CMP AX,0102
JE 0102
- JNE (Jump If Not Equal)
Perintah ini berlaku bila pada saat perbandingan kedua operand tidak sama. Contohnya :
CMP AX,0102
JNE 0102
- JG (Jump If Greater Than)
Perintah ini berlaku bila pada saat perbandingan operand pertama menunjukan lebih besar dari operand pertama.
Kebalikannya adalah JNG (Jump If Not Greater)
- JGE (Jump If Greater Or Equal)
Perintah ini berlaku bila pada saat perbandingan operand pertama menunjukan lebih besar atau sama dengan dari operand
pertama. Kebalikannya adalah JNGE (Jump If Not Greater)
• Masih banyak lagi perintah-perintah lompat bersyarat ini, perintah-perintah diatas hanya sebagian kecil dari perintah-perintah
lompat bersyarat.