Bahasa Assembler

Jumat, 20 Januari 2012

Bahasa rakitan
Bahasa rakitan atau lebih umum dikenal sebagai Assembly adalah bahasa pemrograman tingkat rendah yang digunakan dalam pemrograman komputermikroprosesorpengendali 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 Inggrisassembler) 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.

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

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 pemahaman.
1. Definisi Stack
Secara harfiah stack berarti tumpukan, yaitu bagian memori yang digunakan untuk menyimpan nilai suatu register untuk sementara, membentuk tumpukan nilai. Stack dapat dibayangkan sebagai tabung memanjang (seperti tabung penyimpan koin). Sedangkan nilai suatu register dapat dibayangkan sebagai koin yang dapat dimasukkan dalam tabung tersebut. Jika ada data yang disimpan maka data-data tersebut akan bergeser ke arah memori rendah, dan akan bergeser kembali ke arah memori tinggi bila data yang disimpan telah diambil.
2. Perintah Perpindahan Data
Terkait perpindahan data, bahasa assembler mempunyai beberapa perintah yang dapat dibedakan yaitu untuk memindahkan data tunggal seperti huruf atau angka dan untuk memindahkan data string yang berupa deretan huruf. Tetapi di sini hanya akan menjelaskan beberapa perintah yang dipakai dalam aplikasi.
2.1. PUSH/POP
Syntax :

PUSH Reg16Bit
POP Reg16Bit
PUSH adalah perintah penyimpanan data ke memori stack secara langsung, dan untuk mengambil keluar nilai yang disimpan tersebut gunakan perintah POP. Nilai terakhir yang dimasukkan dalam stack, dengan perintah PUSH, akan terletak pada puncak tabung stack. Dan perintah POP pertama kali akan mengambil nilai pada stackyang paling atas kemudian nilai berikutnya, demikian seterusnya. Jadi nilai yang terakhir dimasukkan akan merupakan yang pertama dikeluarkan. Operasi ini dinamakan LIFO (Last In First Out). Perhatikan contoh berikut ini:
push ax;
push bx;
push cx;
mov ax, $31C;
mov bx; $31D;
mov cx, $31E;
pop cx;
pop bx;
pop ax;


2.2. MOV

Syntax :
MOV destination, source
Digunakan untuk menyalin data dari memori/register ke memori/register atau dari data langsung ke register. Nilai pada source yang dipindahkan tidaklah berubah. Pada contoh di bawah, register al diberi nilai $31Ckemudian nilai register al disalin ke register ax. Jadi sekarang nilai register al dan register ax adalah $31C.
mov al, $31C;
mov ax, al;
Hal-hal yang tidak boleh dilakukan dalam penyalinan data:
a. Penyalinan data antarregister segmen (ds, es, cs, ss)
mov ds, es ? tidak dibenarkan
Gunakan register general, misalnya register ax, sebagai perantara
mov ax, es
mov ds, ax
atau gunakan stack sebagai perantara
push es
pop ds
b. Penyalinan data secara langsung untuk register segmen (ds, es, cs, ss)
mov ds, $31C ? tidak dibenarkan
Gunakan register general, misalnya register ax, sebagai perantara
mov ax, $31C
mov ds, ax
c. Penyalinan data langsung antarmemori
mov memB, memA ? tidak dibenarkan
Gunakan register general, misalnya register ax, sebagai perantara
mov ax, memA
mov memB, ax
d. Penyalinan data antarregister general yang berbeda daya tampungnya (8 bit dengan 16 bit) tanpa pointer
mov al, bx ? tidak dibenarkan
2.3. IN/OUT
Syntax :

IN Reg16Bit, port
OUT port, Reg16Bit
Untuk membaca data dari suatu port dan memasukkan nilainya ke dalam suatu register gunakan perintah IN. Dan perintah OUT digunakan untuk memasukkan suatu nilai ke dalam suatu port. Nilai yang akan dimasukkan diberikan pada register al/ax dan alamat port diberikan pada register dx. Pada contoh berikut ini, pertama kaliregister dx disimpan pada stack, menyalin nilai $31E pada register dx kemudian perintah IN akan membaca nilai pada register dx (port bernilai $31E) dan memasukkannya ke dalam register al. Dan terakhir nilai tersebut disalin ke variabel Data.
push dx
mov dx, $31E
in al, dx
mov Data, al
pop dx
Dan contoh berikut untuk memberi nilai ($8A) pada suatu port.
push dx
mov dx, $31E
mov al, $8A
out dx, al
pop dx


3. Operasi Aritmatika


3.1. Penjumlahan
Syntax :
ADD destination, source
ADC destination, source
INC destination
Perintah ADD akan menjumlahkan nilai pada destination dan source tanpa menggunakan carry (ADD), dimana hasil yang didapat akan ditaruh pada destination. Dalam bahasa pascal pernyataan ini sama dengan pernyataan destination := destination + source. Daya tampung destination dan source harus sama misalnya register al (8 bit) dan ah (8 bit), ax (16 bit) dan bx (16 bit). Perhatikan contoh berikut, nilai register ah sekarang menjadi $10 :
mov ah, $5;
mov al, $8;
add ah, al


Perintah ADC digunakan untuk menangani penjumlahan dengan hasil yang melebihi daya tampung destinationyaitu dengan menggunakan carry (ADD), dalam bahasa pascal sama dengan pernyataan destination := destination + source + carry. Misalnya register ax (daya tampung 16 bit) diberi nilai $1234 dan bx (16 bit) diberi nilai $F221, penjumlahan kedua register ini adalah $10455. Jadi ada bit ke 17 padahal daya tampung register bx hanya 16 bit, penyelesaiannya adalah nilai bx = $0455 dengan carry flag = 1.
Perintah INC digunakan untuk operasi penjumlahan dengan nilai 1. Jadi nilai pada destination akan ditambah 1, seperti perintah destination := destination + 1 dalam bahasa Pascal.
3.2. Pengurangan
Syntax :

SUB destination, source
SBB destination, source
DEC destination
Perintah SUB untuk mengurangkan 2 operand tanpa carry flag. Hasilnya diletakkan pada destination dalam bahasa pasca sama dengan pernyataan destination := destination – source. Untuk mengenolkan suatu register, kurangkan dengan dirinya sendiri seperti contoh berikut ini. Pertama kali register ax bernilai $5, kemudian nilai register tersebut dikurangi dengan dirinya sendiri sehingga terakhir nilai register ax adalah 0.
mov ax, $15;
mov bx, $10;
sub ax, bx;
sub ax, ax;
Perintah SBB mengurangkan nilai destination dengan nilai source kemudian dikurangi lagi dengan carry flag (destination := destination – source – carry flag).
Dan perintah DEC untuk mengurangi nilai destination dengan 1.
3.3. Perkalian
Syntax :

MUL source
Digunakan untuk mengalikan data pada accumulator dengan suatu operand dan hasilnya diletak pada register source. Register source dapat berupa suatu register 8 bit (misal bl, bh, dan sebagainya), register 16 bit (bx, dx, dan sebagainya) atau suatu variabel.
3.4. Pembagian
Syntax :

DIV source
Operasi aritmatika ini pada dasarnya sama dengan operasi perkalian