Bahasa
Assembly merupakan bahasa komputer yang kedudukannya di antara bahasa
mesin dan bahasa level tinggi misalnya bahasa C atau Pascal. Bahasa C
atau Pascal dikatakan sebagai bahasa level tinggi karena memakai
kata-kata dan pernyataan yang mudah dimengerti manusia, meskipun masih
jauh berbeda dengan bahasa manusia sesungguhnya. Bahasa mesin adalah
kumpulan kode biner yang merupakan instruksi yang bisa dijalankan oleh
komputer. Sedangkan bahasa Assembly memakai kode Mnemonic untuk
menggantikan kode biner, agar lebih mudah diingat sehingga lebih
memudahkan penulisan program.
Program yang ditulis dengan bahasa Assembly terdiri dari label; kode
mnemonic dan lain sebagainya, pada umumnya dinamakan sebagai program
sumber (Source Code) yang belum bisa diterima oleh prosesor untuk
dijalankan sebagai program, tapi harus diterjemahkan dulu menjadi bahasa
mesin dalam bentuk kode biner.
Program sumber dibuat dengan program editor biasa, misalnya Notepad pada
Windows atau SideKick pada DOS, selanjutnya program sumber
diterjemahkan ke bahasa mesin dengan menggunakan program Assembler.
Hasil kerja program Assembler adalah “program objek” dan juga “assembly
listing”.
Program Objek berisikan kode kode bahasa mesin, kode-kode bahasa mesin
inilah yang diumpankan ke memori-program prosesor. Dalam dunia
mikrokontroler biasanya program objek ini diisikan ke UV EPROM, dan
khusus untuk mikrokontroler buatan Atmel, program ini diisikan ke dalam
Flash PEROM yang ada di dalam chip AT89C51 atau AT89C2051.
Assembly Listing merupakan naskah yang berasal dari program sumber,
dalam naskah tersebut pada bagian sebelah setiap baris dari program
sumber diberi tambahan hasil terjemahan program Assembler. Tambahan
tersebut berupa nomor memori-program berikut dengan kode yang akan
diisikan pada memori-program bersangkutan. Naskah ini sangat berguna
untuk dokumentasi dan sarana untuk menelusuri program yang ditulis.
Yang perlu diperhatikan adalah setiap prosesor mempunyai konstruksi yang
berlainan, instruksi untuk mengendalikan masing-masing prosesor juga
berlainan, dengan demikian bahasa Assembly untuk masing-masing
prosesor juga berlainan, yang sama hanyalah pola dasar cara penulisan
program Assembly saja.
Gambar 7
Proses Assembly
Konstruksi Program Assembly
Program sumber dalam bahasa Assembly menganut prinsip 1 baris untuk satu
perintah, setiap baris perintah tersebut bisa terdiri atas beberapa
bagian (field), yakni bagian Label, bagian mnemonic, bagian operand
yang bisa lebih dari satu dan terakhir bagian komentar. Untuk
membedakan masing-masing bagian tersebut dibuat ketentuan sebagian
berikut:
# Masing-masing bagian
dipisahkan dengan spasi atau TAB, khusus untuk operand yang lebih dari
satu masing-masing operand dipisahkan dengan koma.
# Bagian-bagian
tersebut tidak harus semuanya ada dalam sebuah baris, jika ada satu
bagian yang tidak ada maka spasi atau TAB sebagai pemisah bagian tetap
harus ditulis.
# Bagian
Label ditulis mulai huruf pertama dari baris, jika baris bersangkutan
tidak mengandung Label maka label tersebut digantikan dengan spasi
atau TAB, yakni sebagai tanda pemisah antara bagian Label dan bagian
mnemonic.
Label mewakili nomor memori-program dari instruksi pada baris
bersangkutan, pada saat menulis instruksi JUMP, Label ini ditulis dalam
bagian operand untuk menyatakan nomor memori-program yang dituju.
Dengan demikian Label selalu mewakili nomor memori-program dan harus
ditulis dibagian awal baris instruksi.
Disamping Label dikenal pula Symbol, yakni satu nama untuk mewakili satu
nilai tertentu dan nilai yang diwakili bisa apa saja tidak harus
nomor memori-program. Cara penulisan Symbol sama dengan cara penulisan
Label, harus dimulai di huruf pertama dari baris instruksi.
Mnemonic (arttinya sesuatu yang memudahkan diingat) merupakan singkatan
perintah, dikenal dua macam mnemonic, yakni manemonic yang dipakai
sebagai instruksi mengendalikan prosesor, misalnya ADD, MOV, DJNZ dan
lain sebagainya. Ada pula mnemonic yang dipakai untuk mengatur kerja
dari program Assembler misalnya ORG, EQU atau DB, mnemonis untuk
mengatur kerja dari program Assembler ini dinamakan sebagai ‘Assembler
Directive’.
Operand adalah bagian yang letaknya di belakang bagian mnemonic,
merupakan pelangkap bagi mnemonic. Kalau sebuah instrksi di-ibaratkan
sebagai kalimat perintah, maka mnemonic merupakan subjek (kata kerja)
dan operand merupakan objek (kata benda) dari kalimat perintah tersebut.
Tergantung pada jenis instruksinya, operand bisa berupa berbagai macam
hal. Pada instruksi JUMP operand berupa Label yang mewakili nomor
memori-program yang dituju misalnya LJMP Start, pada instruksi untuk
pemindahan/pengolahan data, operand bisa berupa Symbol yang mewakili
data tersebut, misalnya ADD A,#Offset. Banyak instruksi yang operandnya
adalah register dari prosesor, misalnya MOV A,R1. Bahkan ada pula
instruksi yang tidak mempunyai operand, misalnya RET.
Komentar merupakan bagian yang sekedar sebagai catatan, tidak
berpengaruh pada prosesor juga tidak berpengaruh pada kerja program
Assembler, tapi bagian ini sangat penting untuk keperluan dokumentasi.
Assembler Directive
Seperti sudah dibahas di atas, bagian Mnemonic dari sebuah baris
perintah bisa merupakan instruksi untuk prosesor, maupun berupa
Assembler Directive untuk mengatur kerja dari program Assembler.
Mnemonic untuk instruksi prosesor, sangat tergantung pada prosesor yang
dipakai, sedangkan mnemonic untuk Assembler Directive tergantung pada
program Assembler yang dipakai. Meskipun demikian, terdapat beberapa
Assembler Directive yang umum, yang sama untuk banyak macam program
Assembler.
Assembler Directive yang bersifat umum tersebut, antara lain adalah
# ORG
– singkatan dari ORIGIN, untuk menyatakan nomor memori yang dipakai
setelah perintah itu, misalnya ORG $1000 maka memori berikutnya yang
dipakai Assembler adalah $1000. ORG berlaku untuk memori program maupun
memori-data. Dalam hal penomoran memori, dikenal tanda $ sebagai
awalan untuk menyatakan nomor memori dari baris bersangkutan. Misalnya :
ORG 1000
LJMP $+1000
Operand $+$500 mempunyai arti nomor memori-program bersangkutan ditambah
dengan $500, karena instruksi LJMP ini terletak persis di bawah ORG
$1000 maka nomor memori-program baris ini adalah $1000, sehingga
operand $+$500 bernilai $1500 dan instruksi ini indentik dengan LJMP
$1500
# EQU – singkatan dari EQUATE, dipakai untuk menentukan nilai sebuah Symbol.
Misalnya Angka88 EQU 88 memberi nilai 88 pada Symbol Angka88, atau CR
EQU $0D mempunyai makna kode ASCII dari CR (Caarriage Return) adalah
$08.
# DB
– singkatan dari DEFINE BYTE, dipakai untuk memberi nilai tertentu
pada memori-program. Nilai tersebut merupakan nilai 1 byte, bisa berupa
angka ataupun kode ASCII. DB merupakan Assembler Directive yang
dipakai untuk membentuk teks maupun tabel.
ORG $0200
STRING DB ‘Atmel AT89C2051’
PANJANG EQU $-STRING
# ORG
$0200 memerintahkan program Assembler agar bekerja mulai dari
memori-program nomor $0200, instruksi selanjutnya memerintahkan program
Assembler agar mengisi memori-program nomor $0200 dan berikutnya
dengan tulisan ‘Atmel AT89C2051’’ (yang diisikan adalah kode ASCII
dari ‘A’, ‘t’ dan seterusnya), PANJANG dari STRING bisa dihitung
dengan cara PANJANG EQU $-STRING, yakni selisih dari nomor
memori-program baris bersangkutan dikurangi dengan nomor awal
memori-program yang diisi STRING.
# DW
– singkatan dari DEFINE WORD, dipakai untuk memberi nilai 2 byte ke
memori-program pada baris bersangkutan. Assembler Directive ini biasa
dipakai untuk membentuk suatu tabel yang isinya adalah nomor-nomor
memori-program.
# DS
– singkatan dari Define Storage, Assembler Directive ini dipakai
untuk membentuk variable. Sebagai variabel tentu saja memori yang
dipakai adalah memori-data (RAM) bukan memori-program (ROM). Hal ini
harus benar-benar dibedakan dengan Assembler Directive DB dan DW yang
membentuk kode di memori-program. Dan karena DS bekerja di RAM, maka DS
hanya sekedar menyediakan tempat di memori, tapi tidak mengisi nilai
pada memori bersangkutan.
berikut contoh sederhana bahasa pemrograman assembly..
.CODE
ORG 100H
AWAL:
MOV CL,30H
JMP PROSES
KAL0 DB 'Ketikkan satu kalimat:$'
KAL1 DB 13,10,'Kalimat yang diinput adalah:$'
KAL2 DB 13,10,'Cetak dari belakang:$',13,10
KAL3 DB 13,10,'panjang string adalah:$'
KALX DB 13,10,'$'
KAL4 DB 13,10,'Jumlah Huruf Vokal:$'
KAL5 DB 13,10,'Jumlah Huruf Konsonan:$'
KATA DB 20,?,20 DUP (?)