STRUKTUR PROGRAM ASSEMBLY
Oleh: Budhy Susanto
Sarana yang ada dalam program assembly
sangat minim, tidak seperti dalam bahasa pemrograman tingkat atas (high level
language programming) semuanya sudah siap pakai. Penulis program assembly harus
menentukan segalanya, menentukan letak program yang ditulisnya dalam memori-program,
membuat data konstan dan tablel konstan dalam memori-program, membuat variabel
yang dipakai kerja dalam memori-data dan lain sebagainya.
Program sumber assembly
Program-sumber assembly (assembly
source program) merupakan kumpulan dari baris-baris perintah yang ditulis
dengan program penyunting-teks (text editor) sederhana, misalnya program
EDIT.COM
dalam DOS,
atau program
NOTEPAD dalam Windows. Kumpulan baris-printah tersebut biasanya
disimpan ke dalam file dengan nama ekstensi
*.ASM atau
nama lain misalnya
*.A51 dan lain sebagainya, tergantung pada program Assembler yang
akan dipakai untuk mengolah program-sumber assembly tersebut.
Setiap baris-perintah merupakan sebuah
perintah yang utuh, artinya sebuah perintah tidak mungkin dipecah menjadi lebih
dari satu baris. Satu baris perintah bisa terdiri atas 4 bagian, bagian pertama
dikenali sebagai label atau sering juga disebut sebagai symbol,
bagian kedua dikenali sebagai kode operasi, bagian ketiga adalah
operand dan bagian terakhir adalah komentar.
Antara bagian-bagian tersebut dipisahkan
dengan sebuah spasi atau tabulator.
Bagian label
Label dipakai untuk memberi nama pada
sebuah baris-perintah, agar bisa mudah menyebitnya dalam penulisan program.
Label bisa ditulis apa saja asalkan diawali dengan huruf, biasa panjangnya
tidak lebih dari 16 huruf. Huruf-huruf berikutnya boleh merupakan angka atau
tanda titik dan tanda garis bawah. Kalau sebuah baris-perintah tidak memiliki
bagian label, maka bagian ini boleh tidak ditulis namun spasi atau
tabulator sebagai pemisah antara label dan bagian berikutnya
mutlak tetap harus ditulis.
Dalam sebuah program sumber bisa terdapat
banyak sekali label, tapi tidak boleh ada label yang kembar.
Sering sebuah baris-perintah hanya terdiri
dari bagian label saja, baris demikian itu memang tidak bisa dikatakan
sebagai baris-perintah yang sesungguhnya, tapi hanya sekedar memberi nama pada
baris bersangkutan.
Bagian label sering disebut juga
sebagai bagian symbol, hal ini terjadi kalau label tersebut tidak
dipakai untuk menandai bagian program, melainkan dipakai untuk menandai bagian
data.
Bagian kode operasi
Kode operasi (operation code
atau sering disingkat sebagai OpCode) merupakan bagian perintah yang
harus dikerjakan. Dalam hal ini dikenal dua macam kode operasi, yang
pertama adalah kode-operasi untuk mengatur kerja mikroprosesor /
mikrokontroler. Jenis kedua dipakai untuk mengatur kerja program assembler,
sering dinamakan sebagai assembler directive.
Kode-operasi ditulis dalam bentuk
mnemonic, yakni bentuk singkatan-singkatan yang relatip mudah diingat,
misalnya adalah
MOV,
ACALL,
RET dan
lain sebagainya. Kode-operasi ini ditentukan oleh pabrik pembuat
mikroprosesor/mikrokontroler, dengan demikian setiap prosesor mempunyai
kode-operasi yang berlainan.
Kode-operasi berbentuk mnemonic
tidak dikenal mikroprosesor/mikrokontroler, agar program yang ditulis dengan
kode mnemonic bisa dipakai untuk mengendalikan prosesor, program semacam
itu diterjemahkan menjadi program yang dibentuk dari kode-operasi kode-biner,
yang dikenali oleh mikroprosesor/mikrokontroler.
Tugas penerjemahan tersebut dilakukan oleh
program yang dinamakan sebagai Program Assembler.
Di luar kode-operasi yang ditentukan pabrik
pembuat mikroprosesor/mikrokontroler, ada pula kode-operasi untuk
mengatur kerja dari program assembler, misalnya dipakai untuk menentukan letak
program dalam memori (ORG),
dipakai untuk membentuk variabel (DS),
membentuk tabel dan data konstan (DB,
DW) dan
lain sebagainya.
Bagian
operand
Operand merupakan pelengkap bagian
kode operasi, namun tidak semua kode operasi memerlukan operand,
dengan demikian bisa terjadi sebuah baris perintah hanya terdiri dari kode
operasi tanpa operand. Sebaliknya ada pula kode operasi yang
perlu lebih dari satu operand, dalam hal ini antara operand satu
dengan yang lain dipisahkan dengan tanda koma.
Bentuk operand sangat bervariasi, bisa berupa
kode-kode yang dipakai untuk menyatakan Register dalam prosesor, bisa
berupa nomor-memori (alamat memori) yang dinyatakan dengan
bilangan atau pun nama label, bisa berupa data yang siap
di-operasi-kan. Semuanya disesuaikan dengan keperluan dari kode-operasi.
Untuk membedakan operand yang berupa
nomor-memori atau operand yang berupa data yang siap
di-operasi-kan, dipakai tanda-tanda khusus atau cara penulisan yang
berlainan.
Di samping itu operand bisa berupa
persamaan matematis sederhana atau persamaan Boolean, dalam hal semacam ini
program Assembler akan menghitung nilai dari persamaan-persamaan dalam
operand, selanjutnya merubah hasil perhitungan tersebut ke kode biner yang
dimengerti oleh prosesor. Jadi perhitungan di dalam operand dilakukan
oleh program assembler bukan oleh prosesor!
Bagian
komentar
Bagian komentar merupakan
catatan-catatan penulis program, bagian ini meskipun tidak mutlak diperlukan
tapi sangat membantu masalah dokumentasi. Membaca komentar-komentar pada setiap
baris-perintah, dengan mudah bisa dimengerti maksud tujuan baris bersangkutan,
hal ini sangat membantu orang lain yang membaca program.
Pemisah bagian komentar dengan bagian
sebelumnya adalah tanda spasi atau tabulator, meskipun demikian
huruf pertama dari komentar sering-sering berupa tanda titik-koma,
merupakan tanda pemisah khusus untuk komentar.
Untuk keperluan dokumentasi yang intensip,
sering-sering sebuah baris yang merupakan komentar saja, dalam hal ini huruf
pertama dari baris bersangkutan adalah tanda titik-koma.
Pembahasan di atas diringkas dalam Gambar
1.

Gambar 1 Program-sumber
assembly
Assembly Listing
Program-sumber assembly di atas, setelah
selesai ditulis diserahkan ke program Assembler untuk diterjemahkan. Setiap
prosesor mempunyai program assembler tersendiri, bahkan satu macam prosesor bisa
memiliki beberapa macam program Assembler buatan pabrik perangkat lunak yang
berlainan.
Hasil utama pengolahan program Assembler
adalah program-obyek. Program-obyek ini bisa berupa sebuah file
tersendiri, berisikan kode-kode yang siap dikirimkan ke memori-program
mikroprosesor/mikrokontroler, tapi ada juga program-obyek yang disisipkan pada
program-sumber assembly seperti terlihat dalam Assembly Listing di Gambar
2.
Bagian kanan Gambar 2 merupakan program-sumber
Assembly karya asli penulis program, setelah diterjemahkan oleh program
Assembler kode-kode yang dihasilkan berikut dengan nomor-nomor memori tempat
penyimpanan kode-kode tadi, disisipkan pada bagian kiri setiap baris perintah,
sehingga bentuk program ini tidak lagi dikatakan sebagai program-sumber
assembly tapi dikatakan sebagai Assembly Listing.
Membaca Assembly Listing bisa memberikan
gambaran yang lebih jelas bagi program yang ditulis, bagi pemula Assembly
Listing memberi pengertian yang lebih mendalam tentang isi memori-program,
sehingga bisa lebih dibayangkan bagaimana kerja dari sebuah program.

Gambar 2
Assembly Listing
Program Obyek format HEX
Selain Assembly Listing, hasil kerja
program Asembler lainnya adalah program obyek yang dipakai untuk
mengendalikan sebuah mikroprosesor/mikrokontroler, program obyek disimpan
dalam file. Terdapat dua macam bentuk file penyimpan program obyek, yang
pertama adalah file yang berisikan kode biner murni, dan yang satu lagi
adalah file biner yang sudah diolah menjadi file teks.
File jenis pertama biasanya dinamakan
sebagai binary object file, biasanya memakai ekstensi *.BIN. File semacam
ini hanya berisikan angka-angka biner yang akan diisikan ke dalam memori tanpa
informasi lain, sehingga selalu dianggap bahwa bahwa file tersebut berisikan
kode-kode biner yang nantinya ditempatkan mulai dari memori nomor 0. Kalau
ternyata kode-kode biner diisikan mulai dari memori nomor
8000h, maka
mulai posisi
0
sampai 7FFFh
akan diisi dengan bilangan biner
00h, baru
setelah itu menyusul kode biner yang sesungguhnya. File semacam ini banyak
dipakai untuk EPROM Programmer model lama.
File jenis kedua dinamakan Hexadecimal
format object file, biasanya memakai ekstensi *.BIN . Data biner dirubah ke
dalam bentuk heksadesimal dan yang disimpan ke dalam file adalah kode ASCII dari
bilangan heksadesimal tersebut. Misalnya data biner
00111010,
atau heksadesimal
3Ah, dituliskan ke dalam file menjai
33h (kode
ASCIInya angka 3) dan
41h (kode
ASCIInya huruf A). Dengan cara ini isi dari file tersebut bisa dengan mudah
dibaca dengan program penyunting teks (text editor) biasa, bahkan bisa di-cetak
di atas kertas seperti terlihat dalam Gambar 3, file semacam itu bisa dibaca
dengan text editor biasa, misalnya
EDIT.COM
dalam DOS, atau
NOTEPAD dalam Windows.
Dalam file
format HEX semacam ini, selain disimpan data biner yang akan diisikan ke ROM,
berisikan pula nomor-nomor memori tempat penyimpanan data biner tersebut. EPROM
programer baru umumnya memakai format file obyek semacam ini.

Gambar 3
Program obyek format HEX
Format HEX dari Intel
Ada beberapa macam format untuk membentuk
file program obyek dengan format HEX (Hexadecimal format object file),
meskipun demikian hanya 2 yang banyak dipakai, yakni format buatan Motorola yang
dinamakan sebagai format S19 dan format buatan Intel yang biasa disebut
sebagai format HEX dari Intel.
Berikut ini adalah pembahasan file program
obyek dengan format HEX dari Intel yang dipakai MCS51, format ini
didefinisikan dalam artikel dari Intel dengan judul Hexadecimal Object File
Format Specification (http://alds.stts.edu/appnote/#MCS51).

Gambar 4 Anatomi
baris-baris dalam file format HEX
File program obyek dengan format HEX
dari Intel berisikan baris-baris tulisan seperti terlihat dalam Gambar 4.
Setiap baris mengandung informasi tentang
berapa banyak data dalam baris tersebut, alamat awal tempat penyimpanan data
dalam baris tersebut, jenis baris dan sarana untuk memastikan kebenaran data
yang dinamakan sebagai check sum. Dalam baris tersebut, setiap huruf (kecuali
huruf pertama) mewakili satu bilangan heksa-desimal, dengan demikian setiap 2
huruf membentuk data satu byte yang terdiri dari 2 bilangan heksadesimal.
Rincian dari format tersebut sebagai
berikut :
1.
Huruf pertama dalam baris, selalu berisi tanda “:”,
merupakan kode identitas yang menyatakan baris tersebut berisikan kode-kode
biner yang disimpan dalam format HEX dari Intel.
2.
Huruf ke-2 dan ke-3
dipakai untuk menyatakan banyaknya data dalam baris yang dinyatakan dengan 2
angka heksa-desimal, sehingga banyaknya data dalam 1 baris maksimal adalah 255 (atau
heksa-demimal FF).
3.
Huruf ke 4 sampai 7,
merupakan 4 angka heksa-desimal yang dipakai untuk menyatakan alamat awal tempat
penyimpanan kode-kode dalam baris teks bersangkutan.
4.
Huruf 8 dan 9 dipakai
untuk menyatakan jenis teks data. Nilai 00 dipakai untuk menyatakan baris
tersebut berisikan data biasa, 01 menyatakan baris tersebut merupakan baris
terakhir.
5.
Huruf ke 10 dan
seterusnya adalah data. Setiap 2 huruf mewakili data 1 byte, sehingga jumlah
huruf pada bagian ini adalah dua kali banyaknya data yang disebut pada butir 2
di atas.
6.
2 huruf terakhir dalam
baris merupakan check sum. Byte-byte yang disebut dalam butir 2 sampai 5
di atas dijumlahkan, hasil penjumlahan di-balik (inverted) sebagai bilangan
check sum. (Hasil penjumlahan bisa menghasilkan nilai yang lebih besar dari
2 bilangan heksadesimal, namun hanya 2 bilangan heksa-desimal yang bobotnya
terkecil yang dipakai).