Powered By Blogger

Cari Blog Ini

Selasa, 09 November 2010

Dasar Asembly

Assembler Dasar : Bit, Byte, dan Register

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.
I. Satuan, Bit, dan Byte
BIT - merupakan satuan data terkecil. Terdiri dari 1 atau 0. Biasa disebut dengan “Binary”.
BYTE – terdiri dari 8 bit. Memiliki nilai maksimal 225 (0-225). Biasa disebut sebagai “base 16 system” sedangkan binary disebut “base 2 system”.
WORD – merupakan 2 byte atau 16 bit. Word memiliki nilai maksimal 0FFFFh atau 65535d.
DOUBLE WORD – terdiri dari 2 word atau 32 bit. Nilai maksimal = 0FFFFFFFF atau 4294967295d.
KILOBYTE – 1000 bytes?? Bukan. 1 kilobyte tidak sama dengan 1000 bytes. 1 kilobyte sama dengan 1024 (32 * 32) bytes.
MEGABYTE – 1 Megabyte tidak sama dengan 1000000 bytes, tetapi 1024 * 1024 atau 1048578 bytes.
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.

Selasa, 13 April 2010

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 :
1. General Purpose Register
1.1 Register AX
Register AX merupakan register aritmatika karena register ini selalu dipakai dalam operasi pertambahan,pengurangan,perkalian dan pembagian
1.2 Register BX
Register BX merupakan salah satu dari dua register base addressing mode, yang dapat mengambil atau menulis langsung dari/ke memory
1.3 Register CX
Register CX merupakan suatu counter untuk meletakan jumlah lompatan pada loop-loop yang anda lakukan
1.4 Register DX
Register DX merupakan register yang mempunyai tugas:
• Membantu AX dalamoperasi perkalian pembagian
• DX meruapakan register offset dari DS
• Menunjukkan no. port pada operasi port.


2. Segment Register
2.1 Register CS : Code Segment Register
2.2 Register DS : Data Segment Register
2.3 Register SS : Stack Segment Register
2.4 Register ES : Extra Segment Register
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.

2. Perintah Dasar Assembler
a. MOV
Perintah MOV adalah perintah untuk mengisi, memindahkan, memperbaruhi isi suatu register, variable ataupun lokasi memory
Adapun tata penulisan perintah MOV adalah :
MOV [operand A], [Operand B]
Contoh :
MOV AH,02
Operand A adalah Register AH
Operand B adalah bilangan 02
Hal yang dilakukan oleh komputer untuk perintah diatas adalah memasukan 02 ke register AH.
b. INT (Interrupt)
Bila anda pernah belajar BASIC, maka pasti anda tidak asing lagi dengan perintah GOSUB. Perintah INT juga mempunyai cara kerja yang sama dengan GOSUB, hanya saja subroutine yang dipanggil telah disediakan oleh memory komputer yang terdiri 2 jenis yaitu :

- Bios Interrupt ( interput yang disediakan oleh BIOS (INT 0 – INT 1F))
- Dos Interrupt ( Interrupt yang disediakan oleh DOS (INT 1F – keatas))
 Contoh Program Sederhana
- A100
0FD8:0100 MOV AH,02
0FD8:0102 MOV DL,41
0FD8:0104 INT 21
0FD8:0106 INT 20
0FD8:0108
- Jika sudah Ketikan perintah G ( Go ) maka akan tampil huruf A
- Cara menyimpan program :
- RIP
IP 102
: 100 - diisi
- RCX
CX 0000
: 8 --> diisi ( panjangnya program)
- N Coba.Com memberi nama program
- W Menulis program


LOOPING DAN STACK
 Looping
Dalam Assembler perintah untuk melakukan perulangan digunakan perintah LOOP. Yang mempunyai tata penulisan sebagai berikut :
Loop [lokasi memory]
Adapun syarat lain untuk operasi Loop adalah harus mengisi register CX untuk setiap kali pengulangan. Coba anda lihat contoh program looping dibawah ini :

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

 Program Tanpa Debug
Selain kita bisa menggunakan DEBUG.COM dalam membuat program assembler kita juga bisa membuat program assembler tanpa menggunakan DEBUG.COM, dimana untuk keperluan itu diperlukan beberapa program yaitu :
- Text Editor
Text editor ini digunakan untuk membuat/menulis program assembler. Adapun contoh dari editor ini adalah SideKick , Notepad, Norton Editor, dll.
- Compiler
Yang dimaksud dengan Compiler adalah suatu program yang menterjemahkan program assembler dalam ASCII file ke bentuk file object, dalam assembler kita gunakan TASM. Contohnya :
TASM CETAK.ASM CETAK.OBJ
- Linker
Yang dimaksud dengan Linker adalah suatu program yang menterjemahkan program object ke bentuk file eksekusi (berextension .COM atau . EXE), dalam assembler kita gunakan TLINK. Contohnya :
TLINK /T CETAK
 Struktur Program Dalam TASM

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

MENCETAK STRING DAN MENGINPUT STRING
 Mencetak String
Sebelum kita mencetak sebuah string terlebih dahulu kita harus mendefinisikan variablenya. Variabel dalam bahasa assembler dapat dibagi menjadi 2 jenis variabel, yaitu :
- Variabel yang dapat dimodifikasi isinya.
Variabel ini adalah variabel yang memakan tempat pada memory, besar memory yang dipakai variabel ini ditentukan oleh besarnya variabel tersebut. Adapun besaran-besaran variabel tersebut adalah :
• DB (Define Byte), mendefinisikan variabel per byte
• DW (Define Word), mendefinisikan variabel per wprd
• DD (Define Double Word), mendefinisikan variabel per 2 word


Tata penulisan variabel jenis ini adalah dengan :
Label [DB/DW/DD] [Isi Variabel]
Contohnya :
Satu db ‘Ini Adalah Sebuah Variabel $’
- Variabel yang tidak dapat dimodifikasi isinya.
Jenis variabel ini tidak akan memakan memory pada komputer, jenis variabel ini hanya dapat dipakai dalam assembler menggunakan compiler. Untuk mendefinisikan jenis variabel ini anda cukup menggantikan besaran pada variabel yang dapat dimodifikasikan isinya menjadi kata equ.
Pada bagian ini akan dibahas bagaimana cara mencetak sebuah kalimat ke layar menggunakan Int 21 Hexa service number 09h. Adapun syarat-syarat untuk menggunakan Int 21 H service 09H ini adalah :
- Masukan Service number Interupt ke register AH.
- Masukan segment dario variabel tempat menampung kata yang akan dicetak ke DS dan offset-nya ke DX dan kata-kata yang dicetak tersebut harus diakhiri dengan tanda dollar ‘$’.
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H
START : JMP MULAI
;Disini data dimulai
KATA DB ‘TEST KATA-KATA’,13,10
DB ‘SATU $’
MULAI : MOV AH,09H
MOV DX,OFFSET KATA ; ATAU LEA DX,KATA
INT 21H
INT 20H
END START
 Input Satu Karakter
Untuk input 1 karakter dengan ECHO kita akan menggunakan Interrupt 21H dengan service number 01H. Adapun syarat-syarat menggunakan Interupt 21H service number 01H ini adalah :
- Pada saat sebelum dilakukan proses, register AH harus berisi service number dari interupt 21H yaitu 01H
- Selama proses, proses dapat dihentikan dengan menekan tombol control dan tombol break atau C secara bersamaan.
- Hasil input dari keyboard akan diletakan di register AL
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H
START :JMP MULAI
TANYA DB ‘JAWAB SAJA PERTANYAAN INI : ‘,13,10
DB ‘MASUKAN SATU KARAKTER : $’,13,10
HASIL DB ‘KARAKTER ITU : $’
MULAI : MOV AH,09H
LEA DX,TANYA ;MENCETAK TANYA
INT 21H
MOV AH,01H ;SERVICE UNTUK INPUT 1 CHAR
INT 21H
MOV AH,09H
LEA DX,HASIL ;MENCETAK HASIL
INT 21H
MOV AH,02H
MOV DL,AL ;CETAK HASIL INPUT
INT 21H
INT 20H
END START

 Input Lebih Dari Satu Karakter (String)
Untuk melakukan input lebih dari satu karakter, digunakan Int 21H dengan service number 0AH yang mempunyai syarat proses sebagai berikut :
- Register Ah harus berisikan service number dari interupt 21H tersebut 0AH
- Harus mendefinisikan sebuah variabel tempat menampung masukan dengan tata penulisan variabel sebagai berikut :
[label] db nn,mm,nn dup(?)
dengan aturan tata penulisan tersebut adalah :
 nn adalah jumlah terbanyak karakter yang dapat dimasukan + 1, guna + 1 adalah untuk tempat 0D Hexa
 mm adalah indikator dari beberapa banyak karakter yang dimasukan mm ini secara otomatis oleh komputer setiap kali kita melakukan input, sehingga pada saat kita mendefinisikan variabel tempat menampung mm ini dapat dikosongkan dengan menggunakan tanda tanya (?) yang artinya satu byte memory yang tidak diisi. Jumlah maksimum mm adalah nn – 1.
- DS:DX harus berisi segment dan offset awal variabel diatas.
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H


START : JMP MULAI
TANYA DB ‘MASUKAN STRING : $’,13,10
TAMPUNG DB 11,?,11 DUP(?)
JAWAB DB ‘STRING TADI ADALAH : $’
MULAI : MOV AH,09H
MOV DX,OFFSET TANYA ;CETAK TANYA
INT 21H
MOV AH,0AH ;INPUT STRING
MOV DX,OFFSET TAMPUNG
PUSH DX ; ISI DX KE STACK
INT 21H
MOV BX,OFFSET TAMPUNG
INC BX ; BX = BX + 1
MOV DL,[BX] ; ISI DX DENGAN [BX]
XOR DH,DH ;DH = 0
INC BX
ADD BX,DX
MOV DL,’$’
MOV [BX],DL ;MASUKAN DL KE [BX]
MOV DX,OFFSET JAWAB ;CETAK JAWAB
MOV AH,09H
INT 21H
POP DX ;AMBIL DX DARI STACK
INC DX
INC DX
MOV AH,09H
INT 21H
INT 20H
END START

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.

PROCEDURE DAN MACRO

 Subroutine/Procedure
Bila anda mempunyai masalah anda harus menulis suatu perintah berulang-ulang, maka dengan operasi subroutine anda dapat menyingkat kerja yang ada diprogram tersebut hingga setelah program. Struktur dari subroutine/procedure bisa anda lihat dibawah ini :
[nama subroutine] PROC [NEAR/FAR]
Disini Letak Program Anda
RET
[nama subroutine] ENDP
Adapun maksud dari NEAR dan FAR adalah :
- NEAR
Berarti subroutine tersebut bersifat dekat atau subroutine itu hanya akan dipanggil paling jauh satu segment.
- FAR
Berarti subroutine ini dapat dioperasikan antar segment karena untuk memanggil subroutine dapat dilakukan lebih jauh dai 1 segment.
Untuk memanggil subroutine, digunakan perintah CALL yang dapat didefinisikan dengan :
CALL [nama subroutine]
Adapun yang dilakukan komputer ketika memproses CALL adalah :
- Memasukan alamat pemanggil ke Stack dengan besar 2 byte bila subroutine tersebut NEAR dan 4 byte bila subroutine tersebut FAR.
- Mencari alamat subrotine yang dipanggil dan siap melakukan perintah yang diperintahkan oleh subroutine.
Perintah RET berarti komputer akan mengembalikan penunjuk program (IP) ke program pemanggil. Adapun yang dilakukan komputer ketika menerima instruksi RET adalah :
- Mengambil alamat pemanggil dari STACK dengan besar 2 byte bila subroutine NEAR dan 4 byte bila subroutine FAR.
- Meloncat ke arah alamat tersebut.
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H
START : JMP MULAI
KOLOM DB 00
BARIS DB 00
MULAI : CALL BERSIH
CALL POSISI
INT 20H
HAPUS PROC NEAR
MOV AH,06H
MOV CX,0000H
MOV AL,00H
MOV BH,07H
MOV DH,24
MOV DL,79
INT 10H
RET
CLS ENDP
POSISI PROC NEAR
MOV DH,BARIS
MOV DL,KOLOM
MOV AH,02H
MOV BH,00
INT 10H
RET
POSISI ENDP
END START




























SOAL – SOAL PRAKTIKUM

I. Minggu Pertama
1. Apa yang anda ketahui tentang register secara umum dan sebutkan beberapa golongan secara umum ?
2. Jelaskan fungsi-fungsi perintah dibawah ini yang terdapat dalam Debug :
- A
- N
- RCX
- RIP
- W
- G

3. Jelaskan fungsi dari perintah-perintah di bawah ini :
- mov
- int
- push
- pop
4. Buatlah program sederhana dengan menggunakan Debug.com untuk menampilkan :
a. MaJaLeNgKa
b. 1a2b3c4d5e










I. Minggu Pertama
1. Register adalah sebagian kecil emori komputer yang dipakai untuk tempat penampungan data dengan ketentuan bahwa data yang ada dalm komputer tersebut dapat diproses dalam berbagai. Secara umum register dapat dibagi dalam lima golongan, antara lain :
- General Purpose Register (ax,bx,cx,dx).
- Segment Register (cs,ds,ss,es).
- Pointer Register (ip,sp,bp).
- Flag Register.
2. Fungsi-fungsi dari perintah dibawah ini dalam debug.com adalah
- A : perintah assembler yang berguna untuk tempat menulis program ASM
- N : memberi nama suatu program
- RCX : perintah untuk mengetahui dan memperbaharui isi dari register cx yang merupakan tempat paenampungan panjang program yang sedang aktif sebelum program dijalankan.
- RIP : perintah yang memberitahu komputer untk memulai proses program pada titik tertentu.
- W : perintah untuk menulis atau menyimpan program.
- G : perintah untuk menjalankan program.
3. Fungsi dari perintah-perintah :
- mov : perintah untuk mengisi, memindahkan, memperbaharui isi suatu register variabel atau suatu lokasi memori.
- int : perintah untuk memanggil suatu subroutin yang berada ataupun suatu lokasi memori.
- push : perintah untuk memasukkan isi register kedalam stack
- pop : perintah untuk mengeluarkan isi register dari stack




4. Program
a. MaJaLeNgKa

-debug
a100
mov ah,02
mov dl,47
int 21
mov dl,75
int 21
mov dl,4e
int 21
mov dl,61
int 21
mov dl,64
int 21
mov dl,52
int 21
mov dl,4d
int 21
mov dl,61
int 21
int 20








b. a2b3c4d5e

- debug
a100
mov ah,02
mov cx,05
mov bx,3161
* mov dl,bh
int 21
mov dl,bl
int 21
inc bh
inc bl
loop *
int 20

catt : * alamat offsed
segmen : offsed













II. Minggu Kedua
1. Apa yang dimaksud dengan compiler dan lingking dalam assembler dan jelaskan sintaks dari compiler dan lingker assembler tersebut ?
2. Tuliskan structure proram assembler dalam TASM ?
3. Sebutkan dan jelaskan macam-macam perintah dalam assembler dibawah ini :
a. Penambahan
b. Pengurangan
c. Perkalian
d. Pembagian
4. Buatlah program operasi aritmatika untuk menampilkan :
a. 2 + 3 = 5
b. 3 * 3 = 9


















II. Minggu Kedua
1. Compiler adalah suatu program yang menterjemahkan program assembler dalam ASCI file ke bentuk object.
Sintaks : TASM namafile.asm namafile.obj
Linker adalah suatu program yang menterjemahkan program-program object ke suatu program yang bisa dieksekusi.
Sintaks : TLINK/T namafile.obj
2. Structure Program assembler :
[nama segment] segment
assume cs : [segment] dc: [segment] ss: [segment] es : [segment]
org 100h
[label]
program assemblernya
[nama segment] ends
end [label]

3. a. Operasi pertambahan
- pertambahan dengan 1 kita gunakan INC [register/variabel]
- pertambahan selain 1 kita gunakan ADD [operand1],[operand2]
b. Operasi pengurangan
- pengurangan dengan 1 kita gunakan DEC [register/variabel]
- pengerangan selain 1 kita gunakan SUB [operand1],[operand2]
c. Operasi perkalian
Mengguanakan MUL [register]
- mengambil nilai register yang terlampir pada perintah MUL
- komputer mengambil isi register AL, kemudian dikalikan dengan nilai register tadi
- hasilnya dilihat ada register AX
d. Oprasi pembagian
- menggunakan DIV [register]
- hasil pembagi ada diregister AL dan sisanya di AH
4. Program
a. 3 + 4 = 7

.model small
.code
org 100h
start : mov ax,03h
int 10h
mov ah,02h
mov bh,33h
mov bl,34h
mov dl,bh
int 21h
mov dl,2b
int 21h
mov dl,bl
int 21h
mov dl,3d
int 21h
sub bl,30h
add bh,bl
mov dl,bh
int 21h
int 20h
end start






b. 3 x 3 = 9

.model small
.code
org 100h
start : mov ax,03h
int 10h
mov ah,02h
mov bh,33h
mov bl,33h
mov dl,bh
int 21h
mov dl,78h
int 21h
mov dl,bl
int 21h
mov dl,3dh
int 21h
sub bh,30h
mov al,03h
mul bh
add al,30h
mov dl,al
mov ah,02h
int 21h
int 20h
end start




IV. Minggu Keempat
1. Sebutkan dan jelaskan 2 macam lompatan dalam assembler ?
2. Apa fungsi dari :
a. JMP
b. CMP
c. JE
d. JNE
3. a. Buatlah Program assembler dengan TASM dengan tampilan :
Masukkan angka [1..3] :
Ket : jika kita masukan :
1, maka akan muncul Saya Laki-laki
2, maka akan muncul Saya Perempuan
selain itu maka akan muncul Saya Bukan Keduanya
Gunakan CMP, JE, JNE
b. Buatlah program menu dengan tampilan
** MENU UTAMA**
<>
-----*************-----
1. Sarapan Apgi
2. Makan Siang
3. Makan Malam
4. Exit
------------------------------
Tentukan Pilihan Anda [1..4] :







Jika :
1, akan tampil : Nasi Goreng
Udang Goreng
Teh Manis
2, akan tampil : Nasi Putih
Cumi Rebus
Ikan Bakar
Air Putih
3, akan tampil : Nasi putih
Kerang Rebus
Kepiting Panggang
Air Putih
4, Exit


















IV. Minggu Keempat
1. Dua jenis lompatan dalam assembler adalah
a. lompatan tak bersyarat
yaitu kondisi akan melompat ke suatu alamat memori tanpa syarat
b. lompatan bersyarat
yaitu kondisi akan melompat ke suatu alamat memori dengan suatu
syarat
2. Fungsi dari perintah-perintah :
a. JMP
Perintah ini adalah untuk melakukan lompatan kearah lokasi memori segment
b. CMP
Perintah ini digunakan untuk membandingkan kedua operand
c. JE
Perintah ini untuk melakukan lompatan kearah lokasi memori segment jika perbandingan kedua operand sama

d. JNE
Perintah ini untuk melakukan lompatan kearah lokasi memori segment jika perbandingan kedua operand tidak sama









3. a. Program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Masukkan Angka [1..3] : $”,13,10
kt2 db “Saya Laki-laki $”,13,10
kt3 db “Saya Perempuan $”,13,10
kt4 db “Saya Bukan Keduanya $”,13,10
mulai : mov ax,03h
int 10h
mov ah,09h
lea dx,kt1
int 21h
mov ah,01h
cmp al,’1’
je laki
cmp al,’2’
je wanita
cmp al,’3’
je bukan
laki : mov ah,09h
lea dx,kt2
int 21h
jmp selesai
wanita : mov ah,09h
lea dx,kt3
int 21h
jmp selesai


bukan : mov ah,09h
lea dx,kt4
int 21h
jmp selesai
selesai : int 20h
end start


b. program

.model small
.code
org 100h
start : jmp mulai
menu db “** MENU UTAMA **”13,10
db “<>”,13,10
db “********************”,13,10
db “1. Sarapan Pagi “,13,10
db “2. Makan Siang”,13,10
db “3. Makan Malam”,13,10
db “4. Exit”,13,10
db “------------------------------“,13,10
db “Tentukan Pilihan Anda [1..4] : $”
jwb1 db “1. Nasi Goreng”,13,10
db “2. Udang Goreng”,13,10
db “3. The Manis $”
jwb2 db “1. Nasi Putih”,13,10
db “2. Cumi Rebus”,13,10
db “3. Ikan Bakar”,13,10
db “4. Air Putih $”

jwb 3 db “1. Nasi Putih”,13,10
db “2. Kerang Rebus”,13,10
db “3. Kepiting Panggang:,13,10
db “4. Air Putih $”
mulai : mov ax,03h
int 10h
mov ah,02h
lea dx,menu
int 21h
mov ah,01h
cmp al,’1’
je pil1
cmp al,’2’
je pil2
cmp al,’3’
je pil3
jmp selesai
pil1 : mov ah,09h
lea dx,jwb1
int 21h
jmp selesai
pil2 : mov ah,09h
lea dx,jwb2
int 21h
jmp selesai
pil3 : mov ah,09h
lea dx,jwb3
jmp selesai
selesai : int 20h
end start

V. Minggu Kelima
1. Tuliskan structure dari subroutine/procedure ?
2. Buatlah program dengan menggunakan macro untuk mencetak string denga tampilan sebagai berikut :
a. Selamat Datang
Di Lab SI
Univ Gunadarma
b. Masukkan Kata : < DARMA >
AMRAD
AMRA
AMR
AM
A
3. Buatlah program dengan menggunakan procedure dengan tampilan sebagai berikut :
Masukkan suatu kalimat : Yudhi
Yudhi
Yudh
Yud
Yu
Y










V. Minggu Kelima
1. Struktur subroutine/procedure :
[nama subroutine] proc [near/far]
isi program
ret
[nama subroutine] endp
2. a. Cetak makro kalimat
mov ah,09h
mov dx,offset kalimat
int 21h
endm
.model small
.code
.org 100h
start : jmp mulai
kt1 db “Selamat Datang $”
kt2 db 13,10, “Di Lab SI $”
kt3 db 13,10, “Univ Gunadarma $”
mulai : cetak kt1
cetak kt2
cetak kt3
int 20h
end start








b. Cetak makro kalimat
mov ah,09h
mov dx,offset kalimat
int 21h
endm
.model small
.code
org 100h
mulai : jmp proses
kt1 db “ Masukkan Nama Anda : $”
jwb db 11,?,11 dup(?)
proses : mov ax,03h
int 10h
cetak kat1
mov ah,0ah
lea dx,jwb
int 21h
push dx
lea bx,jwb
inc bx
mov dl,[bx]
xor dh,dh
mov dl,bx
movsi,bx
mov cx,dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h

B : push cx
mov cx,si
A : dec bx
mov ah,02h
mov dl,[bx]
int 21h
loop A
mov dl,0dh
int 21h
mov dl,0ah
int 21h
sub bx,31
dec si
pop cx
loop B
int 20h
end mulai














3. Program
.model small
.code
org 100h
mulai : jmp proses
kt1 db “Masukkan Nama Anda : $”
jwb db 11,?,11 dup(?)
proses : mov ax,03
int 10h
mov ah,09h
lea dx,kt1
int 21h
mov ah,0ah
lea dx,jwb
int 21h
push dx
lea bx,jwb
inc bx
mov dl,[bx]
xor dh,dh
mov dl,bx
mov si,bx
mov cx,dx
call bawah
B : push cx
mov cx,si





A : inc bx
mov ah,02h
mov dl,[bx]
int 21h
loop A
call bawah
sub bx,si
dec si
popcx
loop b
int 20h
end mulai
bawah proc near
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
ret
bawah endp










III. Minggu Ketiga
1. Jelaskan fungsi berikut ini :
a. int 21h service number 09h
b. int 21h service number 01h
c. int 21h service number 0ah
2. Buatlah program dengan tampilan sebagai berikut :
a. ***SELAMAT DATANG ***
*DI LAB SISTEM INFORMASI*
**GUNADARMA**
b. Masukkan var ke-1 : 4
Masukkan var ke-2 : 3
Jumlah var tersebut adalah : 7
3. Buatlah proran dengan tampilan seperti dibawah ini :
Masukkan Nama Anda : Yudhi
Nama Anda adalah : Yudhi
















III. Minggu Ketiga
1. Fungsi dari INT 21
- service number 09H : digunakan untuk mencetak string
- service number 01H : digunakan untuk menginput karakter
- service number 0AH : digunakan untuk menginput string
2. a. Program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Selamat Datang $”
kt2 db 13,10, “Di Lab Sistem Informasi $”
kt3 db 13,10, “ Gunadarma $”
mulai : mov ah,09h
lea dx,kt1
int 21h
lea dx,kt2
int 21h
lea dx,kt3
int 21h
int 20h
end start
b. program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Masukkan var ke-1 : $”,13,10
kt2 db “Masukkan var ke-1 : $”,13,10
kt3 db “Penjumlahan 2 var : $”,13,10

mulai : mov ah,09h
lea dx,kt1
int 21h
mov ah,01h
sub al,30h
mov bl,al
xor al,al
mov ah,09h
lea dx,kt2
int 21h
mov ah,01h
int 21h
mov al,30h
mov bh,al
add bh,al
mov ah,09h
lea dx,kt3
int 21h
mov ah,02h
add dl,30h
mov dl,bh
int 21h
int 20h
end start










3. Program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Masukkan Nama Anda :$”
kt2 db 13,10, “Nama Anda Adalah : $”
var db 11,?,11 dup(?)
mulai : mov ax,03h
int 10h
mov ah,09h
lea dx,kt1
int 21h
mov ah,0ah
lea dx,var
int 21h
mov ah,09h
lea dx,kt2
int 21h
lea bx,var
mov dl,[bx]
xor dh,dh
mov cx,dx
A : inc bx
mov ah,02h
mov dl,[bx+1]
int 21h
loop A
int 20h
end start























Senin, 12 April 2010

assembly

Pengenalan Assembly

Pengenalan Assembly
Penulis : oh_gayo
Press : ISD
Tahun : 2003
################################################

1. Apakah Sebenarnya Bahasa Assembly itu?
-------------------------------------------
Bahasa Assembly (Assembler) adalah merupakan salah satu dari sekian banyak bahasa pemrograman yang tergolong dalam Bahasa Pemrogaman Tingkat Rendah (Low Level Language) dan hanya setingkat diatas bahasa mesin (Machine Language).

2. Mengapa Assembly?
----------------------
Assembly memiliki kelebihan yang tidak dapat digantikan oleh bahasa pemrogaman manapun. Diantaranya adalah :
- Hasil program memiliki tingkat kecepatan yang tinggi.
- Ukuran dari program kecil.
- Sangat mudah untuk mengakses Sistem Komputer.

3. Apakah Segment dan Offset itu?
-----------------------------------
Segment dan Offset merupakan suatu angka 16 bit (direpresntasikan dalam bilangan hexa) yang menunjukkan suatu alamat tertentu di memory komputer. Pasangan segment : offset ini disebut juga alamat relatif. Selain alamat relatif, terdapat juga alamat mutlak berupa angka 20 bit (juga direpresentasikan dalam bilangan hexa). Alamat mutlak ini dapat dihitung dengan mengalikan segment dengan 10 hexa dan ditambahkan dengan offset.
Contoh : segment : offset
0100 : 1234
Alamat relatifnya adalah : 02234

4. Apakah Interrupt itu?
--------------------------
Interrupt adalah permintaan kepada microprocessor untuk melakukan suatu perintah. Ketika terjadi permintaan interupsi, microprocessor akan mengeksekusi interrupt handler , yaitu suatu program yang melayani interupsi. Setitap interrupt handler itu memiliki alamat masing - masing yang disimpan dalam bentuk array yang masing - masing terdiri dari 4 byte (2 offset dan 2 segment). Array ini disebut vektor interupsi . Vektor interupsi ini disusun berdasarkan nomor interupsi yaitu dari hexa. Selain itu, dikenal juga istilah service dan subservice, maksudnya adalah bahwa setiap interrupt itu dibagi menjadi beberapa bagian yang mempunyai tugas masing - masing. Tetapi ada juga interrupt yang tidak memiliki service, contohnya int 29.

5. Apakah Register itu?
-------------------------
Register adalah merupakan sebagian memory dari microprocessor yang neniliki kecepatan sangat tinggi. Dapat juga dianalogikan bahwa register merupakan kaki tangan dari microprocessor.

Register dibagi menjadi lima bagian besar yaitu :
1. Segment Register (16 bit)
Register untuk menunjukkan alamat dari suatu segment. Yang termasuk register segment :
. CS (Code Segment)
Menunjukkan alamat segment dari program yang sedang aktif.
. DS (Data Segment)
Menunjukkan alamat segment dari data program (variabel).
. SS (Stack Segment)
Menunjukkan alamat segment dari stack yang digunakan program.
. ES (Extra Segment)
Merupakan register segment cadangan.

2. Pointer dan Index Register (16 bit) Register untuk menunjukkan alamat dari suatu offset.
Yang termasuk register pointer dan index :
. SP (Stack Pointer)
Berpasangan dengan SS (SS : SP).
. BP (Base Pointer)
Berpasangan dengan SS (SS : BP).
. DI (Destination Index)
Berpasangan dengan ES (ES : DI). Dipakai untuk operasi string.
. SI (Source Index)
Berpasangna dengan DS (DS : SI). Dipakai untuk operasi string.

3. General Purpose Register (16 bit)
Register ini dapat digunakan untuk berbagai keperluan, tetapi masing - masing juga memiliki fungsi khusus. Jenis register ini memiliki ciri khas, yaitu dapat dibagi lagi menjadi register 8 bit, register tinggi/high, dan register rendah/low.
Yang termasuk register general purpose :
. AX --> AH|AL (Accumulator)
Untuk menangani operasi arithmatika.
. BX --> BH|BL (Base)
Untuk menunjukkan alamat offset.
. CX --> CH|CL (Counter)
Untuk looping, menunjukkan berapa kali looping terjadi.
. DX --> DH|DL (Data)
Untuk menampung sisa pembagian bilangan 16 bit.

4. Index Pointer Register (16 bit)
Hanya terdiri dari 1 register yaitu IP yang berpasangan dengan reguster CS (CS : IP) untuk menunjukkan alamat instruksi selanjutnya yang akan dieksekusi.

0125. Flags Register (1 bit)
Register ini berfungsi untuk menunjukkan suatu kondisi (ya atau tidak).
Register ini hanya bernilai 0 dan 1.
Yang termasuk register flags :
. OF (Overflow Flag) 1 jika terjadi overflow
. SF (Sign Flag) 1 jika digunakan bilangan bertanda
. ZF (Zero Flag) 1 jika hasil operasi bernilai 0
. CF (Carry Flag) 1 jika operasi menghasilkan carry
. PF (Parity Flag) 1 jika hasil operasi bilangan genap
. DF (Direction Flag) 1 jika alur proses alur proses menurun pada string
. IF (Interrupt Flag) 1 jika proses dapat diinterupsi
. TF (Trap Flag) 1 jika dapat ditrace / debug
. AF (Auxiliary Flag) digunakan pada operasi bilangan BCD
. NT (Nested Task) digunakan untuk menangani interupsi beruntun
. IOPL (I/O Protection Level) digunakan untuk mode proteksi (2 bit)

6. Bagaimana memulai Assembly?
---------------------------------
Bahasa assembly tidak seperti bahasa tingkat tinggi (High Level Language) yang biasanya memiliki IDE - Integrated Development Environment, bahasa assembly dapat diketikkan dalam berbagai macam editor teks, misalnya BC, TC, TURBO, NOTEPAD, EDIT, dan editor teks lainnya. Yang perlu diingat bahwa ekstensi dari program assembly haruslah .ASM. Setelah program assembly diketikkan dan disimpan dengan ekstensi .ASM, maka program tersebut harus dikompilasi menjadi Object File berekstensi .OBJ, dan kemudian harus dilink menjadi executable file (.EXE/.COM), executable file inilah yang baru dapat dijalankan.

Untuk mengcompile : C:\TASM
Untuk melink : C:\LINK
C:\Option /t untuk melink file ke .COM
C:\Untuk melink menjadi .EXE, hilangkan option /t ini.
atau pake cara langsung :

7. Apakah Perbedaan .COM dan .EXE?
------------------------------------
Perbedaan program .COM dan .EXE adalah :
Program .COM Program .EXE
- Hanya menggunakan 1 segment untuk º - Menggunakan banyak segment.
- code, data, dan stack. º
- Ukuran program relatif kecil º - Ukuran program relatif besar
- Hasil program lebih cepat º - Hasil program lebih lambat
- Hanya dapat menangani program kecil º - Dapat menangani program yang besar(<=64 KByte).


8. Bagaimana Struktur Program .COM?
-------------------------------------
Untuk .COM dan .EXE memiliki struktur program yang berbeda, untuk kesempatan ini hanya akan dibahas struktur program .COM.
Berikut ini struktur program .COM (tanda ; adalah untuk komentar) :
nama_segment segment ; nama_segment diisi terserah anda
; Baris ini untuk memberikan nama sebuah segment
assume cs : nama_segment ; Menunjukkan CS ke segment yang sudah kita beri nama
org 100h ; Untuk PSP - Program Segment Prefix
; PSP ini digunakan untuk berhubungan dengan DOS
label_pertama : ; Di Assembly, minimal harus ada satu label,
; penamaan label terserah anda
mov ah,04ch ; service
int 21h ; int 21h service 04ch merupakan instruksi untuk
; keluar dari program
nama_segment ends ; Akhir dari sebuah segment
end label_pertama ; Label yang paling pertama harus ditutup dengan perintah ini

9. Bagaimana Variabel dalam Assembly?
--------------------------------------
Dalam assembly dikenal beberapa jenis data, yaitu :
- db (define byte) --> Besarnya 1 byte (0h - FFh)
- dw (define word) --> Besarnya 2 byte (0h - FFFFh)
- dd (define double word) --> Besarnya 4 byte (0h - FFFFFFFFh)
- df (define far word) --> Besarnya 6 byte (0h - FFFFFFFFFFFFh)
- dq (define quad word) --> Besarnya 8 byte (0h - FFFFFFFFFFFFFFFFh)
- dt (define temp word) --> Besarnya 10 byte (0h - FFFFFFFFFFFFFFFFFFFFh)

10. INT, MOV, JMP, dan LEA
----------------------------
INT
---
INT adalah perintah untuk melaksanakan suatu interupsi.
Syntaxnya adalah : INT no_interupsi
Contoh : INT 20h ; untuk program terminate

MOV
---
mOV adalah perintah untuk mengisi nilai ke register, variabel, atau alamat memory tertentu.
Syntaxnya adalah :MOV destination,source
Contoh : MOV AX,5 ; nilai AX akan berisi 5

JMP
---
JMP adalah perintah untuk melakukan lomptan ke label tertentu.
Syntaxnya adalah : JMP nama_label
Contoh : JMP label1 ; Program akan melompat ke label1

LEA
---
LEA adalah perintah untuk mendapatkan alamat dari sebuah variabel.
Syntaxnya adalah : LEA variabel
Contoh : lea si,bil1 ; si akan berisi offset bil1

11. Tambahan
--------------
Beberapa hal penting yang perlu diingat :
. Bagian deklarasi variabel tidak boleh dijalankan, harus dilewati dengan melakukan lompatan ke label setelahnya.
. Semua perintah assembly yang membutuhkan 2 operand seperti MOV memiliki syarat sebagai berikut :
- Kedua operand besarnya harus sama.
Contoh : MOV ax,bl ; ini salah karena AX 16 bit dan bl 8 bit
MOV al,bl ; ini benar, AL dan BL besarnya 8 bit
- Kedua operand tidak boleh keduanya variabel
Contoh :
MOV a,b ; ini salah, kedua operand a dan b adalah variabel
MOV al,b ; kedua perintah ini untuk menggantikan perintah
MOV a,al ; yang salah diatas
- Register segment tidak boleh diisi langsung, harus menggunakan perantara
Contoh :
MOV es,0b800h : salah, es tidak boleh diisi langsung
MOV ax,0b800h ; kedua perintah ini untuk menggantikan perintah
MOV es,ax ; yang salah diatas
. Untuk intterupt, ingatlah bahwa setiap interrupt memiliki syarat - syarat sebelum dipanggil. Penuhi syarat - syarat itu sebelum melakukan intterupt.

12. Contoh Program Sederhana
------------------------------
Program berikut ini akan membersihkan layar, kemudian akan muncul sebuah kalimat dan akan diminta untuk memasukkan sebuah karakter. Kemudian akan ditampilkan lagi sebuah kalimat diikuti dengan karakter yang tadi dimasukkan. code segment
assume cs : code
org 100h

begin : jmp start
kal1 db 'Masukkan sebuah karakter : $'
kal2 db 10,13,'Karakter yang anda masukkan adalah : $'
kar db ?

start : mov ah,0
mov al,3h
int 10h
mov ah,9h
lea dx,kal1
int 21h
12mov ah,1h
int 21h
mov kar,al
mov ah,9h
lea dx,kal2
int 21h
mov al,kar
int 29h
mov ah,4ch
int 21h
code ends
end begin

Simpanlah program diatas dengan ekstensi .asm (misal test.asm), kemudian compile program tersebut dengan perintah :
tasm
misal : tasm test.asm
Maka akan dihasilkan sebuah object file berekstensi .obj, kemudian link file tersebut dengan perintah :
tlink /t
misal : tlink /t test.obj
Maka akan dihasilkan sebuah file berekstensi .com, cobalah jalankan !

Penjelasan :
- Perhatikan baris begin : jmp start, karena baris berikutnya adalah deklarasi variabel, maka harus dilewati dengan perintah jmp start (melompat ke label start).
- Pada baris kal1 db 'Mas..... $' disini kita mendeklarasikan sebuah variabel untuk pencetakan string, ingatlah selalu untuk menambahkan tanda '$' diakhir sebuah string.
- Pada baris kal2 db 10,13,'... $' sama seperti baris sebelumnya, tetapi disini kita menambahkan 2 karakter, karakter 10 untuk turun baris, karakter 13 untuk memindahkan kursor ke awal baris.
- Pada barus start : mov ah,0 sampai baris int 10h, disini kita melakukan interupsi 10h service 0h, yaitu untuk mengganti modus layar, al berisi 3 berarti modusnya adalah teks 80 x 25. Efek yang terjadi adalah layar akan bersih.
- Pada baris mov ah,9 sampai baris int 21h (2 baris dibawahnya), kita melakukan int 21h service 9h, yaitu untuk mencetak sebuah string. Register dx harus berisi alamat dari string yang akan dicetak.
- Pada baris mov ah,1h sampai baris mov kar,al, kita menggunakan int 21h service 01h, yaitu untuk meminta input 1 karakter dan ditampilkan ke layar. Karakter yang diinput akan berada pada register al setelah interupsi dilakukan, maka kita isikan ke variabel kar dengan perintah mov kar,al
- Selanjutnya pada baris mov al,kar dan int 29h, kita menggunakan int 29h yang tidak memiliki service, fungsinya untuk mencetak 1 karakter yang ada pada register al.


note : untuk melihat nomor-nomor service-service yang terdapat pada komputer gunakan program Helppc


Chapter 1 : Struktur Program COM
Compiler Assembly sudah banyak tersedia di internet, contohnya TASM (Turbo Assembler), MASM (Microsoft Assembler), NASM (Netwide Assembler), dan lain-lain.

Mengapa menggunakan bahasa Assembly?

1. Cepat, Lebih cepat dari compiler lainnya.

2. Lebih dekat dengan bahasa mesin, disebabkan bahasa Assembly dialamatkan 1:1 dengan bahasa mesin.

3. Kode yang dihasilkan lebih kecil dari compiler lainnya.

4. Dapat mengakses hardware lebih luas.

Salah satu bentuk program yang dapat dihasilkan oleh compiler Assembly adalah file COM.
FIle COM adalah struktur program paling sederhana. Ada beberapa syarat dalam pembuatan atau penggunaan file COM :

1. Kode dan data program harus tidak lebih besar dari 64 KB.

2. Tidak dapat memesan alamat memori melalui sistem operasi.

Contoh bentuk kode program COM, ketiklah di teks editor yang dapat menghasilkan file ASCII murni seperti Notepad, vi, atau lainnya. Simpan dengan nama COBAASM.ASM.

Versi TASM :
----------------------------------
ideal
p386n
model tiny

codeseg
org 100h
jmp start
;tempat data dan subrutin

start:
mov ax, 4c00h
int 21h
end
----------------------------------
Versi MASM :
----------------------------------
.386
.model tiny

.code
org 100h
entry:
jmp start
;tempat data dan subrutin

start:
mov ax, 4c00h
int 21h
end entry
----------------------------------

Compile-lah dengan perintah TASM.EXE COBAASM.ASM lalu dikuti dengan perintah TLINK.EXE /T COBAASM.OBJ, jika menggunakan compiler TASM. Untuk compiler MASM gunakan perintah ML COBAASM.ASM. Jika tak ada error, maka akan terlihat output seperti ini :

E:\PUSHM0~1\TASM3>tasm.exe cobaasm.asm
Turbo Assembler Version 3.0 Copyright (c) 1988, 1991 Borland International
Assembling file: cobaasm.asm
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 460k

File yang dihasilkan dari proses kompilasi adalah file OBJ. Untuk merubah file OBJ ini menjadi sebuah file EXE atau COM kita perlu melakukan "linking" dengan program linker. Disini kita menggunakan TLINK.exe.

E:\PUSHM0~1\TASM3>tlink.exe /t cobaasm.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International

Argumen /t pada tlink.exe berarti kita ingin membuat file COM dari file .obj yang dihasilkan oleh compiler. Sedangkan untuk membuat file EXE tidak perlu mengikutkan argumen /t.
Jalankan program COM tersebut :

E:\PUSHM0~1\TASM3>cobaasm.com

Apa yang terjadi? Tentunya tidak terjadi apa-apa karena kita belum menuliskan perintah untuk program tersebut. Jadi program cobaasm.com tersebut hanya diload ke memory lalu terminate dengan sendirinya.

Apa sih arti dari kode-kode diatas? lalu apa perbedaan antara kode yang ditulis untuk compiler TASM dengan MASM?
berikut adalah penjelasan lengkapnya...

1. Perintah "ideal" berarti kita menggunakan syntax ideal dalanm compiler TASM.

2. Perintah "p386n" atau ".386" berarti kita menggunakan intruksi prosesor 80386.

3. Perintah "model tiny" atau ".tiny" berarti kita ingin menggunakan format file COM.

4. Perintah "codeseg" atau ".code" adalah awal dari kode program kita.

5. Perintah "org 100h" berarti program kita akan dimulai dari offset 100h.

6. Dalam compiler MASM kita perlu mendeklarasikan entry point untuk program, disini kita gunakan label "entry:".
Perlu diketahui kalau deklarasi sebuah label : "nama_label:".

7. Program COM selalu diawali dengan "peloncatan" atau "jump" ke awal kode program. Perintah yang digunakan adalah "jmp" diikuti dengan nama label, misalnya "start". Bila diperhatikan, diantara perintah "jmp start" dan label "start" adalah tempat dimana kita bisa deklarasikan variabel-variabel ataupun data-data yang digunakan dalam program kita.

8. Untuk mengakhiri jalannya program, kita perlu membuat suatu perintah. Perintah "end" atau "end entry" disini hanya menunjukkan akhir dari kode program, bukan untuk MENGAKHIRI proses. 2 perintah yang digunakan adalah :

MOV AX, 4c00h
int 21h

Perintah MOV adalah perintah untuk menyalin isi data atau register ke suatu register lain. Bentuk umum perintah MOV :

MOV tujuan_salin, asal_salin

Pada perintah diatas kita akan menyalin atau lebih tepatnya "mengisi" register AX (lebih dikenal dengan register akumulator 16 bit) dengan bilangan heksa 4c00.
Sedangkan perintah INT 21h berarti kita menjalankan interrupt sistem dengan fungsi 21h.