28 Jan 2012

Bahasa Assembly



BAHASA ASSEMBLY
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.

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

Instruksi mesin dinyatakan dengan pola 0 dan l. Pola semacam itu sangat sulit 
untuk dijelaskan pada saat membahas atau menyiapkan program. Oleh karena itu, kita 
menggunakan  nama simbolik untuk menyatakan pola tersebut. Sejauh ini kita telah 
menggunakan  kata­kata  biasa  seperti Move,  Add, Increment, dan Branch, untuk 
instruksi operasi yang  menyatakan  pola  kode  biner  yang sesuai. Pada saat menulis
program untuk komputer tertentu, kata­kata tersebut biasanya diganti dengan akronim 
yang  disebut mnemonic,  seperti MOV, ADD, INC, dan BR Serupa  dengan kita 
menggunakan notasi R3  untuk  mengacu  pada register  3, dan LOC untuk  mengacu 
pada lokasi memori. Set lengkap nama simbolik semacam dan aturan penggunaannya 
 Contoh Program Bahasa Assembly :
.model small
.code
org 100h
mulai :
mov ah, 02h
mov dl, 41h
int 21h
int 20h
end mulai
·         Save dengan nama program1.asm
·         Proses kompilasi 
            C:\TASM\tasm namafile.asm  (proses ini menghasilkan file.OBJ)
·         Proses Linking (proses ini menghasilkan file .COM dan .EXE)
            C:\TASM\tlink namafile.OBJ 
            C:\TASM\tlink /t namafile.OBJ 
·         Menjalankan program
            C:\TASM\namafile
·         Debug program
            C:\TASM\debug namafile.COM
Penjelasan Program
.model small             : bentuk memori yang akan digunakan oleh program
.code                          : bahwa kita akan mulai menggunakan code segmennya disini
org 100h                    : program pada saat dijalankan disimpan pada alamat offset 100h
mulai :                        : merupakan sebuah label
mov ah, 02h              : isi  register  ah  dengan  nilai  02h,  dimana  02h  ini  merupakan
                                      service untuk menampilkan karakter ke layar.
mov dl, 41h               : isi register dengan nilai 41h, dimana 41h ini adalah karakter ‘A’
int 21h                         : panggil interrupt 21h untuk menjalankan service 02h
int 20h                        : terminasi program
end mulai                  : mengakhiri sebuah label

Assembly AT&T dan NASM
Ada dua sintaks bahasa assembly, yaitu dalam format AT&T dan NASM. Sintaks AT&T banyak dipakai dalam lingkungan GNU seperti GNU Assembler, dan menjadi format default GNU Debugger (GDB). Sedangkan format NASM dipakai oleh netwide assembler dan banyak dipakai di lingkungan windows.
Perlu dicatat bahwa perbedaan NASM dan AT&T ini hanya masalah sintaks saja, keduanya menghasilkan bahasa mesin yang sama persis
Beberapa perbedaan antara format AT&T dan NASM adalah:
§  Baris komentar diawali dengan “;” semicolon untuk NASM. AT&T mengawali komentar dengan # (hash)
§  Dalam format AT&T, setiap register diawali dengan %. NASM tidak menggunakan %.
§  Dalam format AT&T, setiap nilai literal (konstanta) diawali dengan $. NASM tidak menggunakan $.
§  Pada perintah yang menggunakan operand sumber dan tujuan, format AT&T menuliskan tujuan sebagai operand kedua (contoh: CMD <source>,<dest>). Sedangkan NASM menuliskan tujuan sebagai operand pertama (contoh: CMD <dest>,<source>).

Format Program Bahasa Assembly


Program bahasa assembly berisikan :
1. Instruksi – instruksi mesin
2. Pengarah – pengarah assembler
3. Kontrol – kontrol assembler
4. Komentar – komentar
Instruksi – instruksi mesin merupakan mnemonik yang menyatakan suatu instruksi yang bisa dijalankan (misalnya MOV). Pengarah assembler merupakan instruksi keprogram assembler yang mendefinisikan struktur program, simbol – simbol, (menentukan) mode – mode assembler dan aliran assembler langsung (missal STITLE).Komentar perlu dituliskan agar program mudah dibaca, tidak harus perintruksi bisa juga sekumpulan instruksi yang mengerjakan suatu operasi.
Baris – baris program yang mengandung instuksi mesin atau pengarah assembler harus mengikuti aturan program assembler ASM51. masing – masing baris batas beberapa field yang dipisahkan dengan spasi atau tabulasi.
1. Label
Sebuah label mewakili alamat dari suatu nstruksi (data) yang mengikat. Label ini digunakan sebagai operan pada instruksi – instruksi percabangan. (Misal : SJMP TERUS)
2. Mnemonik
Mnemonik instruksi atau pengarah assembler dimasukan dalam “mnemonik field” yang mengikuti “label mnemonik”. Mnemonik instruksi misalnya : ADD, MOV, INC, dan lain – lain.
3. Operan
Operan ditulis setelah mnemonik, bisa berupa alamat atau data yang digunakan instruksi yang bersangkutan. Bisa juga berupa label yang mewakili alamat data atau berupa simbol yang mewakili data konstan.
4. Komentar
Komentar harus diwakili dengan titik koma (;). Sebuah garis akan dianggap sebagai komentar jika diawali dengan titik koma.

5. Simbol – simbol assembler khusus
Simbol – simbol assambler khusus digunakan untuk mode – mode pengalamatan melalui register. Simbol – simbol ini mencakup A, R0 s/d R7, DPTR, C, PC dan AB. Juga tanda dolar yang dapat digunakan untuk menunjuk nilai pecahan program saat itu.
6. Pengalamatan tak langsung
Beberapa instruksi menggunakan operan berupa register yang menyimpan alamat data yang disimpan. Dalam hal ini digunakan tanda “at” yang dapat digunakan bersama dengan R0, R1, DPTR atau PC tergantung dari instruksi yang digunakan.
7. Data langsung
Data – data langsung yang diawali tanda poud dan menyatu dengan instruksi yang bersangkutan.
8. Alamat data
Banyak instruksi – instruksi yang mengakses lokasi – lokasi memori menggunakan pengalamatan langsung dan membutuhkan alamat memori dan internal (00h hingga 7Fh) atau alamat SFR (80h hingga FFh) pada operan.
9. Alamat Bit
Salah satu kelebihan dari mikrokontroller 51 adalah kemampuannya bisa mengakses alamat – alamat perbit tanpa menggunakan cara khusus. Instruksi yang melibatkan lokasi yang teralamati bit harus menyediakan alamat bit dalam memori data internal (00h hingga 7Fh) atau alamat bit di ruang SFR (80h hingga FFh).
10. Alamat Kode
Suatu Alamat kode digunakan dalam operan instruksi lompatan, termasuk lompatan relatif (SJMP dan lompatan bersyarat), lompatan dan call far (LJMP, LCALL).
11. Jump dan Call Jump
ASM51 membolehkan kita untuk menggunakan mnemonik JMP atau CALL yang umum; mnemonik JMP digunakan sebagai wakil dari SJMP, AJMP atau LJMP, sedangkan mnemonik CALL mewakili ACALL atau LCALL.