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
katakata biasa seperti Move, Add, Increment, dan Branch,
untuk
instruksi
operasi yang menyatakan pola kode biner yang
sesuai. Pada saat menulis
program
untuk komputer tertentu, katakata 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.