Jumat, 07 Desember 2012

Mengenal Assembly

Bahasa Assembly (Assembler) adalah bahasa pemrograman yang tergolong dalam Bahasa Pemrogaman Tingkat Rendah (Low Level Language) dan hanya setingkat diatas bahasa mesin (Machine Language).

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.

Dalam sssembly,anda akan mengenal Segment dan Offset,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

Interrupt dalam assembly adalah permintaan kepada microprocessor untuk melakukan suatu perintah. Ketika terjadi permintaan interupsi, microprocessor akan mengeksekusi interrupt handler , yaitu suatu program yang melayani interupsi.

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

Register dalam assembly 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)

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.
namun sekarang IDE untuk assembly bermacam-macam,satu yang paling saya sukai yaitu RadASM.. ^_^

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

Contoh Program
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
Bahasa rakitan atau lebih umum dikenal sebagai Assembly adalah bahasa pemrograman tingkat rendah yang digunakan dalam pemrograman komputer, mikroprosesor, pengendali mikro, dan perangkat lainnya yang dapat diprogram. Bahasa rakitan mengimplementasikan representasi atas kode mesin dalam bentuk simbol-simbol yang secara relatif lebih dapat dipahami oleh manusia. Berbeda halnya dengan bahasa-bahasa tingkat tinggi yang berlaku umum, bahasa rakitan biasanya mendukung secara spesifik untuk suatu ataupun beberapa jenis arsitektur komputer tertentu. Dengan demikian, portabilitas bahasa rakitan tidak dapat menandingi bahasa-bahasa lainnya yang merupakan bahasa pemrograman tingkat tinggi. Namun demikian, bahasa rakitan memungkinkan programmer memanfaatkan secara penuh kemampuan suatu perangkat keras tertentu yang biasanya tidak dapat ataupun terbatas bila dibuat dengan menggunakan bahasa pemrograman tingkat tinggi.
Pada bahasa rakitan, programmer umumnya menggunakan sebuah program utilitas yang disebut sebagai perakit (bahasa Inggris: assembler) yang digunakan untuk menerjemahkan kode dalam bahasa rakitan tersebut ke dalam kode mesin untuk perangkat keras tertentu. Sebuah perintah dalam bahasa rakitan biasanya akan diterjemahkan menjadi sebuah instruksi mnemonic dalam kode mesin, berbeda halnya dengan kompiler pada bahasa pemrograman tingkat tinggi yang menerjemahkan sebuah perintah menjadi sejumlah instruksi dalam kode mesin.
Beberapa perangkat lunak bahasa rakitan terkenal biasanya menyediakan tambahan fitur untuk memgasilitasi proses pengembangan program, mengontrol proses perakitan, dan alat bantu debugging.

ALASAN ALASAN MENGGUNAKAN BAHASA RAKITAN
Ada beberapa dasar alasan menggunakan bahasa rakitan dilihat dari sudut pandang penggunaannya:
Bahasa rakitan dibandingkan dengan bahasa mesin, bahasa rakitan merupakan representasi atas bahasa mesin yang dirancang agar lebih mudah dipahami oleh manusia. Dengan menggunakan bahasa rakitan, seorang programmer dapat lebih mudah mengingat instruksi-instruksi dengan menggunakan simbol yang lebih dapat dimengerti dibandingkan bila menggunakan simbol mnemonic kode mesin secara langsung. Demikian halnya pula dengan mekanisme lompatan yang umum terdapat dalam bahasa mesin yang biasanya menggunakan alamat memori, programmer dapat lebih mudah menggunakan fasilitas labeling yang terdapat bahasa rakitan dibandingkan menggunakan alamat memori tertentu dalam kode mnemonic.
Bahasa rakitan dibandingkan dengan bahasa tingkat tinggi, bahasa rakitan memungkinkan programmer untuk mengontrol serta memanfaatkan secara penuh kapabilitas yang terdapat atas suatu perangkat keras, berbeda halnya dengan bahasa pemrograman tingkat tinggi yang memiliki banyak keterbatasan dalam pemanfaatan secara penuh suatu perangkat keras. Bahasa rakitan menjanjikan tingkat unjuk kerja yang maksimum karena sifatnya yang menerjemahkan secara langsung instruksi rakitan menjadi instruksi mesin, berbeda halnya dengan bahasa pemrograman tingkat tinggi yang biasanya menerjemahkan sebuah instruksi menjadi sejumlah kode mesin.
[sunting] Representasi kode mesin
Bahasa rakitan menerjemahkan sebuah instruksi rakitan menjadi instruksi mesin, umumnya mekanisme penerjemahan ini bersifat 1-1, karenanya dapat disebutkan pula bahwa setiap instruksi dalam bahasa rakitan merupakan representasi dari instruksi kode mesin.
Sebagai contoh, berikut adalah instruksi yang digunakan pada prosesor x86 untuk memindahkan nilai 97 sebesar 8-bit ke dalam register prosesor AL. Kode biner atas instruksi pemindahan adalah 10110 diikuti dengan 3-bit pengenal atas register yang akan digunakan. Pengenal atas register AL dalam hal ini adalah 000. Kemudian, nilai 97 dalam kode biner adalah 01100001, sehingga kode mesin yang digunakan untuk memindahkannya adalah sebagai berikut:[1]
10110000 01100001
Kode biner ini dapat diubah agar lebih mudah dibaca manusia dengan mengkonversikannya dalam bilangan heksadesimal sebagai berikut:
B0 61
Pada instruksi diatas, B0 berarti: ‘Pindahkan nilai berikut ke register AL’, dan 61 adalah representasi bilangan heksadesimal untuk nilai 01100001, atau 97 dalam bilangan desimal. Bahasa rakitan untuk prosesor Intel menyediakan simbol mnemonic MOV (yang merupakan singkatan dari move) untuk instruksi serupa sehingga kode mesin sebelumnya dapat ditulis dalam bahasa rakitan sebagai berikut:
MOV AL, 61h       ; Isi register AL dengan nilai 97 (61h)
Bahasa rakitan memungkinkan programmer menambahkan komentar atas setiap instruksi yang ditulis untuk mempermudah pembacaan dan lebih mudah pemahamannya

Tidak ada komentar:

Posting Komentar